Verilog 過(guò)程結(jié)構(gòu)

2022-05-17 10:21 更新

關(guān)鍵詞:initial, always

過(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ǔ)句

?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í)行。


always 語(yǔ)句

與 ?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)擊這里下載源碼


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)