【问题标题】:SystemVerilog compile error when declaring interface for a module (undeclared identifier [12.5(IEEE)])为模块声明接口时 SystemVerilog 编译错误(未声明的标识符 [12.5(IEEE)])
【发布时间】:2019-08-18 00:48:09
【问题描述】:

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

但是,当我尝试编译我的代码时,对于接口中声明并在模块中使用的每个信号,我都会收到一个错误(“未声明的标识符 [12.5(IEEE)]”)。我希望得到这个社区的宝贵帮助来理解我的错误。我保持代码简短并希望可读。提前谢谢!

我尝试删除参数并将它们转换为固定数字以及使用定义指令使它们成为全局但没有帮助。事实上,错误也出现在未参数化的信号(例如 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

【问题讨论】:

  • 您的参数是在interface 中定义的,但您正试图在module RAM 中使用它们。果然,它们在那里不为人所知,编译器理所当然地抱怨。

标签: interface verilog system-verilog


【解决方案1】:

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

【讨论】:

  • 非常感谢谢尔盖,我完全错过了这一点!编译器不再抛出这些编译错误,我现在只剩下一个关于“常量表达式 [4(IEEE)] 中不允许分层名称 ('cb.ADDR_WIDTH')”的错误。同样的错误也与 cb.MEM_WIDTH 有关。唯一的方法是将这些定义为常量而不是在接口内部吗?
  • 我认为这是一个节奏问题。 Vcs 和 Aldera 对此表示满意。要解决此问题,我建议您将 RAM 设为参数化模块(与接口相同)并使用相同的参数实例化接口和 RAM。然后在 RAM 中使用模块版本的参数。
猜你喜欢
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 2022-03-09
  • 1970-01-01
相关资源
最近更新 更多