2

我似乎把自己写进了一个无限循环,或者那个或者那个 Modelsim 不知道如何处理这个 while 循环中的条件:

i = 0;
while(i < 8'b01100100 && !(mem[i] == RC)) begin
   i <= i + 1;
end

模拟只是无法通过这个while循环中的条件行,谁能指出我做错了什么?

-edit:包含while循环的代码部分:

//if remove credential enable is high
if(RCE == 1'b1) begin
  $display ("%d", RC);
  $display ("%d", mem[i]);
  $display ("%b", !(mem[i] == RC));
    while(i < 8'b01100100 && mem[i] != RC) begin
      i <= i + 1;
    end
    if(i < 8'b01100100) begin
        mem[i] <= 24'b111111111111111111111111;
    end else begin
        //do nothing
    end
    i = 0;
    end else begin
        //do nothing
    end

这部分位于一个 always 块内,其中包含 posedge clk 和 posedge rst 的敏感度列表。

4

1 回答 1

2

您需要在 while 循环中使用阻塞赋值而不是非阻塞赋值(请参阅如何在 Verilog 中解释阻塞与非阻塞赋值?)。

i活动事件处理完成后要更新的非阻塞分配计划。但是,活动事件处理永远不会完成,因为while条件将继续评估为真。

或者,您可以在 while 循环中添加延迟:@(posedge clk) i <= i + 1.

于 2012-12-12T03:41:40.167 回答