Verilog 過程結構簡述

大雄45發表於2020-11-02
導讀 過程結構語句有 2 種,initial 與 always 語句。它們是行為級建模的 2 種基本語句。一個模組中可以包含多個 initial 和 always 語句,但 2 種語句不能巢狀使用。
關鍵詞:initial, always

過程結構語句有 2 種,initial 與 always 語句。它們是行為級建模的 2 種基本語句。

一個模組中可以包含多個 initial 和 always 語句,但 2 種語句不能巢狀使用。

這些語句在模組間並行執行,與其在模組的前後順序沒有關係。

但是 initial 語句或 always 語句內部可以理解為是順序執行的(非阻塞賦值除外)。

每個 initial 語句或 always 語句都會產生一個獨立的控制流,執行時間都是從 0 時刻開始。

initial語句

initial 語句從 0 時刻開始執行,只執行一次,多個 initial 塊之間是相互獨立的。

如果 initial 塊內包含多個語句,需要使用關鍵字 begin 和 end 組成一個塊語句。

如果 initial 塊內只要一條語句,關鍵字 begin 和 end 可使用也可不使用。

initial 理論上來講是不可綜合的,多用於初始化、訊號檢測等。

對上一節程式碼稍作修改,進行模擬,程式碼如下。

例項

`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

模擬結果如下:

可以看出,2 個 initial 程式語句分別給訊號 ai,bi 賦值時,相互間並沒有影響。

訊號 ai,bi 的值按照賦值順序依次改變,所以 initial 內部語句也可以看做是順序執行。
Verilog 過程結構簡述Verilog 過程結構簡述

always 語句

與 initial 語句相反,always 語句是重複執行的。always 語句塊從 0 時刻開始執行其中的行為語句;當執行完最後一條語句後,便再次執行語句塊中的第一條語句,如此迴圈反覆。

由於迴圈執行的特點,always 語句多用於模擬時鐘的產生,訊號行為的檢測等。

下面用 always 產生一個 100MHz 時鐘源,並在 110ns 時停止模擬程式碼如下。

程式碼如下:

例項

`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

模擬結果如下:

可見,時鐘週期是我們想要得到的 100MHz。而且模擬在 110ns 時停止。
Verilog 過程結構簡述Verilog 過程結構簡述

原文來自:   


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2731734/,如需轉載,請註明出處,否則將追究法律責任。

相關文章