1

我有一组寄存器/总线和一个定义如下的结果总线。

wire [BW-1:0] bus_array[NUM-1:0];
reg  [BW-1:0] and_result;

在哪里

parameter BW  = 4;
parameter NUM = 8;

我希望对数组的元素执行 BW 位与运算并将结果分配给寄存器and_result

我尝试按如下方式执行此操作。

integer l;

generate 
genvar m;
for (m=0; m<BW; m=m+1)
begin : BW_LOOP

    always @ (*)
    begin
      and_result[m] = 1'b1;
      for (l=0; l<NUM; l=l+1)
        and_result[m] = and_result[m] & bus_array[l][m];
    end

end
endgenerate

但是,当我在 Modelsim 10.1e 中对此进行仿真时,出现以下错误。

错误:(vsim-3601)在时间 2 ns 达到迭代限制

如果我不使用生成循环,而是使用always @ (*)块的 BW 实例,则模拟工作正常。

我可以从错误消息中推断出生成 for 循环存在问题,但我无法解决问题。

4

1 回答 1

1

很可能是 ModelSim 的错误。可使用 ModelSim10.1d在EDAplayground上重现。与 Riviera2014 一起工作(在l生成循环内本地化后)。我猜这and_result[m]@(*)敏感性列表中以某种方式存在,它不应该是。

l需要本地化,否则将与生成的 always 块并行访问;创造潜在的加薪条件。

一种解决方法是使用 SystemVerilog 并使用always_comb而不是always @(*).

向后兼容的解决方案是更改and_result[m] = and_result[m] & bus_array[l][m];if (bus_array[l][m]==1'b0) and_result[m] = 1'b0;等效代码。这and_result[m]仅作为左手表达式保留,因此它不能在敏感度列表中。

genvar m;
for (m=0; m<BW; m=m+1)
begin : BW_LOOP
    integer l; // <== 'l' is local to this generate loop

    always @ (*)
    begin
      and_result[m] = 1'b1;
      for (l=0; l<NUM; l=l+1) begin
        if (bus_array[l][m]==1'b0) begin 
          and_result[m] = 1'b0;
        end
    end

end

工作代码在这里

于 2014-11-25T00:42:30.847 回答