zoukankan      html  css  js  c++  java
  • VerilogHDL编译预处理

    编译预处理语句

    编译预处理是VerilogHDL编译系统的一个组成部分,指编译系统会对一些特殊命令进行预处理,然后将预处理结果和源程序一起在进行通常的编译处理。以”`” (反引号)开始的某些标识符是编译预处理语句。在Verilog HDL语言编译时,特定的编译指令在整个编译过程中有效(编译过程可跨越多个文件),直到遇到其他不同的编译程序指令。常用的编译预处理语句如下:

    (1)`define,`undef

    (2)`include

    (3)`timescale

    (4)`ifdef,`else.`endif

    (5)`default_nettype;

    (6)`resetall

    (7)`unconnect_drive,`nounconnected-drive;

    (8)`celldefine,`endcelldefine


    宏定义

    `define指令是一个宏定义命令,通过一个指定的标识符来代表一个字符串,可以增加Veirlog HDL代码的可读性和可维护性,找出参数或函数不正确或不允许的地方。

    `define指令类似C语言中的#define指令,可以在模块的内部或外部定义,编译器在编译过程中遇到该语句将把宏文本替换为宏的名字。`define的声明语法格式如下: `define,<macro_name><Text>

    对于已声明的语句,在代码中的应用格式如下(不要漏掉宏前面的”`”):

    `macro-name

    例如:define  MAX-BUS-SIZE  32

    ...

    Reg[`MAX-BUS-SIZE-1:0]AddReg;

    一旦`define指令被编译,其在整个编译过程中都有效。例如,通过另一个文件中的`define指令,MAX-BUS-SIZE能被多个文件使用。

    `undef指令用于取消前面定义的宏。例如:

    `undef  WORD16

    ...

    Wire [`WORD:1]Bus;

    ...

    `undef  WORD

    宏定义指令的注意事项:

    (1)    宏定义的名称可以是大写,也可以是小写,但要注意不要和变量名重复。

    (2)    和所有编译器伪指令一样,宏定义在超过单个文件边界时仍有效(对工程的其他源文件),除非被后面的`define、`undef或`resetall伪指令覆盖,否则`define不收范围限制。

    (3)    当用变量定义宏时,变量可以在宏正文中使用,并且在使用宏的时候可以用实际的变量表达式代替。

    (4)    通过用反斜杠””转义中间换行符,宏定义可以跨越几行,新的行是宏正文的一部分。

    (5)    宏定义行末不需要添加分号表示结束。

    (6)    宏正文不能分离的语言记号包括注释、数字、字符串、保留的关键字、运算符。

    (7)    编译器伪指令不允许作为宏的名字。

    (8)    宏定义中的文本也可以是一个表达式,并不仅仅用于变量名称的替换。


    define和parameter

    `define和parameter是有区别的。`define和parameter都可以用于完成文本替换,但其存在本质上的不同,前者是编译之前就预处理,而后者是在正常编译过程中完成替换的。此外,`define和parameter存在下列两点不同之处:
        (1)作用域不同。Parameter作用于声明的那个文件;`define从编译器读到这条指令开始到编译结束都有效,除非遇到`undef命令使之失效,可以应用于整个工程。如果要让parameter作用于整个项目,可以将声明语句写于单独文件中,并用)`include让每个文件都包含声明文件。

    `define可以写在代码的任何位置,而Parameter则必须在应用之前定义。通常编译器都可以定义编译顺序,或者从最底层模块开始编译,因此写在最底层就可以了。
        (2)传递功能不同。Parameter可以用作模块例化时的参数传递,实现参数化调用;`define语句则没有此作用。`define语句可以定义表达式,而Parameter只能定义变量。


     版权所有权归卿萃科技 杭州FPGA事业部,转载请注明出处  

     作者:杭州卿萃科技ALIFPGA 

     原文地址:杭州卿萃科技FPGA极客空间 微信公众号


      

        


  • 相关阅读:
    FEniCS 1.1.0 发布,计算算术模型
    Piwik 1.10 发布,增加社交网站统计
    淘宝褚霸谈做技术的心态
    CyanogenMod 10.1 M1 发布
    Druid 发布 0.2.11 版本,数据库连接池
    GNU Gatekeeper 3.2 发布
    Phalcon 0.9.0 BETA版本发布,新增大量功能
    EUGene 2.6.1 发布,UML 模型操作工具
    CVSps 3.10 发布,CVS 资料库更改收集
    Opera 移动版将采用 WebKit 引擎
  • 原文地址:https://www.cnblogs.com/alifpga/p/8084390.html
Copyright © 2011-2022 走看看