【问题标题】:Getting an error using parameter in Verilog在 Verilog 中使用参数获取错误
【发布时间】:2021-11-04 10:23:54
【问题描述】:

我不熟悉使用 verilog 来验证记忆。我在测试台中定义了地址宽度和数据宽度作为参数,我在下面这样尝试,这给了我一个错误:

parameter ADDRESS_WIDTH =9

在测试台的下方某处,我正在调用任务:

Read_mode(ADDRESS_WIDTH’134)

我遇到了一个错误。请帮忙。

【问题讨论】:

    标签: verilog test-bench


    【解决方案1】:

    ADDRESS_WIDTH’134 产生语法错误,因为将参数用于数字文字大小是非法的,并且当您使用撇号时,它必须后跟一个基本说明符(例如 h 用于十六进制格式)。此外,您问题中的撇号可能是个问题,具体取决于您如何将其复制并粘贴到编辑器中。

    要将数字文字传递给task,不必指定值的位宽,因为在声明task 输入时可以考虑这一点。您可以使用所需的位宽声明输入,然后仅使用基本说明符传递数值,例如 'h134 用于十六进制值:

    module tb;
    
    parameter ADDRESS_WIDTH = 9;
    
    task Read_mode (input [ADDRESS_WIDTH-1:0] addr);
        $displayh(addr);
    endtask
    
    initial begin
        Read_mode('h134);
        Read_mode(134);
        Read_mode('hfff);
    end
    
    endmodule
    

    打印:

    134
    086
    1ff
    

    请注意,134(没有底数)是十进制值,大于 9 位 ('hfff) 的值将被强制为 9 位 (1ff)。

    请参阅 IEEE Std 1800-2017,第 5.7.1 节 整数文字常量

    【讨论】:

      【解决方案2】:

      您不能直接在此处使用参数(欢迎使用 verilog)。在 System Verilog 中,它可以使用 typedef 来解决:

        parameter ADDRESS_WIDTH = 9;
        typedef logic [ADDRESS_WIDTH-1:0] awdt_t;
        ...
        Read_mode(awdt_t'(134));
      

      否则,您可以使用宏

        `define ADDRESS_WIDTH 9
        ...
        Read_mode(`ADDRESS_WIDTH'd134);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-02
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        • 2019-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多