SystemVerilog在中初始化多维参数化数组

时间:2018-07-09 17:07:18

标签: verilog system-verilog xilinx

我正在尝试在SystemVerilog中初始化多维参数化数组,如下所述:

...
parameter INPUT_WIDTH = 16;
parameter NUM_ELEMENTS = 4;
...
reg signed [INPUT_WIDTH-1 : 0 ] ss_res_reg[NUM_ELEMENTS-1:0];

我想在ss_res_reg的每个下降沿将rst初始化为零,所以:

always_ff @(posedge clk or negedge rst) begin
    if(~rst) begin
        ss_res_reg <= '{NUM_ELEMENTS{NUM_ELEMENTS{1'b0}}};
    end else begin
        ss_res_reg <= ss_res;
    end
end

问题在于此行ss_res_reg <= '{NUM_ELEMENTS{INPUT_WIDTH{1'b0}}};。如果我将其更改为ss_res_reg <= '{NUM_ELEMENTS{16'b0}};,则效果很好。但是,当我想使用INPUT_WIDTH参数时,Xilinx工具会给我以下错误:syntax error near {。我也尝试了ss_res_reg <= '{NUM_ELEMENTS{16{1'b0}}};并得到了同样的错误。有人知道我在做什么错吗?

2 个答案:

答案 0 :(得分:1)

错误在于您无法复制未打包的数组元素。

有一个简单的解决方案:

if(~rst) 
   for (integer i=0; i<NUM_ELEMENTS; i++)
      ss_res_reg[i] <=  {INPUT_WIDTH{1'b0}};

答案 1 :(得分:1)

您可以在分配模式中使用default标签来分配未打包数组的所有元素

always_ff @(posedge clk or negedge rst) begin
    if(~rst) begin
        ss_res_reg <= '{default:'0};
    end else begin
        ss_res_reg <= ss_res;
    end
end

'0表示用0填充压缩数组