繁体   English   中英

按位“与” Verilog中的寄存器数组

[英]Bit wise 'AND' an array of registers in Verilog

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

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

哪里

parameter BW  = 4;
parameter NUM = 8;

我希望对数组的元素执行BW位AND运算,并将结果分配给寄存器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的时间达到了迭代限制

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

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

最有可能是ModelSim的错误。 使用ModelSim10.1d在EDAplayground上可重现。 在Riviera2014上运行良好(在generate循环中本地化了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

这里的工作代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM