【问题标题】:Parameterized Bit-fields in verilogverilog 中的参数化位域
【发布时间】:2011-06-23 19:22:34
【问题描述】:

是否可以在 verilog 中参数化位域?本质上,我想使用参数或替代方法来定义位范围。我能想到的唯一方法是使用如下所示的`define,但似乎应该有更好的方法。

`define BITFIELD_SELECT 31:28
foo = bar[BITFIELD_SELECT]

【问题讨论】:

    标签: verilog fpga register-transfer-level


    【解决方案1】:

    参数比定义更好(更安全),因为命名空间对项目来说不是全局的。您应该可以使用两个参数来执行此操作。

    parameter BITFIELD_HIGH = 31;
    parameter BITFIELD_LOW = 28;
    
    assign foo = bar[BITFIELD_HIGH:BITFIELD_LOW];
    

    或者

    parameter BITFIELD_HIGH = 31;
    localparam BITFIELD_LOW = BITFIELD_HIGH-3;
    
    assign foo = bar[BITFIELD_HIGH:BITFIELD_LOW];
    

    【讨论】:

    • 是的,我并不是真正的`define 方法的粉丝,因此提出了这个问题。这是您在实践中使用的东西,还是只是对所提问题的回答?
    • 我忘记了我是否曾经定义过上限和下限。很多时候,我使用参数来定义向量的宽度。即:foo[(WIDTH-1):0]。它在实践中效果很好,结合生成语句非常强大。
    • 由于某些原因,许多开发人员不知道 Verilog-2001 中方便的常量部分选择:assign foo = bar[HIGH -: SIZE];
    【解决方案2】:

    如果您使用宏(定义)在调用宏时包括“`”

    `define BITFIELD_SELECT 31:28
    foo = bar[`BITFIELD_SELECT]; // `BITFIELD_SELECT
    

    【讨论】:

    • 这不是错误的,但是宏不是参数。有一个参数 WIDTH 会不会更容易,然后是:paramter WIDTH = 8; /*...*/ foo = bar[(WIDTH-1):0]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    相关资源
    最近更新 更多