verilog中連續性賦值中的延時


上次遇到一個問題。寫一個testbench需要移動兩個時鍾之間的相位。后來一想,貌似我們都是這么寫clock的

always    #(`P/2) clk = ~clk  

我的兩個時鍾都是這么寫,只是p不一樣,那相位怎么移動呢?

於是就追究起 如何延遲賦值的問題

 

根據standard-2005.

對於連續賦值延時只有這一種

wire  #delay_time   b ;    

assign  a = b ; 

1,在第0時刻仿真器讀取b的值

2,如果b的值,與a不同,取消上一個event, 新建立event ----- 過delay_time后,將新值賦值給 a

3, 如果b值與a相同,那么維持現狀

4,在這delay_time時間內,如果b繼續變化。回到2或者3.

 

用真OO無雙大神的話說,就是無code無真相

 1 module   delay_test ;
 2 //Continuous assignments check 
 3 wire    [7:0]  #8 con_a ;
 4 reg      [7:0]     con_b ; 
 5 assign  con_a = con_b ;
 6 //**********************
 7 initial begin 
 8         con_b = 0 ; 
 9         #1
10         con_b = 8'hff ; 
11         #20 
12         
13         con_b = 8'h12 ; 
14         #2
15         con_b = 8'hff  ;
16         #20 
17         
18         con_b = 8'h34 ; 
19         #2
20         con_b = 8'hff ;
21         #2
22         con_b = 8'h56 ;
23         #20  ; 
24         end 
25 endmodule    

測試兩個回合

先初始化a=b=ff

第一回合發生在第21ns的時刻, b=12維持了2ns (<delay_time   8ns),在第23ns時刻變成了ff。發現經過20ns(>delay_time  8ns)a的值一直是ff。

第二回合發生在第43ns時刻, b=34維持2ns,再b=ff維持2ns,再b=56(在第47ns)維持2ns。結果在第56ns (56-47=8)a=56 

有code有圖有真相。

 

所以對於我的問題可以是

wire   #Delay_time  clk2 
assign  clk2 = clk1  

這樣就把clk1的相位移動了一下,形成了一個新的時鍾clk2 

其實還可以是用forever。效果是一樣的

1 initial begin 
2         #Delay_time
3         forever #(`P/2)  clk2 = ~clk2 ;
4         end 



歡迎加入: FPGA廣東交流群:162664354

      FPGA開發者聯盟: 485678884


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM