System verilog 使用可合成系统Verilog中的参数声明任意常量的宽度

System verilog 使用可合成系统Verilog中的参数声明任意常量的宽度,system-verilog,System Verilog,我有一个系统Verilog设计,它使用参数来定义一些信号的宽度。在许多情况下,我需要为具有参数宽度的信号指定特定的常数值,这些常数值不是全零或全一。我想做的是: // W_CLK_CNT is a parameter passed into the module logic [W_CLK_CNT-1:0] next_clk_cnt; assign next_clk_cnt = W_CLK_CNT'h22; 但是我使用的模拟器(Cadence irun(64):15.20-s017)给了我以下错

我有一个系统Verilog设计,它使用参数来定义一些信号的宽度。在许多情况下,我需要为具有参数宽度的信号指定特定的常数值,这些常数值不是全零或全一。我想做的是:

// W_CLK_CNT is a parameter passed into the module
logic [W_CLK_CNT-1:0] next_clk_cnt;
assign next_clk_cnt = W_CLK_CNT'h22;
但是我使用的模拟器(Cadence irun(64):15.20-s017)给了我以下错误:

ncvlog: *E,EXPSMC (../../../rtl/ccu.sv,196|36): expecting a semicolon (';') [9.2.2(IEEE)].
我知道我可以“仅”删除宽度规格,并在本例中的分配中使用
'h22

assign next_clk_cnt = 'h22;
但这在我的实际案例中效果不好,这个案例更复杂,涉及到多个字段的连接

如果我事先知道常数的宽度(本例中为6),那么我可以执行以下操作:

assign next_clk_cnt = 6'h22;
但这会导致linter和合成器抱怨分配宽度不匹配(iirc,使用
'h22
也会导致lint警告)。我还可以:

assign next_clk_cnt = {{(W_CLK_CNT-6){1'b0}}, 6'h22};
但是这使得任务的意图很难确定,正如我前面提到的,这个例子是对我的实际案例的提炼


是否有一种可读的方法来指定
W\u CLK\u CNT'h22

您可以使用位宽转换

assign next_clk_cnt = W_CLK_CNT'('h22);

谢谢,这就解决了问题。我没有试过那种蜱虫和帕伦的特殊组合。