System verilog 使用可合成系统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)给了我以下错
// 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);
谢谢,这就解决了问题。我没有试过那种蜱虫和帕伦的特殊组合。