2017-03-01 6 views
0
ここ

は、Verilogコードである2つのクロックが存在する The waveform of the simulationalwaysブロックではどの値が使用されますか?

コードで:最初に生成伝統的なクロックがある

`timescale 1 ns/1 ns 

module test; 
    reg r1, r2, r3, r4; 
    reg clk_at_time, clk_from_clk; 


    // Initialize signals 
    initial begin 
     r1 <= 1; 
     r2 <= 0; 
     clk_at_time <= 1; 
     #200 
     $finish(); 
    end 


    // Generating simple a clock (period time is 10ns) (as expected) 
    always #5 
     clk_at_time <= ~clk_at_time; 


    // Generating a clock based on the clk_at_time. 
    // This clk_from_clk is always equals the clk_at_time (as expected) 
    always @ clk_at_time 
     clk_from_clk <= clk_at_time; 


    // r1 and r2 inverted at all posedge event. (as expected) 
    // r3 is constant 0 (as expected) 
    always @(posedge clk_at_time) begin 
     r1 <= r2; 
     r2 <= r1; 
     r3 <= clk_from_clk; 
    end 


    // r4 is constant 1 ???!!!??? HOW ???!!!??? 
    always @(posedge clk_from_clk) begin 
     r4 <= clk_at_time; 
    end 

endmodule 

とシミュレーションの波形(このコードは、合成のためではありません) always #5時間によって、第2は、2つのクロックは常に同じである。このクロックalways @ clk_at_timeによって生成される(予想通り)

私はclk_at_timeのブロックでclk_from_clkを使用した場合、以前の値がclk_frを使用することを奇妙なことom_clk。 (OK)ですが、clk_at_timeをclk_from_clkのブロックで使用すると、NEW値がclk_at_timeに使用されます。

EDIT

は明確: 波形を参照してください:clk_from_clkclk_at_timeは常に等しくなります。

参照コード:

  • r3clk_at_timeであるのブロックとclk_from_clkclk_from_clk
  • r4あるによって駆動 'clk_at_time

によってSブロックと従動:r3r4がアナログでありますしたがって、clk_from_clkclk_at_timeが実際に同じr3との場合は常に等しくなければなりません。しかし波形を参照してください:r3は常に0で、r4は常に1です

どのようにですか?ルールは何ですか?

+0

_ clk_at_timeのブロックでclk_from_clkを使用すると、以前の値がclk_from_clkに使用されるという奇妙なことが起こります。 (OK)ですが、clk_at_timeをclk_from_clkのブロックで使用すると、NEW値はclk_at_time._に使用されます。常にalways @(posedge clk_from_clk)を 'always @(posedge clk_at_time) 'に置き換えようとしていますか?これをより明確にするために質問を編集できますか? –

+0

IEEE Std 1800-2012のセクション4.「セマンティクスのスケジューリング」を読む必要があります。 – toolic

+0

質問をより明確にすることはできますか?また、 'clk_from_clk'と' clk_at_time'の名前を変更すると、両方とも非常に混乱します。 –

答えて

0

私は正確な答えはわかりませんが、私はシミュレーションの観点から考えて意見を述べたいと思います。私はコメントの代わりに答えとしてこれを書いています。コメントに収まらないからです。

私はこれがシミュレーションの有限要素解析の性質と関係していると思います。シミュレーションの各タイムステップで、シミュレータは回路コンポーネントをコンポーネントごとに解決します。 clk_from_clkがfrınclk_at_timeから派生しているので、シミュレータは常に後者を最初に評価します。

r4は、それは常に、それはclk_at_timeの変更で評価し、clk_from_clkと同時、その前の値を持つことになるr3については1の値を持つことになりますclk_from_clk後に評価されます。

関連する問題