2

私は無限ループに自分自身を書いたようです.それまたはそのModelsimは、このwhileループの条件をどうするかを知りません:

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

シミュレーションはこの while ループの条件行を通過できません。誰かが私が間違っていることを指摘できますか?

-編集: 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

この部分は、posedge clk と posedge rst のセンシティビティ リストを含む always ブロック内にあります。

4

1 に答える 1

2

while ループでは、非ブロッキング代入ではなくブロッキング代入を使用する必要があります ( Verilog でブロッキングと非ブロッキング代入を解釈する方法を参照してください)。

非ブロッキング割り当てiは、アクティブなイベント処理が完了した後に更新される予定です。whileただし、条件が true として評価され続けるため、アクティブなイベントの処理は決して完了しません。

または、while ループ内に遅延を追加することもできます@(posedge clk) i <= i + 1

于 2012-12-12T03:41:40.167 に答える