問題

次のコードセクション(同じブロック)を言う:

 A <= 1
A <= 2
 

変数Aは常に2に割り当てられますか?または競合状態があり、1または2が割り当てられますか?

非ブロッキング割り当ての私の理解は、将来変数Aを割り当てるためにハードウェアにアクセスしているため、ランダムな結果になる可能性があるということです。しかし、これは直感的ではありません。シミュレーションでは、2つは常に割り当てられていることがわかりますが、これがハードウェア合成の場合は間違いないかどうかを知りたいと思います。

  ベストアンサー

Aはシミュレーションで2になり、最後に定義された値が有効になります。同じブロックにない場合、シミュレーションで最後に定義されたシミュレータスケジューラに応じて競合状態が発生する可能性があります。

私はこのテクニックがかなり多く使用されているのを見てきましたが、合成後に予期しない結果は見られませんでした。

Verilog IEEE 1364-2005セクション11.4.1端末から

begin-endブロック内のステートメントは、そのbegin-endブロックに表示される順序で実行されます。特定のbegin-endブロック内のステートメントの実行は、モデル内の他のプロセスに対して停止することができます。ただし、いずれの場合も、begin-endブロック内のステートメントは、ソース内に表示される他の順序で実行されます。

これはセクション4.6 DetermissionsとしてSystemVerilog-IEEE1800 2012にもあります

これの使用法は、まばらに出力を定義するFSMかもしれません。

 always @(posedge clk) begin
  out_one <= 1'b0;
  out_two <= 1'b0;
  out_thr <= 1'b0;
  case (state)
    2'd1 : out_one <= 1'b1;
    2'd2 : out_two <= 1'b1;
    2'd3 : out_thr <= 1'b1;
  endcase
end
 

  同じタグがついた質問を見る

verilogsynthesis