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

如何在Verilog中为常量值使用参数化位宽度?,verilog,system-verilog,hdl,digital-logic,register-transfer-level,Verilog,System Verilog,Hdl,Digital Logic,Register Transfer Level,考虑以下示例: 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}; 如何使用上述代码行中的参数?SystemVerilog将根据定义良好的规则将数字文字调整为正确的大小,因此无需定义大小: logic [1:0][BITWIDTH-1:0]

考虑以下示例:

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}; 

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

SystemVerilog将根据定义良好的规则将数字文字调整为正确的大小,因此无需定义大小:

logic [1:0][BITWIDTH-1:0] x = '{'h30, 'h40};
但是,有些工具确实会抛出警告,因此您可以将文字强制转换为正确的大小,如下所示:

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

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位(假设
位宽度
为16)。通过使其成为数组初始化(
“{}
)解决了这个问题,我已经根据需要更新了答案。谢谢你指出。仅供参考,你的第一个答案在大多数情况下都不起作用。模拟器不知道您希望第一个常量移到前16位,第二个常量移到下16位。相反,我相信它会将每个常数扩展到8位,将两个常数都放在最下面的16位,并将零扩展到最上面的16位。@EvenCox我的第一个答案有问题,但不完全是你说的。事实上,未调整大小的文字(如
'h30
)的大小将至少为32位(请参阅lrm,关于整数文字常量的第5.7.1节),因此更糟糕的是,由于串联,它将我的第一个术语视为64位值,然后将其大小调整为32位(假设
位宽度
为16)。通过使其成为数组初始化(
“{}
)解决了这个问题,我已经根据需要更新了答案。谢谢你指出这一点。