使用 SystemVerilog 接口和iverilog 时出错

问题描述 投票:0回答:1

我正在尝试为简单的 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

我也尝试将接口代码转移到一个单独的文件中,但它给出了相同的错误。我犯了任何语法错误吗?有什么问题吗?

verilog system-verilog test-bench iverilog
1个回答
0
投票

测试平台模块存在语法错误。实例化

interface
时,实例名称后需要有端口列表,就像
module
实例一样。

改变:

my_piso piso_if;

至:

my_piso piso_if ();

端口列表为空是合法的。


但是,这并不能修复您所看到的

iverilog
语法错误。
iverilog
不支持许多 SystemVerilog 功能。如果您想使用此语法,您需要尝试将
iverilog
更新到较新的版本,或使用其他模拟器。 EDAPlayground 网站上还有其他免费模拟器。

© www.soinside.com 2019 - 2024. All rights reserved.