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

2022-05-17 10:21 更新

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

過程結(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語句

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


always 語句

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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號