91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Verilog編譯指令怎么使用

發布時間:2023-04-11 15:44:39 來源:億速云 閱讀:116 作者:iii 欄目:開發技術

這篇“Verilog編譯指令怎么使用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Verilog編譯指令怎么使用”文章吧。

Verilog 編譯指令

編譯指令為 Verilog 代碼的撰寫、編譯、調試等提供了極大的便利。

下面介紹下完整的 8 種編譯指令,其中前 4 種使用頻率較高。

define, undef

在編譯階段,`define 用于文本替換,類似于 C 語言中的 #define

一旦 `define 指令被編譯,其在整個編譯過程中都會有效。例如,在一個文件中定義:

`define    DATA_DW     32

則在另一個文件中也可以直接使用 DATA_DW。

`define    S     $stop;   
//用`S來代替系統函數$stop; (包括分號)
`define    WORD_DEF   reg [31:0]       
//可以用`WORD_DEF來聲明32bit寄存器變量

`undef 用來取消之前的宏定義,例如:

`define    DATA_DW     32
……
reg  [DATA_DW-1:0]    data_in   ;
……
`undef DATA_DW
`ifdef, `ifndef, `elsif, `else, `endif

這些屬于條件編譯指令。例如下面的例子中,如果定義了 MCU51,則使用第一種參數說明;如果沒有定義 MCU、定義了 WINDOW,則使用第二種參數說明;如果 2 個都沒有定義,則使用第三種參數說明。

`ifdef       MCU51
    parameter DATA_DW = 8   ;
`elsif       WINDOW
    parameter DATA_DW = 64  ;
`else
    parameter DATA_DW = 32  ;
`endif

elsif, else 編譯指令對于 ifdef 指令是可選的,即可以只有 ifdef 和 `endif 組成一次條件編譯指令塊。

當然,也可用 `ifndef 來設置條件編譯,表示如果沒有相關的宏定義,則執行相關語句。

下面例子中,如果定義了 WINDOW,則使用第二種參數說明。如果沒有定義 WINDOW,則使用第一種參數說明。

`ifndef     WINDOW
    parameter DATA_DW = 32 ;  
 `else
    parameter DATA_DW = 64 ;
 `endif

`include

使用 `include 可以在編譯時將一個 Verilog 文件內嵌到另一個 Verilog 文件中,作用類似于 C 語言中的 #include 結構。該指令通常用于將全局或公用的頭文件包含在設計文件里。

文件路徑既可以使用相對路徑,也可以使用絕對路徑。

`include         "../../param.v"
`include         "header.v"

`timescale

在 Verilog 模型中,時延有具體的單位時間表述,并用 `timescale 編譯指令將時間單位與實際時間相關聯。

該指令用于定義時延、仿真的單位和精度,格式為:

time_unit 表示時間單位,time_precision 表示時間精度,它們均是由數字以及單位 s(秒),ms(毫秒),us(微妙),ns(納秒),ps(皮秒)和 fs(飛秒)組成。時間精度可以和時間單位一樣,但是時間精度大小不能超過時間單位大小,例如下面例子中,輸出端 Z 會延遲 5.21ns 輸出 A&B 的結果。

`timescale 1ns/100ps    //時間單位為1ns,精度為100ps,合法
//`timescale 100ps/1ns  //不合法
module AndFunc(Z, A, B);
    output Z;
    input A, B ;
    assign #5.207 Z = A & B
endmodule

在編譯過程中,timescale 指令會影響后面所有模塊中的時延值,直至遇到另一個 timescale 指令或 `resetall 指令。

由于在 Verilog 中沒有默認的 timescale,如果沒有指定 timescale,Verilog 模塊就有會繼承前面編譯模塊的 `timescale 參數。有可能導致設計出錯。

如果一個設計中的多個模塊都帶有 `timescale 時,模擬器總是定位在所有模塊的最小時延精度上,并且所有時延都相應地換算為最小時延精度,時延單位并不受影響。例如:

`timescale 10ns/1ns      
module test;
    reg        A, B ;
    wire       OUTZ ;
 
    initial begin
        A     = 1;
        B     = 0;
        # 1.28    B = 1;
        # 3.1     A = 0;
    end
 
    AndFunc        u_and(OUTZ, A, B) ;
endmodule

在模塊 AndFunc 中,5.207 對應 5.21ns。

在模塊 test 中,1.28 對應 13ns,3.1 對應 31ns。

但是,當仿真 test 時,由于 AndFunc 中的最小精度為 100ps,因此 test 中的時延精度將進行重新調整。13ns 將對應 130100ps,31ns 將對應 310100ps。仿真時,時延精度也會使用 100ps。仿真時間單位大小沒有影響。

如果有并行子模塊,子模塊間的 `timescale 并不會相互影響。

例如在模塊 test 中再例化一個子模塊 OrFunc。仿真 test 時,OrFunc 中的 #5.207 延時依然對應 52ns。

//子模塊:
`timescale 10ns/1ns      //時間單位為1ns,精度為100ps,合法
module OrFunc(Z, A, B);
    output Z;
    input A, B ;
    assign #5.207 Z = A | B
endmodule
 
//頂層模塊:
`timescale 10ns/1ns      
module test;
    reg        A, B ;
    wire       OUTZ ;
    wire       OUTX ;
 
    initial begin
        A     = 1;
        B     = 0;
        # 1.28    B = 1;
        # 3.1     A = 0;
    end
 
    AndFunc        u_and(OUTZ, A, B) ;
    OrFunc         u_and(OUTX, A, B) ;
 
endmodule

此例中,仿真 test 時,OrFunc 中的 #5.207 延時依然對應 52ns。

`timescale 的時間精度設置是會影響仿真時間的。時間精度越小,仿真時占用內存越多,實際使用的仿真時間就越長。所以如果沒有必要,應盡量將時間精度設置的大一些。

`default_nettype

該指令用于為隱式的線網變量指定為線網類型,即將沒有被聲明的連線定義為線網類型。

該實例定義的缺省的線網為線與類型。因此,如果在此指令后面的任何模塊中的連線沒有說明,那么該線網被假定為線與類型。

該實例定義后,將不再自動產生 wire 型變量。

例如下面第一種寫法編譯時不會報 Error,第二種寫法編譯將不會通過。

//Z1 無定義就使用,系統默認Z1為wire型變量,有 Warning 無 Error
module test_and(
        input      A,
        input      B,
        output     Z);
    assign Z1 = A & B ;  
endmodule
//Z1無定義就使用,由于編譯指令的存在,系統會報Error,從而檢查出書寫錯誤
`default_nettype none
module test_and(
        input      A,
        input      B,
        output     Z);
    assign Z1 = A & B ;  
endmodule

`resetall

該編譯器指令將所有的編譯指令重新設置為缺省值。

`resetall 可以使得缺省連線類型為線網類型。

當 resetall 加到模塊最后時,可以將當前的 timescale 取消防止進一步傳遞,只保證當前的 timescale 在局部有效,避免 timescale 的錯誤繼承。

celldefine, endcelldefine

這兩個程序指令用于將模塊標記為單元模塊,他們包含模塊的定義。例如一些與、或、非門,一些 PLL 單元,PAD 模型,以及一些 Analog IP 等。

`celldefine
module (
    input      clk,
    input      rst,
    output     clk_pll,
    output     flag);
        ……
endmodule
`endcelldefine

unconnected_drive, nounconnected_drive

在模塊實例化中,出現在這兩個編譯指令間的任何未連接的輸入端口,為正偏電路狀態或者為反偏電路狀態。

`unconnected_drive pull1
. . .
 / *在這兩個程序指令間的所有未連接的輸入端口為正偏電路狀態(連接到高電平) * /
`nounconnected_drive
`unconnected_drive pull0
. . .
 / *在這兩個程序指令間的所有未連接的輸入端口為反偏電路狀態(連接到低電平) * /
`nounconnected_drive

以上就是關于“Verilog編譯指令怎么使用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

竹溪县| 安化县| 山丹县| 东源县| 石家庄市| 双桥区| 饶阳县| 兰考县| 阳东县| 兰西县| 集安市| 西充县| 蕲春县| 黑山县| 乌苏市| 莱阳市| 临漳县| 揭东县| 石泉县| 深州市| 德清县| 舒兰市| 鹤岗市| 高碑店市| 阿巴嘎旗| 南涧| 玛纳斯县| 扎囊县| 孝昌县| 江都市| 太仆寺旗| 武邑县| 马关县| 蒲江县| 黎川县| 枞阳县| 阿瓦提县| 昌乐县| 新昌县| 柳江县| 改则县|