0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

介紹下Verilog系統(tǒng)完整的8種編譯指令

冬至子 ? 來(lái)源:數(shù)字IC與好好生活的兩居室 ? 作者:除夕之夜啊 ? 2023-05-29 16:43 ? 次閱讀

以反引號(hào)(`)開(kāi)始的某些標(biāo)識(shí)符是 Verilog 系統(tǒng)編譯指令。編譯指令為 Verilog 代碼的撰寫(xiě)、編譯、調(diào)試等提供了極大的便利。

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

define, undef

◆在編譯階段,`define 用于文本替換,類(lèi)似于 C 語(yǔ)言中的 #define

一旦 `define 指令被編譯,其在整個(gè)編譯過(guò)程中都會(huì)有效。例如,在一個(gè)文件中定義:

`define    DATA_DW     32
則在另一個(gè)文件中也可以直接使用 DATA_DW。
`define    S     $stop;   
//用`S來(lái)代替系統(tǒng)函數(shù)$stop; (包括分號(hào))
`define    WORD_DEF   reg [31:0]       
//可以用`WORD_DEF來(lái)聲明32bit寄存器變量

◆`undef 用來(lái)取消之前的宏定義

`define    DATA_DW     32
……
reg  [DATA_DW-1:0]    data_in   ;
……
`undef DATA_DW

ifdef, ifndef, elsif, else, `endif

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

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

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

當(dāng)然,也可用 `ifndef 來(lái)設(shè)置條件編譯,表示如果沒(méi)有相關(guān)的宏定義,則執(zhí)行相關(guān)語(yǔ)句。

下面例子中,如果定義了 WINDOW,則使用第二種參數(shù)說(shuō)明。如果沒(méi)有定義 WINDOW,則使用第一種參數(shù)說(shuō)明。

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

`include

使用 `include 可以在編譯時(shí)將一個(gè) Verilog 文件內(nèi)嵌到另一個(gè) Verilog 文件中,作用類(lèi)似于 C 語(yǔ)言中的 #include 結(jié)構(gòu)。該指令通常用于將全局或公用的頭文件包含在設(shè)計(jì)文件里。

文件路徑既可以使用相對(duì)路徑,也可以使用絕對(duì)路徑。

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

`timescale

在 Verilog 模型中,時(shí)延有具體的單位時(shí)間表述,并用 `timescale 編譯指令將時(shí)間單位與實(shí)際時(shí)間相關(guān)聯(lián)。

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

`timescale      time_unit / time_precision

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

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

在編譯過(guò)程中,timescale 指令會(huì)影響后面所有模塊中的時(shí)延值,直至遇到另一個(gè) timescale 指令或 ` resetall 指令。

◆由于在 Verilog 中沒(méi)有默認(rèn)的 timescale,如果沒(méi)有指定 timescale,Verilog 模塊就有會(huì)繼承前面編譯模塊的 `timescale 參數(shù)。有可能導(dǎo)致設(shè)計(jì)出錯(cuò)。

◆如果一個(gè)設(shè)計(jì)中的多個(gè)模塊都帶有 `timescale 時(shí),模擬器總是定位在所有模塊的最小時(shí)延精度上,并且所有時(shí)延都相應(yīng)地?fù)Q算為最小時(shí)延精度,時(shí)延單位并不受影響。例如:

`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 對(duì)應(yīng) 5.21ns。

在模塊 test 中,1.28 對(duì)應(yīng) 13ns,3.1 對(duì)應(yīng) 31ns。

但是,當(dāng)仿真 test 時(shí),由于 AndFunc 中的最小精度為 10ps,因此 test 中的時(shí)延精度將進(jìn)行重新調(diào)整。13ns 將對(duì)應(yīng) 130010ps,31ns 將對(duì)應(yīng) 310010ps。仿真時(shí),時(shí)延精度也會(huì)使用 10ps。仿真時(shí)間單位大小沒(méi)有影響。

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

例如在模塊 test 中再例化一個(gè)子模塊 OrFunc。仿真 test 時(shí),OrFunc 中的 #5.207 延時(shí)依然對(duì)應(yīng) 52ns。

//子模塊:
`timescale 10ns/1ns      //時(shí)間單位為10ns,精度為1ns,合法
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

◆`timescale 的時(shí)間精度設(shè)置是會(huì)影響仿真時(shí)間的。時(shí)間精度越小,仿真時(shí)占用內(nèi)存越多,實(shí)際使用的仿真時(shí)間就越長(zhǎng)。所以如果沒(méi)有必要,應(yīng)盡量將時(shí)間精度設(shè)置的大一些。

`default_nettype

該指令用于為隱式的線網(wǎng)變量指定為線網(wǎng)類(lèi)型,即將沒(méi)有被聲明的連線定義為線網(wǎng)類(lèi)型。

◆`default_nettype wand

該實(shí)例定義的缺省的線網(wǎng)為線與類(lèi)型。因此,如果在此指令后面的任何模塊中的連線沒(méi)有說(shuō)明,那么該線網(wǎng)被假定為線與類(lèi)型。

◆`default_nettype none

該實(shí)例定義后,將不再自動(dòng)產(chǎn)生 wire 型變量。

例如下面第一種寫(xiě)法編譯時(shí)不會(huì)報(bào) Error,第二種寫(xiě)法編譯將不會(huì)通過(guò)。

//Z1 無(wú)定義就使用,系統(tǒng)默認(rèn)Z1為wire型變量,有 Warning 無(wú) Error

module test_and(
       input      A,
       input      B,
       output     Z);
    assign Z1 = A & B ;  
endmodule

//Z1無(wú)定義就使用,由于編譯指令的存在,系統(tǒng)會(huì)報(bào)Error,從而檢查出書(shū)寫(xiě)錯(cuò)誤

`default_nettype none
module test_and(
       input      A,
       input      B,
       output     Z);
    assign Z1 = A & B ;  
endmodule

`resetall

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

`resetall 可以使得缺省連線類(lèi)型為線網(wǎng)類(lèi)型。

當(dāng) resetall 加到模塊最后時(shí),可以將當(dāng)前的 timescale 取消防止進(jìn)一步傳遞,只保證當(dāng)前的 timescale 在局部有效,避免 timescale 的錯(cuò)誤繼承。

celldefine, endcelldefine

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

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

unconnected_drive, nounconnected_drive

在模塊實(shí)例化中,出現(xiàn)在這兩個(gè)編譯指令間的任何未連接的輸入端口,為正偏電路狀態(tài)或者為反偏電路狀態(tài)。

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

`unconnected_drive pull0
. . .
 /*在這兩個(gè)程序指令間的所有未連接的輸入端口為反偏電路狀態(tài)(連接到低電平)*/
`nounconnected_drive
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110187
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7613

    瀏覽量

    137240
  • PLL電路
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

    6431
  • MCU芯片
    +關(guān)注

    關(guān)注

    3

    文章

    253

    瀏覽量

    11568
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一個(gè)簡(jiǎn)單的8位處理器完整設(shè)計(jì)過(guò)程及verilog代碼

    一個(gè)簡(jiǎn)單的8位處理器完整設(shè)計(jì)過(guò)程及verilog代碼,適合入門(mén)學(xué)習(xí)參考,并含有作者個(gè)人寫(xiě)的指令執(zhí)行過(guò)程。
    的頭像 發(fā)表于 04-10 11:43 ?3719次閱讀

    Linux GCC的編譯

    一、Linux 多文件編譯 在上一篇 Linux 的 C 編程我們知道了 Linux 編譯器為 GCC ,以及如何使用 GCC 進(jìn)行
    的頭像 發(fā)表于 09-11 15:18 ?2673次閱讀
    Linux <b class='flag-5'>下</b>GCC的<b class='flag-5'>編譯</b>

    Verilog 預(yù)編譯

    Verilog 預(yù)編譯Verilog 語(yǔ)言支持宏定義(`define),參數(shù) parameter,局域參數(shù)(localparam)以及`include等內(nèi)容。這些數(shù)據(jù)常量的支持極大方便數(shù)字系統(tǒng)
    發(fā)表于 08-11 09:31

    你知道Verilog HDL編譯指令都有哪些嗎

    Verilog HDL 編譯指令復(fù)雜一點(diǎn)的系統(tǒng)在進(jìn)行設(shè)計(jì)或者驗(yàn)證時(shí),都會(huì)用到一些編譯指令,那
    發(fā)表于 10-14 14:34

    循環(huán)模型編譯Verilog和System Verilog語(yǔ)言支持指南

    本節(jié)介紹循環(huán)模型編譯器響應(yīng)不受支持或被忽略的構(gòu)造的行為。 一般而言,Cycle Model Compiler支持Verilog和SystemVerilog語(yǔ)言的大部分可合成子集。 如果周期模型
    發(fā)表于 08-12 06:55

    NICE自定義指令如何被編譯生成匯編文件和.verilog二進(jìn)制文件?

    在學(xué)習(xí)官方的demo_nice例程時(shí),使用了 NICE Instruction的自定義指令,但是不太理解自己在.c文件中定義的指令是如何被編譯器識(shí)別,編譯生成匯編文件和.
    發(fā)表于 08-16 06:46

    Verilog HDL硬件描述語(yǔ)言_Verilog語(yǔ)言要素

    本章介紹Verilog HDL的基本要素,包括標(biāo)識(shí)符、注釋、數(shù)值、編譯程序指令、系統(tǒng)任務(wù)和系統(tǒng)
    發(fā)表于 04-25 16:09 ?17次下載

    Verilog的語(yǔ)言要素

    本章介紹Verilog HDL的基本要素,包括標(biāo)識(shí)符、注釋、數(shù)值、編譯程序指令系統(tǒng)任務(wù)和系統(tǒng)
    發(fā)表于 02-11 17:01 ?2009次閱讀
    <b class='flag-5'>Verilog</b>的語(yǔ)言要素

    verilog編譯指令_verilog編譯器指示語(yǔ)句(數(shù)字IC)

    以`(反引號(hào))開(kāi)始的某些標(biāo)識(shí)符是編譯指令。在Verilog 語(yǔ)言編譯時(shí),特定的編譯指令在整個(gè)
    的頭像 發(fā)表于 03-23 13:40 ?1.5w次閱讀
    <b class='flag-5'>verilog</b><b class='flag-5'>編譯</b><b class='flag-5'>指令</b>_<b class='flag-5'>verilog</b><b class='flag-5'>編譯</b>器指示語(yǔ)句(數(shù)字IC)

    淺析VerilogHDL編譯系統(tǒng)的預(yù)處理

    。在Verilog HDL語(yǔ)言編譯時(shí),特定的編譯指令在整個(gè)編譯過(guò)程中有效(編譯過(guò)程可跨越多個(gè)文件
    發(fā)表于 03-26 16:10 ?772次閱讀

    C語(yǔ)言編譯器常見(jiàn)的預(yù)編譯指令詳細(xì)資料說(shuō)明

    編譯器對(duì)C程序的處理可以明確地分為兩步。第一步由預(yù)編譯器完成。以#開(kāi)頭的預(yù)編譯指令可能會(huì)影響編譯器設(shè)置或者進(jìn)行文本替換。注意,預(yù)
    發(fā)表于 06-05 17:52 ?2次下載
    C語(yǔ)言<b class='flag-5'>編譯</b>器常見(jiàn)的預(yù)<b class='flag-5'>編譯</b><b class='flag-5'>指令</b>詳細(xì)資料說(shuō)明

    淺談?lì)A(yù)編譯指令常見(jiàn)用法

    很多優(yōu)秀的代碼,都會(huì)借用預(yù)編譯指令來(lái)完善代碼,今天就來(lái)講講關(guān)于預(yù)編譯指令的內(nèi)容。 常見(jiàn)的預(yù)處理指令如下: #
    的頭像 發(fā)表于 06-23 17:30 ?1625次閱讀
    淺談?lì)A(yù)<b class='flag-5'>編譯</b><b class='flag-5'>指令</b>常見(jiàn)用法

    如何使用Icarus Verilog+GTKWave來(lái)進(jìn)行verilog文件的編譯和仿真

    本文將介紹如何使用Icarus Verilog+GTKWave來(lái)進(jìn)行verilog文件的編譯和仿真。 Icarus Verilog Icar
    的頭像 發(fā)表于 07-27 09:16 ?5438次閱讀
    如何使用Icarus <b class='flag-5'>Verilog</b>+GTKWave來(lái)進(jìn)行<b class='flag-5'>verilog</b>文件的<b class='flag-5'>編譯</b>和仿真

    簡(jiǎn)單介紹-Verilog-AMS的基礎(chǔ)知識(shí)

    -Verilog-AMS,今天就簡(jiǎn)單介紹-Verilog-AMS。 為了便于物理系統(tǒng)的建模,人們?cè)?b class='flag-5'>V
    的頭像 發(fā)表于 10-21 14:50 ?9900次閱讀
    簡(jiǎn)單<b class='flag-5'>介紹</b>一<b class='flag-5'>下</b>-<b class='flag-5'>Verilog</b>-AMS的基礎(chǔ)知識(shí)

    Verilog HDL 編譯指令說(shuō)明

    Verilog HDL 編譯指令 復(fù)雜一點(diǎn)的系統(tǒng)在進(jìn)行設(shè)計(jì)或者驗(yàn)證時(shí),都會(huì)用到一些編譯指令,
    的頭像 發(fā)表于 11-03 09:31 ?3803次閱讀
    <b class='flag-5'>Verilog</b> HDL <b class='flag-5'>編譯</b>器<b class='flag-5'>指令</b>說(shuō)明