Verilog規范告訴我們:negedge 事件指的是如表43所示的跳變,發生negedge事件時才會執行操作。那么0時刻,是如何執行操作的呢?
鴿子在Verilog標準中并沒有找到0時刻賦值明確的說明。如下代碼中,0時刻,rst_n為0,clk 處于低電平,那么cfg_mode的數值是多少呢?
always@(posedgeclkornegedgerst_n) if (!rst_n) begin cfg_mode <= 1'b0; end else begin cfg_mode <= cfg_mode_in ; end
實際電路中:
在芯片上電之前,芯片的chip_reset一直處于復位狀態,因此導致芯片內部的rst_n一直為0,且芯片內部PLL還沒有工作,也沒有產生clk,此時沒有任何信號的跳變,即clk沒有跳變,rst_n一直為0也沒有跳變。在實際電路中,從D觸發器的結構圖可以看到,當復位R一直是1時,即使時鐘信號不跳變,Q端輸出也是0。
VCS在0時刻賦值
VCS 在0時刻會執行一次always塊的賦值,而不是等到信號跳變。
module zero_time_test; reg rst_n; initial begin rst_n = 0; #20 rst_n = 1; end always@(posedge rst_n) begin: always_case1 $display("The always case1 executed @Time %f", $time()); end always@(negedge rst_n) begin: always_case2 $display("The always case2 executed @Time %f", $time()); end always@(rst_n) begin: always_case3 $display("The always case3 executed @Time %f", $time()); end endmodule
module zero_time_test; reg rst_n; initial begin rst_n = 1; #20 rst_n = 0; end always@(posedge rst_n) begin: always_case4 $display("The always case4 executed @Time %f", $time()); end always@(negedge rst_n) begin: always_case5 $display("The always case5 executed @Time %f", $time()); end always@(rst_n) begin: always_case6 $display("The always case6 executed @Time %f", $time()); end endmodule?
審核編輯:劉清
-
寄存器
+關注
關注
31文章
5357瀏覽量
120591 -
D觸發器
+關注
關注
3文章
164瀏覽量
47951 -
CLK
+關注
關注
0文章
127瀏覽量
17183 -
PLL電路
+關注
關注
0文章
92瀏覽量
6431 -
Verilog語言
+關注
關注
0文章
113瀏覽量
8274
原文標題:異步復位寄存器:0時刻賦值
文章出處:【微信號:IP與SoC設計,微信公眾號:IP與SoC設計】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論