過程結(jié)構(gòu)語句有 2 種,?initial
?與 ?always
?語句。它們是行為級建模的 2 種基本語句。
一個模塊中可以包含多個 ?initial
?和 ?always
?語句,但 2 種語句不能嵌套使用。
這些語句在模塊間并行執(zhí)行,與其在模塊的前后順序沒有關(guān)系。
但是 ?initial
?語句或 ?always
?語句內(nèi)部可以理解為是順序執(zhí)行的(非阻塞賦值除外)。
每個 ?initial
?語句或 ?always
?語句都會產(chǎn)生一個獨(dú)立的控制流,執(zhí)行時間都是從 0 時刻開始。
?initial
?語句從 0 時刻開始執(zhí)行,只執(zhí)行一次,多個 ?initial
?塊之間是相互獨(dú)立的。
如果 ?initial
?塊內(nèi)包含多個語句,需要使用關(guān)鍵字 ?begin
?和 ?end
?組成一個塊語句。
如果 ?initial
?塊內(nèi)只要一條語句,關(guān)鍵字 ?begin
?和 ?end
?可使用也可不使用。
?initial
?理論上來講是不可綜合的,多用于初始化、信號檢測等。
對上一節(jié)代碼稍作修改,進(jìn)行仿真,代碼如下。
`timescale 1ns/1ns
module test ;
reg ai, bi ;
initial begin
ai = 0 ;
#25 ; ai = 1 ;
#35 ; ai = 0 ; //absolute 60ns
#40 ; ai = 1 ; //absolute 100ns
#10 ; ai = 0 ; //absolute 110ns
end
initial begin
bi = 1 ;
#70 ; bi = 0 ; //absolute 70ns
#20 ; bi = 1 ; //absolute 90ns
end
//at proper time stop the simulation
initial begin
forever begin
#100;
//$display("---gyc---%d", $time);
if ($time >= 1000) begin
$finish ;
end
end
end
endmodule
仿真結(jié)果如下:
可以看出,2 個 ?initial
?進(jìn)程語句分別給信號 ai,bi 賦值時,相互間并沒有影響。
信號 ai,bi 的值按照賦值順序依次改變,所以 ?initial
?內(nèi)部語句也可以看做是順序執(zhí)行。
與 ?initial
?語句相反,?always
?語句是重復(fù)執(zhí)行的。?always
?語句塊從 0 時刻開始執(zhí)行其中的行為語句;當(dāng)執(zhí)行完最后一條語句后,便再次執(zhí)行語句塊中的第一條語句,如此循環(huán)反復(fù)。
由于循環(huán)執(zhí)行的特點(diǎn),?always
?語句多用于仿真時鐘的產(chǎn)生,信號行為的檢測等。
下面用 ?always
?產(chǎn)生一個 100MHz 時鐘源,并在 1010ns 時停止仿真代碼如下。
代碼如下:
`timescale 1ns/1ns
module test ;
parameter CLK_FREQ = 100 ; //100MHz
parameter CLK_CYCLE = 1e9 / (CLK_FREQ * 1e6) ; //switch to ns
reg clk ;
initial clk = 1'b0 ; //clk is initialized to "0"
always # (CLK_CYCLE/2) clk = ~clk ; //generating a real clock by reversing
always begin
#10;
if ($time >= 1000) begin
$finish ;
end
end
endmodule
仿真結(jié)果如下:
可見,時鐘周期是我們想要得到的 100MHz。而且仿真在 1010ns 時停止。
點(diǎn)擊這里下載源碼
更多建議: