標籤:
首先引入一個例子:
`timescale 1ns/100ps
module TB; module INV_DFF(Clock, Reset_n, DataIn, DataOut);
reg Ck, Rst_n, Din; input Clock;
wire Dout; input Reset_n;
//Clock generation input DataIn;
initial begin output reg Data_Out
Ck = 0; wire DataInv;
forever #10 Ck = ~Ck; always @(posedge Clock or negedge Reset_n)
end begin if(~Reset_n)
//Reset generation Data_Out <= 1‘b0;
initial begin else Data_Out <= Data_Inv;
Rst_n = 1; end
#5 Rst_n = 0; assign #3 DataInv = ~ DataIn;
#55 Rst = 1; endmodule
end
//Data input generation
initial begin
Din = 0;
#80 Din = 1;
#40 Din = 0;
end
INV_DFF u_INV_DFF( //DUV
.Clock(Ck),
.Reset_n(Rst_n),
.DataIn(Din),
.DataOut(Dout),
);
0模擬時刻:3個initial進程和1個DUV同時執行。同時執行的進程其順序不是固定的,和所用的模擬器有關,假設此處的同時執行,按代碼中的順序來執行。
執行Clock Generation 中的語句Ck = 0; ~Ck。 執行forever #10 進程掛起。
執行Reset Generation 中的語句Rst_n = 1; #5 進程掛起。
執行Data Input Generation中的語句Din = 0; #80 進程掛起。
執行DUV中的語句~DataIn; #3進程掛起。always @進程掛起。 至此0模擬時刻的語句全部執行完畢,模擬時間軸向前推進。
3模擬時刻:只有一個計算事件 DataInv = #3 ~DataIn;更新DataInv的值。無觸發更多計算事件,所以模擬時間軸向前推進。
5模擬時刻:執行Reset Generation 中的語句 Rst_n = 0; #55 進程掛起。
由於Rst_n的更新時間,DUV中的always @進程執行,DataOut值更新。無觸發更多計算事件,模擬時間軸向前推進。
10模擬時刻: 執行Clock Gneration 中的計算事件CK。更新事件觸發。#10進程掛起。
執行DUV中的always進程,計算事件Data_Out = 0。無觸發更多事件,模擬時間軸向前推進。
60模擬時刻: 執行Clock Gneration 中的計算事件CK。更新事件觸發。#10進程掛起。
執行Reset Generation 中的語句 Rst_n = 1; 進程結束。
執行DUV中的always進程,計算事件Data_Out = 1(Rst_n的值已經為1)。無觸發更多事件,模擬時間軸向前推進。
80模擬時刻: 執行Clock Gneration 中的計算事件CK。更新事件觸發。#10進程掛起。
執行Data Input Generation中的語句Din = 1; #40 進程掛起。
執行DUV中的always進程,計算事件Data_Out = Data_Inv。
執行DUV中的語句~DataIn; #3進程掛起。always @進程掛起。 至此0模擬時刻的語句全部執行完畢,模擬時間軸向前推進。
模擬時間:是模擬時間維護的時間值,用來對模擬電路的真即時間進行建模(模擬時間和軟體的執行時間沒有任何聯絡),當模擬時間推進到某一個時間點時,該時間點就被稱為當前模擬時間,而以後的任何時間都被稱為將來模擬時間。
事件:模型中數值的變化,功能模擬是一種事件驅動的模擬,整個模擬過程都是圍繞事件來組織的。
更新事件:在被模擬的電路中,線網或寄存器的值在任何進程中的任何改變都被認為是一個更新事件。
計算事件:由於更新事件產生的,進程的計算,計算事件。
計算事件和更新事件之間迴圈往複的互相觸發,推動模擬時間的前進。
進程是Verilog中的獨立執行單元,包括:原語(Primitives), 模組(Moules), initial過程塊, always過程塊, 連續指派陳述式(assign), 非同步任務(task)。在模擬時,所有的進程都是模擬器按Verilog的語義來順序執行的,效果是各個進程並存執行的效果,在未執行完當前所有的進程時,模擬時間不會向前推進。
initial begin
Ck = 0; forever Ck = ~Ck;
end
例子會hang在模擬時刻0,因為更新時間一直觸發計算事件,計算事件一直觸發更新時間。
Verilog中的時序控制:事件語句(@),延時語句(#),等待語句(wait)。
Verilog模擬時的不確定性:在同一個模擬時間內,幾個同一調度模組中事件執行順序的任意性,進程之間語句的任意交織。
Verilog的事件調度:
注意:1,阻塞賦值和非阻塞賦值同處一個優先順序,執行順序隨機或隨模擬器。2,系統任務處於最低優先順序,在該時刻的最後執行。
Verilog篇(三)模擬原理