2016-04-12 2 views
1

クロックのposedgeでは、私がリセットされた場合、私はリセット後の1サイクルがゼロであることを確認したい。リセットしてから1サイクル後にデータをチェックする方法はわかりません。これは私が思いついたものですが、同じクロックサイクルでリセットが高いデータをチェックしている間は間違っていることが分かります。誰かが私にどのようにVerilogでこれを行うことができます知っていることができますか?Verilogで1サイクル後にデータをチェックする方法は?

always @(posedge clk) 
    if(reset) 
     if(data == 0) 
     $display("ok"); 
     else 
     $display("error"); 

答えて

0

これを行う簡単な方法があります:

always @(posedge clk) 
    reset_q <= reset; 

always @(posedge clk) 
    if(reset_q == 1) && (data == 0) 
     $display("reset ok"); 
    else 
     $display("reset error"); 

これらを別々のブロックに入れて、1つがリセットサインで動作するパイプラインであることを強調しますlともう一方はチェックロジックですが、常に同じブロックに存在する可能性があります。

+1

ああです。完璧です。大変ありがとうございました。なぜ私はそれが複雑になると思ったのかわかりません。私は途方に暮れていた、私はカウンターとすべてを考えていた。これはとてもエレガントです。ありがとうございました。 – user3551094

0

あなたの テストベンチ上alwaysブロックを使用してみたくないようです。テストベンチのforeverループを の代わりに使用することをお勧めします。alwaysの代わりに テストベンチを制御する柔軟性があるためです。

誰かがこの私に言った:alwaysブロックは、RTL設計とforever ループのためのものであるRTL検証

のためのものである必要はなく、これを試すことができます。

initial begin 
    forever begin  
     @(posedge reset); // wait for the rising edge of reset 

     // reset has occured at this time. 
     @(posedge clk); // delay for 1 clock cycle 

     // check your data here 
     if(data == 0) $display("ok"); 
     else $display("error"); 
    end 
end 
+0

ここには1つの問題があります。正のクロックエッジで正のリセットがないかどうかチェックしたいと思います。それは私のコードで常にブロックしていたものです。 – user3551094

+0

これは、リセットが同期しているかどうかに関係なく機能します。 – e19293001

関連する問題