声明模块接口(未声明的标识符[12.5(IEEE)])

时间:2019-08-18 00:48:09

标签: interface verilog system-verilog

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

但是,当我尝试编译代码时,对于在接口中声明并在模块中使用的每个信号,我都会收到一个错误(“未声明的标识符[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

1 个答案:

答案 0 :(得分:2)

在访问接口内部的变量和参数时,应使用接口名称来表示它们。接口通过封装它们来提供名称空间功能。您的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