1

Verilog モジュールで状態を変更するために以下が使用されるのを見てきました。

state <= 2'b10;

state <= #1 IDLE;

= だけでなく <= が使用されるのはなぜですか? #1を使用する目的は何ですか?違いはありますか?

最初に使用された FSM を示す Verilog コードを次に示します。2番目に置き換えても同じように機能しますか?

module fsm( clk, rst, inp, outp);

   input clk, rst, inp;
   output outp;

   reg [1:0] state;
   reg outp;

   always @( posedge clk, posedge rst )
   begin
   if( rst )
       state <= 2'b00;
   else
   begin
       case( state )
       2'b00:
       begin
            if( inp ) state <= 2'b01;
            else state <= 2'b10;
       end

       2'b01:
       begin
            if( inp ) state <= 2'b11;
            else state <= 2'b10;
       end

       2'b10:
       begin
            if( inp ) state <= 2'b01;
            else state <= 2'b11;
       end

       2'b11:
       begin
            if( inp ) state <= 2'b01;
            else state <= 2'b10;
       end
       endcase
   end
end
4

2 に答える 2

7

あなたのようなシーケンシャル ロジックブロックでは、ブロック代入 ( ) の代わりにalways非ブロック代入 ( ) を使用することをお勧めします。シミュレーションは、実際の結果のロジックをよりよく表しています。<==

純粋な RTL Verilog コードでは、すべてのシーケンシャル ロジックにノンブロッキング割り当てを使用している場合、#1遅延を使用する理由はありません。

私はまた、他の人#がこのような遅延を使用しているのを見てきました. 同じシミュレーションで RTL とゲート ネットリストが混在していることが原因である場合があります。貧弱なモデリングを補うために行われる場合もあります。可能であれば、RTL コードで遅延を使用しないでください。

関連項目: Verilog 合成でのノンブロッキング代入、Killing Styles That Kill!

また、parameter各状態の名前には a を使用することをお勧めします。IDLEの代わりに状態の名前を付けた方が、はるかに意味があり2'b10ます。

于 2011-04-16T20:03:53.757 に答える
1

Verilog は本質的に非決定的です。これは、一般に、シミュレーションで複数の可能な結果があり、それらはすべて異なりますが、標準に従って有効であることを意味します。

クロックされた always ブロックからの非決定論的な動作を回避するには、他のブロック (非ローカル変数) で使用される変数に非ブロック代入を使用する必要があります。より詳細な分析については、この件に関する私のブログ投稿を参照してください。

http://www.sigasi.com/content/verilogs-major-flaw

合成ツールは通常、クロック付きの always ブロック内の非ローカル変数のブロッキング割り当てを受け入れますが、合成されたロジックがモデルのように動作することを保証する方法がないため (このようなモデルは非決定論的であるため)、これは実際にはエラーです。

Cliff Cummings の有名な論文など、他の多くの人から聞いたこととは対照的に、ローカル変数にノンブロッキング代入のみを使用する必要はありません。ブロック割り当ては、ローカル変数に対して完全に受け入れられます。これは、内部モデリングに純粋な「変数」セマンティクス (プログラミング言語の場合と同様) を使用できるため、適切です。

純粋な RTL スタイルのモデリングでは、#1 の遅延は単なるオーバーヘッドです。

于 2011-04-17T11:14:46.463 に答える