• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > Verilog語言要素

    Verilog語言要素

    作者: 時間:2017-06-06 來源:網絡 收藏

    HDL 中的標識符 (identifier) 可以是任意一組字母、數字、 $ 符號和 _( 下劃線 ) 符號的組合,但標識符的第一個字符必須是字母或者下劃線。另外,標識符是區分大小寫的。以下是標識符的幾個例子:

    Count
    COUNT // 與 Count 不同。
    _R1_D2
    R56_68
    FIVE$

    轉義標識符 (escaped identifier ) 可以在一條標識符中包含任何可打印字符。轉義標識符以 ( 反斜線 ) 符號開頭,以空白結尾(空白可以是一個空格、一個制表字符或換行符)。下面例舉了幾個轉義標識符:

    7400
    .*.$
    {******}
    ~Q
    OutGate 與 OutGate 相同。

    最后這個例子解釋了在一條轉義標識符中,反斜線和結束空格并不是轉義標識符的一部分。也就是說,標識符 OutGate 和標識符 OutGate 恒等。
    HDL 定義了一系列保留字,叫做關鍵詞,它僅用于某些上下文中。 附錄 A 列出了語言中的所有保留字。注意只有小寫的關鍵詞才是保留字。例如,標識符 always( 這是個關鍵詞 ) 與標識符 ALWAYS( 非關鍵詞 ) 是不同的。
       另外,轉義標識符與關鍵詞并不完全相同。標識符 initial 與標識符 initial (這是個關鍵詞)不同。注意這一約定與那些轉義標識符不同。

    注釋

       在 HDL 中有兩種形式的注釋。

    /* 第一種形式 : 可以擴展至
    多行 */

    // 第二種形式 : 在本行結束。

    格式

    Verilog HDL 區分大小寫。也就是說大小寫不同的標識符是不同的。此外, Verilog HDL 是自由格式的,即結構可以跨越多行編寫,也可以在一行內編寫。白空(新行、制表符和空格)沒有特殊意義。下面通過實例解釋說明。

    initial begin Top = 3' b001; #2 Top = 3' b011; end

    和下面的指令一樣 :

    initial
    begin
    Top = 3' b001;
    #2 Top = 3' b011;
    end

    系統任務和函數

       以 $ 字符開始的標識符表示系統任務或系統函數。任務提供了一種封裝行為的機制。這種機制可在設計的不同部分被調用。任務可以返回 0 個或多個值。函數除只能返回一個值以外與任務相同。此外,函數在 0 時刻執行,即不允許延遲,而任務可以帶有延遲。

    $display (Hi, you have reached LT today);
    /* $display 系統任務在新的一行中顯示。 */
    $time
    // 該系統任務返回當前的模擬時間。

       系統任務和系統函數在第 10 章中詳細講解。

    編譯指令

       以 ` (反引號)開始的某些標識符是編譯器指令。在 Verilog 語言編譯時,特定的編譯器指令在整個編譯過程中有效(編譯過程可跨越多個文件),直到遇到其它的不同編譯程序指令。完整的標準編譯器指令如下 :

    * `define, `undef
    * `ifdef, `else, `endif
    * `default_nettype
    * `include
    * `resetall
    * `timescale
    * `unconnected_drive, `nounconnected_drive
    * `celldefine, `endcelldefine

    define 和 `undef

    `define 指令用于文本替換,它很像 C 語言中的 #define 指令,如 :

    `define MAX_BUS_SIZE 32
    . . .
    reg [ `MAX_BUS_SIZE - 1:0 ] AddReg;

    一旦 `define 指令被編譯,其在整個編譯過程中都有效。例如,通過另一個文件中的 `define 指令, MAX_BUS_SIZE 能被多個文件使用。
    `undef 指令取消前面定義的宏。例如 :

    `define WORD 16 // 建立一個文本宏替代。
    . . .
    wire [ `WORD : 1] Bus;
    . . .
    `undef WORD
    // 在 `undef 編譯指令后 , WORD 的宏定義不再有效 .

    ifdef 、 `else 和 `endif

       這些編譯指令用于條件編譯,如下所示:

    `ifdef WINDOWS
    parameter WORD_SIZE = 16
    `else
    parameter WORD_SIZE = 32
    `endif

       在編譯過程中,如果已定義了名字為 WINDOWS 的文本宏,就選擇第一種參數聲明,否則選擇第二種參數說明。
    `else 程序指令對于 `ifdef 指令是可選的。

    default_nettype

       該指令用于為隱式線網指定線網類型。也就是將那些沒有被說明的連線定義線網類型。

    `default_nettype wand

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

    include

    `include 編譯器指令用于嵌入內嵌文件的內容。文件既可以用相對路徑名定義,也可以用全路徑名定義 , 例如 :

    `include . . / . . /primitives.v

       編譯時,這一行由文件 “../../primitives.v” 的內容替代。

    resetall

       該編譯器指令將所有的編譯指令重新設置為缺省值。
    `resetall
    例如,該指令使得缺省連線類型為線網類型。

    timescale

       在 Verilog HDL 模型中,所有時延都用單位時間表述。使用 `timescale 編譯器指令將時間單位與實際時間相關聯。該指令用于定義時延的單位和時延精度。 `timescale 編譯器指令格式為:

    `timescale time_unit / time_precision
    time_unit 和 time_precision 由值 1 、 10 、和 100 以及單位 s 、 ms 、 us 、 ns 、 ps 和 fs 組成。例如:
    `timescale 1ns/100ps

    本文引用地址:http://www.czjhyjcfj.com/article/201706/349521.htm


    表示時延單位為 1ns, 時延精度為 100ps 。 `timescale 編譯器指令在模塊說明外部出現 , 并且影響后面所有的時延值。例如 :

    `timescale 1ns/ 100ps
    module AndFunc (Z, A, B);
    output Z;
    input A, B;

    and # (5.22, 6.17 ) Al (Z, A, B);
    // 規定了上升及下降時延值。
    endmodule

       編譯器指令定義時延以 ns 為單位,并且時延精度為 1/10 ns ( 100 ps )。因此,時延值 5.22 對應 5.2 ns, 時延 6.17 對應 6.2 ns 。如果用如下的 `timescale 程序指令代替上例中的編譯器指令 ,

    `timescale 10ns/1ns

       那么 5.22 對應 52ns, 6.17 對應 62ns 。
       在編譯過程中, `timescale 指令影響這一編譯器指令后面所有模塊中的時延值,直至遇到另一個 `timescale 指令或 `resetall 指令。當一個設計中的多個模塊帶有自身的 `timescale 編譯指令時將發生什么?在這種情況下,模擬器總是定位在所有模塊的最小時延精度上,并且所有時延都相應地換算為最小時延精度。例如,

    `timescale 1ns/ 100ps
    module AndFunc (Z, A, B);
    output Z;
    input A, B;

    and # (5.22, 6.17 ) Al (Z, A, B);
    endmodule

    `timescale 10ns/ 1ns
    module TB;
    reg PutA, PutB;
    wire GetO;

    initial
    begin
    PutA = 0;
    PutB = 0;
    #5.21 PutB = 1;
    #10.4 PutA = 1;
    #15 PutB = 0;
    end
    AndFunc AF1(GetO, PutA, PutB);
    endmodule

       在這個例子中,每個模塊都有自身的 `timescale 編譯器指令。 `timescale 編譯器指令第一次應用于時延。因此,在第一個模塊中, 5.22 對應 5.2 ns, 6.17 對應 6.2 ns; 在第二個模塊中 5.21 對應 52 ns, 10.4 對應 104 ns, 15 對應 150 ns 。如果仿真模塊 TB ,設計中的所有模塊最小時間精度為 100 ps 。因此,所有延遲(特別是模塊 TB 中的延遲)將換算成精度為 100 ps 。延遲 52 ns 現在對應 520*100 ps , 104 對應 1040*100 ps , 150 對應 1500*100 ps 。更重要的是,仿真使用 100 ps 為時間精度。如果仿真模塊 AndFunc ,由于模塊 TB 不是模塊 AddFunc 的子模塊,模塊 TB 中的 `timescale 程序指令將不再有效。

    unconnected_drive 和 `nounconnected_drive

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

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

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

    celldefine 和 `endcelldefine

    這兩個程序指令用于將模塊標記為單元模塊。它們表示包含模塊定義,如下例所示。

    `celldefine
    module FD1S3AX (D, CK, Z) ;
    . . .
    endmodule
    `endcelldefine

       某些 PLI 例程使用單元模塊。

    值集合

    Verilog HDL 有下列四種基本的值:
    1) 0 :邏輯 0 或 “ 假 ”
    2) 1 :邏輯 1 或 “ 真 ”
    3) x :未知
    4) z :高阻
       注意這四種值的解釋都內置于語言中。如一個為 z 的值總是意味著高阻抗,一個為 0 的值通常是指邏輯 0 。
    在門的輸入或一個表達式中的為 “z” 的值通常解釋成 “x” 。此外, x 值和 z 值都是不分大小寫的,也就是說,值 0x1z 與值 0X1Z 相同。 Verilog HDL 中的常量是由以上這四類基本值組成的。
    Verilog HDL 中有三類常量:
    1) 整型
    2) 實數型
    3) 字符串型
    下劃線符號( _ )可以隨意用在整數或實數中,它們就數量本身沒有意義。它們能用來提高易讀性;唯一的限制是下劃線符號不能用作為首字符。

    整型數

       整型數可以按如下兩種方式書寫:
    1) 簡單的十進制數格式
    2) 基數格式

    1. 簡單的十進制格式
    這種形式的整數定義為帶有一個可選的 “+” (一元)或 “ - ” (一元)操作符的數字序列。下面是這種簡易十進制形式整數的例子。
    32 十進制數 32
    - 15 十進制數- 15
    這種形式的整數值代表一個有符號的數。負數可使用兩種補碼形式表示。因此 32 在 5 位的二進制形式中為 10000 ,在 6 位二進制形式中為 110001 ;- 15 在 5 位二進制形式中為 10001 ,在 6 位二進制形式中為 110001 。

    2. 基數表示法
    這種形式的整數格式為:
    [size ] 'base value
    size 定義以位計的常量的位長; base 為 o 或 O (表示八進制), b 或 B (表示二進制), d 或 D (表示十進制), h 或 H (表示十六進制)之一; value 是基于 base 的值的數字序列。值 x 和 z 以及十六進制中的 a 到 f 不區分大小寫。
    下面是一些具體實例:

    5'O37 5 位八進制數
    4'D2 4 位十進制數
    4'B1x_01 4 位二進制數
    7'Hx 7 位 x( 擴展的 x), 即 xxxxxxx
    4'hZ 4 位 z( 擴展的 z) , 即 zzzz
    4'd-4 非法:數值不能為負
    8'h 2 A 在位長和字符之間 , 以及基數和數值之間允許出現空格
    3'b001 非法 : ` 和基數 b 之間不允許出現空格
    (2+3)'b10 非法 : 位長不能夠為表達式
    注意, x (或 z )在十六進制值中代表 4 位 x (或 z ),在八進制中代表 3 位 x (或 z ),在二進制中代表 1 位 x (或 z )。
       基數格式計數形式的數通常為無符號數。這種形式的整型數的長度定義是可選的。如果沒有定義一個整數型的長度,數的長度為相應值中定義的位數。下面是兩個例子:
    'o721 9 位八進制數
    'hAF 8 位十六進制數
    如果定義的長度比為常量指定的長度長,通常在左邊填 0 補位。但是如果數最左邊一位為 x 或 z ,就相應地用 x 或 z 在左邊補位。例如:
    10'b10 左邊添 0 占位 , 0000000010
    10'bx0x1 左邊添 x 占位 ,xxxxxxx0x1
    如果長度定義得更小,那么最左邊的位相應地被截斷。例如:
    3'b1001_0011 與 3'b011 相等
    5'H0FFF 與 5'H1F 相等
    ?字符在數中可以代替值 z 在值 z 被解釋為不分大小寫的情況下提高可讀性(參見第 8 章)。

    實數

       實數可以用下列兩種形式定義:
    1) 十進制計數法;例如

    2.0
    5.678
    11572.12
    0.1
    2. // 非法:小數點兩側必須有 1 位數字

    2) 科學計數法; 這種形式的實數舉例如下:

    23_5.1e2 其值為 23510.0; 忽略下劃線
    3.6E2 360.0 (e 與 E 相同 )
    5E - 4 0.0005

    Verilog 語言定義了實數如何隱式地轉換為整數。實數通過四舍五入被轉換為最相近的整數。

    42.446 , 42.45 轉換為整數 42
    92.5, 92.699 轉換為整數 93
    - 15.62 轉換為整數- 16
    - 26.22 轉換為整數- 26

    字符串

       字符串是雙引號內的字符序列。字符串不能分成多行書寫。例如 :

    INTERNAL ERROR
    REACHED - >HERE

    用 8 位 ASCII 值表示的字符可看作是無符號整數。因此字符串是 8 位 ASCII 值的序列。為存儲字符串 “INTERNAL ERROR” ,變量需要 8*14 位。

    reg [1 : 8*14] Message;
    . . .
    Message = INTERNAL ERROR
    反斜線 ( ) 用于對確定的特殊字符轉義。
    n 換行符
    t 制表符
    字符 本身
    字符
    206 八進制數 206 對應的字符



    關鍵詞: Verilog 語言要素 VHDL

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 南涧| 故城县| 东平县| 青岛市| 赣榆县| 年辖:市辖区| 绿春县| 上林县| 威信县| 巧家县| 屏山县| 恩施市| 自贡市| 万安县| 凌海市| 南陵县| 嘉祥县| 三台县| 时尚| 广丰县| 怀仁县| 上虞市| 江西省| 日照市| 酒泉市| 达拉特旗| 哈尔滨市| 宝清县| 巩留县| 安仁县| 盖州市| 平遥县| 龙江县| 施秉县| 桂林市| 获嘉县| 工布江达县| 华安县| 青岛市| 娄底市| 新龙县|