【问题标题】:How to use parameterized bitwidth for a constant value in Verilog?如何在 Verilog 中使用参数化位宽作为常数值?
【发布时间】:2019-09-30 16:55:45
【问题描述】:

考虑以下示例:

parameter BITWIDTH = 16;

这行得通:

logic [1:0][BITWIDTH-1:0] var = {16'h30, 16'h40};

这不起作用:

logic [1:0][BITWIDTH-1:0] var = {BITWIDTH'h30, BITWIDTH'h40}; 

如何在上面的代码行中使用参数?

【问题讨论】:

    标签: verilog system-verilog hdl digital-logic register-transfer-level


    【解决方案1】:

    SystemVerilog 将按照定义明确的规则将数字文字调整为正确的大小,因此无需定义大小:

    logic [1:0][BITWIDTH-1:0] x = '{'h30, 'h40};
    

    但是,有些工具会发出警告,因此您可以将文字转换为正确的大小,如下所示:

    logic [1:0][BITWIDTH-1:0] x = '{BITWIDTH'('h30), BITWIDTH'('h40)};
    

    【讨论】:

    • 仅供参考,您的第一个答案在大多数情况下都行不通。模拟器不知道您希望第一个常量移入前 16 位,而第二个常量移入后 16 位。相反,我相信它会做的是将每个常量扩展为 8 位,将两者放在底部的 16 位中,并将零扩展到顶部的 16 位中。
    • @EvenCox 你是对的,我的第一个答案有问题,但不完全是你所说的。事实上,未调整大小的文字(如'h30)将被调整为至少 32 位(参见 lrm,关于整数文字常量的第 5.7.1 节),因此更糟糕的是,它将我的第一项视为 64 位值由于串联,然后将其调整为 32 位(假设 BITWIDTH 为 16)。通过将其设为数组初始化 ('{}) 来解决该问题,我已据此更新了我的答案。感谢您指出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多