为模块声明接口时出现 SystemVerilog 编译错误(未声明的标识符 [12.5(IEEE)])

SystemVerilog compile error when declaring interface for a module (undeclared identifier [12.5(IEEE)])

我正在学习如何使用接口来环绕 SystemVerilog 中的 DUT(顶级模块实体)。因此,为此目的,我提出了一个基本示例,其中 DUT 是一个简单的同步 RAM。

但是,当我尝试编译我的代码时,我收到了接口中声明的和模块中使用的每个信号的错误 ("undeclared identifier [12.5(IEEE)]")。我希望能从这个社区得到宝贵的帮助来理解我的错误。我保持代码简短并希望可读。提前致谢!

我尝试删除参数并将它们转换为固定数字以及使用 define 指令使它们成为全局但没有帮助。事实上,该错误也出现在未参数化的信号(例如 oe 信号)中。


// ********** Define the INTERFACE TO MODULE RAM: **********

interface clocked_bus 
    #(
        // ---------- Parameters definition: ----------
        parameter MEM_WIDTH=16, // word size of the memory
        parameter ADDR_WIDTH=8  // => [2^ADDR_WIDTH locations]
    )

    (
        // ---------- I/Os declaration: ----------
        input clk
    );

    // ---------- Ports declaration: ----------
    logic wr_rd_n_en, oe;
    logic [MEM_WIDTH-1:0] data_out;
    logic [2**ADDR_WIDTH-1:0] addr;
    logic [MEM_WIDTH-1:0] data_in;

endinterface




// ********** Define the MODULE RAM: **********

module RAM(input clk, clocked_bus cb);

    // ---------- CREATION OF MEM MATRIX: ----------
    logic [MEM_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0];

    // ---------- BEHAVIORAL ARCHITECTURE DEFINITION: ----------
    always_ff@(posedge clk)
    begin
        if (wr_rd_n_en == 0)
            if (oe ==1)
                data_out <= mem[addr];
        else
            mem[addr] <= data_in;
    end
endmodule



// ********** Define the MODULE RAM: **********

module top;
    // Define the clock as 'free running process':
    logic clk = 0;
    always #10 clk = !clk;

    // Instantiate the Interface:
    clocked_bus  #(.MEM_WIDTH(16), .ADDR_WIDTH(8)) cb(clk);

    // Instantiate the DUT:
    RAM mem1(clk, cb);

endmodule

我希望编译但是我收到以下错误:

    interface worklib.clocked_bus:sv
        errors: 0, warnings: 0
    logic [MEM_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0];
                                           |
xmvlog: *E,UNDIDN (lab.sv,31|43): 'ADDR_WIDTH': undeclared identifier [12.5(IEEE)].
    logic [MEM_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0];
                   |
xmvlog: *E,UNDIDN (lab.sv,31|19): 'MEM_WIDTH': undeclared identifier [12.5(IEEE)].
        if (wr_rd_n_en == 0)
                     |
xmvlog: *E,UNDIDN (lab.sv,36|21): 'wr_rd_n_en': undeclared identifier [12.5(IEEE)].
            if (oe ==1)
                 |
xmvlog: *E,UNDIDN (lab.sv,37|17): 'oe': undeclared identifier [12.5(IEEE)].
                data_out <= mem[addr];
                       |
xmvlog: *E,UNDIDN (lab.sv,38|23): 'data_out': undeclared identifier [12.5(IEEE)].
                data_out <= mem[addr];
                                   |
xmvlog: *E,UNDIDN (lab.sv,38|35): 'addr': undeclared identifier [12.5(IEEE)].
            mem[addr] <= data_in;
                   |
xmvlog: *E,UNDIDN (lab.sv,40|19): 'addr': undeclared identifier [12.5(IEEE)].
            mem[addr] <= data_in;
                               |
xmvlog: *E,UNDIDN (lab.sv,40|31): 'data_in': undeclared identifier [12.5(IEEE)].
    module worklib.RAM:sv
        errors: 8, warnings: 0
    module worklib.top:sv
        errors: 0, warnings: 0

在接口内部访问变量和参数时,应使用接口名称来表示它们。接口通过封装这些功能来提供命名空间功能。您的 RAM 代码应如下所示:

module RAM(input clk, clocked_bus cb);
  // ---------- CREATION OF MEM MATRIX: ----------
  logic [cb.MEM_WIDTH-1:0] mem [2**cb.ADDR_WIDTH-1:0];
  // ---------- BEHAVIORAL ARCHITECTURE DEFINITION: ----------
  always_ff@(posedge clk)
  begin
     if (cb.wr_rd_n_en == 0)
        if (cb.oe ==1)
          cb.data_out <= mem[cb.addr];
        else
          mem[cb.addr] <= cb.data_in;
     end
endmodule