1

次のようにコードを検討してください。

   reg [2:0] cnt;
   // a is an input (say 4 bit) to design and being assigned after some manipulation 
   // to some other variable  

   always @(a)
      for (cnt = 0; cnt < 4; cnt = cnt+1) begin
          //some operation involving a [bitwise]
      end

ご覧のとおり、常にブロックのイベント リストに cnt を含めませんでした。これは、cnt は常にブロックの外部で参照/割り当てられておらず、for ループで完全に反復されるためです。

私の質問は、イベント リストに cnt を表示する必要があるかどうかです。

4

2 に答える 2

4

常時ブロックのセンシティビティ リストが機能する方法は、入力の 1 つが変更されると、常にブロックが最後に到達するまで実行され、その後、センシティビティ リストの別の変更を待機するというものです。

あなたの場合、変更aすると、 for ループの 4 つのループすべてを実行してから終了する必要があるためcnt、機密リストに含める必要はありません。

とはいえ、これがどのようなロジックに合成されるのか想像するのに苦労しています。あなたの for ループはクロックされるべきものですか、それとも瞬時に実行することを意図していますか?

于 2012-04-25T23:21:45.533 に答える
2

コード例を許可するための回答として追加: @* を使用してセンシティビティ リストを完成させ、不要なトリガーをチェックします。

integer cnt;
integer loop_cnt = 0;
reg [3:0] b;

always @* begin
  $display("%t : Loop Count ",$realtime, loop_cnt);
  loop_cnt = loop_cnt + 1;
  for (cnt = 0; cnt < 4; cnt = cnt+1) begin
    b[cnt] = one_bit_data ;
  end
end

以下と同じです:

integer cnt;
integer loop_cnt = 0;
reg [3:0] b;

always @( one_bit_data ) begin
  $display("%t : Loop Count ",$realtime, loop_cnt);
  loop_cnt = loop_cnt + 1;
  for (cnt = 0; cnt < 4; cnt = cnt+1) begin
    b[cnt] = clk ;
  end
end

両方を実行すると、時間とカウントが一致するはずです。余分なトリガーがあれば、カウントは 4 倍になります。

于 2012-04-27T10:50:39.833 に答える