は、Verilogコードである2つのクロックが存在する alwaysブロックではどの値が使用されますか?
コードで:最初に生成伝統的なクロックがある
`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_clk
とclk_at_time
は常に等しくなります。
参照コード:
r3
がclk_at_time
であるのブロックとclk_from_clk
にclk_from_clk
r4
あるによって駆動 'clk_at_time
によってSブロックと従動:r3
とr4
がアナログでありますしたがって、clk_from_clk
とclk_at_time
が実際に同じr3
との場合は常に等しくなければなりません。しかし波形を参照してください:r3
は常に0で、r4
は常に1です
どのようにですか?ルールは何ですか?
_ 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) 'に置き換えようとしていますか?これをより明確にするために質問を編集できますか? –
IEEE Std 1800-2012のセクション4.「セマンティクスのスケジューリング」を読む必要があります。 – toolic
質問をより明確にすることはできますか?また、 'clk_from_clk'と' clk_at_time'の名前を変更すると、両方とも非常に混乱します。 –