我有System 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;
但是,这会使短绒和合成器抱怨分配宽度不匹配(iirc,使用'h22
也会引起短绒警告)。我也可以这样做:
assign next_clk_cnt = {{(W_CLK_CNT-6){1'b0}}, 6'h22};
但是,这使得分配的意图非常难以确定,并且正如我之前提到的,该示例是对我实际情况的总结。
是否有一种可读的方法来指定W_CLK_CNT'h22
?
答案 0 :(得分:1)
您可以使用位宽转换。
assign next_clk_cnt = W_CLK_CNT'('h22);