如何在 Verilog 中为常量值使用参数化位宽?

use*_*020 1 verilog hdl register-transfer-level system-verilog digital-logic

考虑以下示例:

parameter BITWIDTH = 16;
Run Code Online (Sandbox Code Playgroud)

这有效:

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

Run Code Online (Sandbox Code Playgroud)

这不起作用:

logic [1:0][BITWIDTH-1:0] var = {BITWIDTH'h30, BITWIDTH'h40}; 
Run Code Online (Sandbox Code Playgroud)

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

Unn*_*Unn 7

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

logic [1:0][BITWIDTH-1:0] x = '{'h30, 'h40};
Run Code Online (Sandbox Code Playgroud)

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

logic [1:0][BITWIDTH-1:0] x = '{BITWIDTH'('h30), BITWIDTH'('h40)};
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@Unn!`BITWIDTH'('h30)` 语法令人大开眼界 (3认同)
  • 仅供参考,您的第一个答案在大多数情况下都不起作用。模拟器不知道您希望将第一个常量移至高 16 位,并将第二个常量移至低 16 位。相反,我相信它会做的是将每个常量扩展为 8 位,将两者都放在底部 16 位中,然后零扩展到顶部 16 位。 (2认同)