我正在尝试为简单的 PISO 寄存器设计编写一个测试平台。在测试平台和设计中,我使用一个接口来封装所有进出设计的信号(使用用于 TB 和 DUT 的 modport)。但是,当我用 icarus-verilog 编译它时,我收到以下错误:
iverilog -g2012 piso_tb.sv
./piso.sv:25: syntax error
./piso.sv:1: Errors in port declarations.
piso_tb.sv:9: syntax error
piso_tb.sv:9: error: Invalid module instantiation
我尝试将标志更改为 -g2005-sv,但它给出了相同的错误。这是我的设计和 TB 文件:
piso.sv - 设计+界面
interface my_piso;
logic [7:0] din;
logic resetn;
logic dout;
logic din_en;
modport TB (
output din,
output resetn,
input dout,
output din_en
);
modport DUT (
input din,
input resetn,
input din_en,
output dout
);
endinterface
module model (input clk, my_piso piso_if);
reg [7:0] temp;
always @(posedge clk) begin
if(!piso_if.resetn) begin
temp <= 0;
end else begin
if(piso_if.din_en) begin
temp <= piso_if.din;
end else begin
temp <= temp >> 1;
end
end
end
assign piso_if.dout = temp & 1'b1;
endmodule
piso_tb.sv - 测试平台
`include "piso.sv"
module model_tb;
reg clk;
always #5 clk = ~clk;
my_piso piso_if;
model dut(
.clk(clk),
.piso_if(piso_if.DUT)
);
initial begin
$dumpfile("model.vcd");
$dumpvars;
end
initial begin
$display("time\tclk\tresetn\tdin_en\tdin\tdout");
$monitor("%d\t%b\t%b\t%b\t%p\t%b", $time, clk, piso_if.resetn, piso_if.din_en, piso_if.din, piso_if.dout);
end
initial begin
clk <= 0;
piso_if.resetn <= 0;
piso_if.din_en <= 0;
piso_if.din <= 0;
@(posedge clk);
piso_if.resetn <= 1;
piso_if.din_en <= 1;
piso_if.din <= $random;
@(posedge clk);
repeat(10) begin
piso_if.din_en <= 0;
@(posedge clk);
end
$finish;
end
endmodule
我也尝试将接口代码转移到一个单独的文件中,但它给出了相同的错误。我犯了任何语法错误吗?有什么问题吗?
测试平台模块存在语法错误。实例化
interface
时,实例名称后需要有端口列表,就像 module
实例一样。
改变:
my_piso piso_if;
至:
my_piso piso_if ();
端口列表为空是合法的。
但是,这并不能修复您所看到的
iverilog
语法错误。 iverilog
不支持许多 SystemVerilog 功能。如果您想使用此语法,您需要尝试将 iverilog
更新到较新的版本,或使用其他模拟器。 EDAPlayground 网站上还有其他免费模拟器。