Verilog HDL宏定义define


HDL宏定义define

宏定义 `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的意义是不同的。但是这样容易引起混淆,建议不要这样使用。

时间: 2024-08-18 03:33:49

Verilog HDL宏定义define的相关文章

编程-写一个宏定义#define 求高手作答。

问题描述 写一个宏定义#define 求高手作答. 今天突发奇想,object C里面 @""hello"" 就代表了 hello 的字符串. 然后C++里面 ""hello"" 即代表 hello 字符串. 能否写个define 类似于 @""__str__"" = ""__str__"" 的功能. 类似 #define @""

C语言中的内联函数(inline)与宏定义(#define)详细解析_C 语言

先简明扼要,说下关键:1.内联函数在可读性方面与函数是相同的,而在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样在运行时速度更快. 2.内联函数可以调试,而宏定义是不可以调试的.内联函数与宏本质上是两个不同的概念如果程序编写者对于既要求快速,又要求可读的情况下,则应该将函数冠以inline.下面详细介绍一下探讨一下内联函数与宏定义. 一.内联函数是什么?内联函数是代码被插入到调用者代码处的函数.如同 #define 宏(但并不等同,原因见下文),内联函数通过避免被调用的开销来提

关于C语言宏定义#define的心得

http://www.cnblogs.com/zhidian314/archive/2013/01/10/2855340.html

【进阶】关于宏定义和内联函数

Tips: 1. 对于单纯常量,尽量用const对象或者enums替换 #define 2. 对于形似函数的宏(marcos),最好改用inline函数替换#define 我们先来看一般的宏定义 #define ASPECT_RATIO 1.653; 记号名称为ASPECT_RATIO也许从未被编译器看见: 也许在编译器开始处理源码之前它就被预处理器取走了.于是记号ASPECT_RATIO有可能没有进入到几号表(symbol table)内,于是当你运用此常量获得一个编译错误信息时,可能会带来困

宏定义中的##操作符和... and _ _VA_ARGS_ _

1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used in the replacement section of a function-like macro.Additionally, it can be used in the replacement section of an object-like macro. The ## operator co

详解C语言中的#define宏定义命令用法_C 语言

#define命令#define定义了一个标识符及一个串.在源程序中每次遇到该标识符时,均以定义的串代换它.ANSI标准将标识符定义为宏名,将替换过程称为宏替换.命令的一般形式为: #define identifier string 注意: 1.该语句没有分号.在标识符和串之间可以有任意个空格,串一旦开始,仅由一新行结束. 2.宏名定义后,即可成为其它宏名定义中的一部分. 3.宏替换仅仅是以文本串代替宏标识符,前提是宏标识符必须独立的识别出来,否则不进行替换.例如: #define XYZ th

宏定义的黑魔法 - 宏菜鸟起飞手册

宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行.而在更高层级进行开发时,我们会将更多的重心放在业务逻辑上,似乎对宏的使用和依赖并不多.但是使用宏定义的好处是不言自明的,在节省工作量的同时,代码可读性大大增加.如果想成为一个能写出漂亮优雅代码的开发者,宏定义绝对是必不可少的技能(虽然宏本身可能并不漂亮优雅XD).但是因为宏定义对于很多人来说,并不像业务逻辑那样是每天会接触的东西.即使是能偶尔使

C宏定义的小结

实现代码实例 程序代码: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> /***** cplusplus *****/ #if 0 #include <iostream> using namespace std; #endif // 得到指定地址上的一个字节或字 #define MEM_B(x) (*((byte *)(x))) #define MEM_W(x) (*((word

C语言宏定义使用技巧

写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等.下面列举一些成熟软件中常用得宏定义-- 1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植. typedef unsigned char boolean: /* Boolean value type. */ typedef unsigned l