久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    Verilog HDL宏定義define

     春華_秋實 2012-05-20
    HDL宏定義define
    作者:凱娜科技 日期:2012-5-18 瀏覽次數:15
    -

    宏定義 `define

     

    用一個指定的標識符(即名字)來代表一個字符串,它的一般形式為:

     

    `define 標識符(宏名) 字符串(宏內容)

     

    如:`define signal string

     

    它的作用是指定用標識符signal來代替string這個字符串,在編譯預處理時,把程序中在該命令以后所有的signal都替換成string。這種方法使用戶能以一個簡單的名字代替一個長的字符串,也可以用一個有含義的名字來代替沒有含義的數字和符號,因此把這個標識符(名字)稱為“宏名”,在編譯預處理時將宏名替換成字符串的過程稱為“宏展開”。`define是宏定義命令。

     

    [1]`define  WORDSIZE 8

    module

    reg[1:`WORDSIZE]  data; //這相當于定義 reg[1:8] data;

     

    關于宏定義的八點說明:

     

    1)       宏名可以用大寫字母表示,也可以用小寫字母表示。建議使用大寫字母,以與變量名相區別。

    2)       `define命令可以出現在模塊定義里面,也可以出現在模塊定義外面。宏名的有效范圍為定義命令之后到原文件結束。通常,`define命令寫在模塊定義的外面,作為程序的一部分,在此程序內有效。

    3)      在引用已定義的宏名時,必須在宏名的前面加上符號“`”,表示該名字是一個經過宏定義的名字。

    4)       使用宏名代替一個字符串,可以減少程序中重復書寫某些字符串的工作量。而且記住一個宏名要比記住一個無規律的字符串容易,這樣在讀程序時能立即知道它的含義,當需要改變某一個變量時,可以只改變 `define命令行,一改全改。如例1中,先定義WORDSIZE代表常量8,這時寄存器data是一個8位的寄存器。如果需要改變寄存器的大小,只需把該命令行改為:`define  WORDSIZE 16。這樣寄存器data則變為一個16位的寄存器。由此可見使用宏定義,可以提高程序的可移植性和可讀性。

    5)       宏定義是用宏名代替一個字符串,也就是作簡單的置換,不作語法檢查。預處理時照樣代入,不管含義是否正確。只有在編譯已被宏展開后的源程序時才報錯。

    6)       宏定義不是Verilog HDL語句,不必在行末加分號。如果加了分號會連分號一起進行置換如:

    [2]module  test;

      reg  a, b, c, d, e, out;

     `define  expression  a+b+c+d;

    assign out = `expression + e;

      ...

        endmodule

     

    經過宏展開以后,該語句為:

    assign  out = a+b+c+d;+e;

    顯然出現語法錯誤。

    7)       在進行宏定義時,可以引用已定義的宏名,可以層層置換。如:

    [3]module test;

    reg  a, b, c;

    wire out;

    `define aa a + b

    `define cc c + `aa

    assign out = `cc;

        endmodule

    這樣經過宏展開以后,assign語句為

    assign  out = c + a + b;

    8)       宏名和宏內容必須在同一行中進行聲明。如果在宏內容中包含有注釋行,注釋行不會作為被置換的內容。如:

     

    [4]: module

            `define typ_nand nand #5  //define a nand with typical delay

         `typ_nand g121(q21,n10,n11);

            ………

            endmodule

     

    經過宏展開以后,該語句為:

     

    nand #5 g121(q21,n10,n11);

     

    宏內容可以是空格,在這種情況下,宏內容被定義為空的。當引用這個宏名時,不會有內容被置換。

     

    注意:組成宏內容的字符串不能夠被以下的語句記號分隔開的。

    ·         注釋行

    ·         數字

    ·         字符串

    ·         確認符

    ·         關鍵詞

    ·         雙目和三目字符運算符

     

    如下面的宏定義聲明和引用是非法的。

    `define  first_half  "start of string

    $display(`first_half end of string");

     

    注意在使用宏定義時要注意以下情況:

     

    1)       對于某些 EDA軟件,在編寫源程序時,如使用和預處理命令名相同的宏名會發生沖突,因此建議不要使用和預處理命令名相同的宏名。

    2)       宏名可以是普通的標識符(變量名)。例如signal_name 'signal_name的意義是不同的。但是這樣容易引起混淆,建議不要這樣使用。

     

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 精品国产AV最大网站| 国产成人亚洲精品无码电影不卡 | 国产JJZZJJZZ视频全部免费| 亚洲AV无码专区亚洲AV桃| 久久综合97丁香色香蕉| 国产啪视频免费观看视频| 久久伊人色AV天堂九九小黄鸭 | 无码国产偷倩在线播放| 久久精品国产亚洲AV麻豆长发| 少妇xxxxx性开放| 老司机67194精品线观看| av午夜福利一片免费看久久| 久久综合亚洲鲁鲁九月天| 成人免费无遮挡在线播放| 真实国产熟睡乱子伦视频| 天天爽夜夜爱| 无码AV无码天堂资源网影音先锋| 国产精品三级中文字幕| 精品亚洲欧美无人区乱码| 欧美不卡无线在线一二三区观| 99久久免费精品国产72精品九九| 亚洲av成人在线一区| 久久久久亚洲AV成人网人人网站| 欧美成人免费做真爱| 亚洲欧美牲交| 久久久久亚洲精品无码蜜桃| 久久精品国产再热青青青| 中文字幕乱伦视频| 亚洲AV无码精品色午夜果冻| gogogo高清在线观看视频中文| 国产精品久久久天天影视香蕉 | 少妇午夜啪爽嗷嗷叫视频| 亚洲国产成人综合精品| 欧美亚洲国产一区二区三区| 爱性久久久久久久久| 国产成人精品999在线观看| 久久99精品久久久久久齐齐| 国产久免费热视频在线观看| 国产 亚洲 制服 无码 中文| 换着玩人妻中文字幕| 99国精品午夜福利视频不卡99 |