IEEE 規格。Verilog レジスタ転送レベル合成標準である 1364.1(E):2002 (IEC 624142(E):2005) では、Sec. posedge
5.1 センシティビティ リストに/negedge
イベントがない always ブロックは組み合わせロジックです。つまり、イベント リスト内の信号は無視され、暗黙的な式リスト ( @(*)
, @*
) が使用されたかのようにブロックが合成されます。次の例は、規格に記載されています(「例4」(14ページ)):
always @ (in)
if (ena)
out = in;
else
out = 1’b1;
// Supported, but simulation mismatch might occur.
// To assure the simulation will match the synthesized logic, add ena
// to the event list so the event list reads: always @ (in or ena)
(コメントも標準ドキュメントからコピーされます)
つまり、合成ツールの場合、2 番目のブロックは実質的に次のようになります。
always @*
begin
case(CLK)
1'b1:
state <= next_state;
1'b0:
state <= state;
end
CLK
これは、選択入力、アクティブ 1 入力、およびアクティブ 0 入力としてフィードバックされるnext_state
出力 ( )を備えた単なるマルチプレクサです。state
スマート合成ツールは、これがイネーブル入力としての d 型ラッチと同一であることを検出しCLK
、組み合わせループの代わりに d 型ラッチを作成する場合があります。コードはすべての分岐で明示的に代入するため、合成ツールはこのラッチを検出する必要がないことに注意してくださいstate
(標準のセクション 5.3 を比較してください)。
いずれにせよ、これは最初のコード例が合成する d 型フリップフロップとは異なります。これは、Verilog コードがシミュレーションと合成で異なる意味を持つ多くのケースの 1 つです。したがって、(1) このようなケースを回避する方法で合成可能な Verilog コードを記述し、(2) デザインの合成後のシミュレーションを常に実行して (フォーマル検証も使用している場合でも!)、確実に回避できるようにすることが重要です。この落とし穴。