在可综合的System-Verilog中使用参数声明任意常量的宽度

时间:2018-06-19 16:42:38

标签: system-verilog

我有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

1 个答案:

答案 0 :(得分:1)

您可以使用位宽转换。

assign next_clk_cnt = W_CLK_CNT'('h22);