過(guò)程結(jié)構(gòu)語(yǔ)句有 2 種,?initial
?與 ?always
?語(yǔ)句。它們是行為級(jí)建模的 2 種基本語(yǔ)句。
一個(gè)模塊中可以包含多個(gè) ?initial
?和 ?always
?語(yǔ)句,但 2 種語(yǔ)句不能嵌套使用。
這些語(yǔ)句在模塊間并行執(zhí)行,與其在模塊的前后順序沒(méi)有關(guān)系。
但是 ?initial
?語(yǔ)句或 ?always
?語(yǔ)句內(nèi)部可以理解為是順序執(zhí)行的(非阻塞賦值除外)。
每個(gè) ?initial
?語(yǔ)句或 ?always
?語(yǔ)句都會(huì)產(chǎn)生一個(gè)獨(dú)立的控制流,執(zhí)行時(shí)間都是從 0 時(shí)刻開始。
?initial
?語(yǔ)句從 0 時(shí)刻開始執(zhí)行,只執(zhí)行一次,多個(gè) ?initial
?塊之間是相互獨(dú)立的。
如果 ?initial
?塊內(nèi)包含多個(gè)語(yǔ)句,需要使用關(guān)鍵字 ?begin
?和 ?end
?組成一個(gè)塊語(yǔ)句。
如果 ?initial
?塊內(nèi)只要一條語(yǔ)句,關(guān)鍵字 ?begin
?和 ?end
?可使用也可不使用。
?initial
?理論上來(lái)講是不可綜合的,多用于初始化、信號(hào)檢測(cè)等。
對(duì)上一節(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 個(gè) ?initial
?進(jìn)程語(yǔ)句分別給信號(hào) ai,bi 賦值時(shí),相互間并沒(méi)有影響。
信號(hào) ai,bi 的值按照賦值順序依次改變,所以 ?initial
?內(nèi)部語(yǔ)句也可以看做是順序執(zhí)行。
與 ?initial
?語(yǔ)句相反,?always
?語(yǔ)句是重復(fù)執(zhí)行的。?always
?語(yǔ)句塊從 0 時(shí)刻開始執(zhí)行其中的行為語(yǔ)句;當(dāng)執(zhí)行完最后一條語(yǔ)句后,便再次執(zhí)行語(yǔ)句塊中的第一條語(yǔ)句,如此循環(huán)反復(fù)。
由于循環(huán)執(zhí)行的特點(diǎn),?always
?語(yǔ)句多用于仿真時(shí)鐘的產(chǎn)生,信號(hào)行為的檢測(cè)等。
下面用 ?always
?產(chǎn)生一個(gè) 100MHz 時(shí)鐘源,并在 1010ns 時(shí)停止仿真代碼如下。
代碼如下:
`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é)果如下:
可見,時(shí)鐘周期是我們想要得到的 100MHz。而且仿真在 1010ns 時(shí)停止。
點(diǎn)擊這里下載源碼
更多建議: