2017-03-01 55 views
0

這裏是一個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 

和仿真的波形: The waveform of the simulation

在代碼有兩個時鐘:第一是生成的傳統的時鐘按時間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_clkclk_at_time總是平等的。

見代碼:r3r4是模擬:

  • r3是在clk_at_time的塊和由clk_from_clk
  • r4clk_from_clk驅動的塊和從動通過clk_at_time

所以如果clk_from_clkclk_at_time真的是相同的r3r4應該始終是平等的。 BUT查看波形:r3始終爲0且r4始終爲1

如何?什麼是規則?

+0

_奇怪的是,如果我在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)'?請你可以編輯你的問題,使其更清晰? –

+0

您需要閱讀IEEE Std 1800-2012第4節「調度語義」。 – toolic

+0

你能否讓你的問題更清楚?同時也改變'clk_from_clk'和'clk_at_time'的名字,因爲兩者都很混亂。 –

回答

0

我不知道確切的答案,但我想分享一個意見,從模擬的角度思考。我寫這個答案而不是評論,因爲它不適合評論。

我認爲這與模擬的有限元分析本質有關。在仿真的每個時間步驟,仿真器按組件解決電路組件。並且由於您的模擬器將始終對後者進行評估,因此您可以從中獲得該模型。之後clk_from_clk所以它總是會有1的值作爲r3將在clk_at_time的變化進行評估,並同時與clk_from_clk和具有其先前值

r4進行評估。

相關問題