上次遇到一個問題。寫一個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