這裏是一個Verilog代碼:(此代碼不是用於合成)在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
由該時鐘產生的第二always @ clk_at_time
兩個時鐘總是相等的(如預期)
奇怪的是,如果我使用clk_at_time的塊中的clk_from_clk之前的值將被使用clk_fr的om_clk。 (OK),但是如果我在clk_from_clk的塊中使用clk_at_time,則NEW值將用於clk_at_time。
編輯
澄清: 看到波形:clk_from_clk
和clk_at_time
總是平等的。
見代碼:r3
和r4
是模擬:
r3
是在clk_at_time
的塊和由clk_from_clk
r4
是clk_from_clk
驅動的塊和從動通過clk_at_time
所以如果clk_from_clk
和clk_at_time
真的是相同的r3
和r4
應該始終是平等的。 BUT查看波形:r3
始終爲0且r4
始終爲1
如何?什麼是規則?
_奇怪的是,如果我在clk_at_time的塊中使用clk_from_clk,則以前的值將用於clk_from_clk。 (OK),但如果我在clk_from_clk的塊中使用clk_at_time,那麼將使用新值clk_at_time._什麼?你是否在用'always @(posedge clk_at_time)'替換'always @(posedge clk_from_clk)'?請你可以編輯你的問題,使其更清晰? –
您需要閱讀IEEE Std 1800-2012第4節「調度語義」。 – toolic
你能否讓你的問題更清楚?同時也改變'clk_from_clk'和'clk_at_time'的名字,因爲兩者都很混亂。 –