19.3 `define and `undef

提供了文本宏替换功能,可以使用有意义的名称来表示常用的文本片段。例如,在整个描述中重复使用一个常数的情况下,文本宏是有用的,如果常数的值需要改变,因为它只需要更改源描述中的一个位置。
文本宏工具不受编译器指令`resetall的影响。

19.3.1 `define

指令define为文本替换创建了一个宏。这个指令可以在模块定义的内部和外部使用。一个文本宏定义以后,通过使用(`)字符,后面跟着宏的名字,它可以在源代码描述中使用。编译器应该用宏的文本替换字符串`text_macro_name和它后面的实际任何参数。所有的编译指令都应该被认为是预定义的宏名;将编译器指令重定义为宏名是非法的。
文本宏可以用参数定义。这允许为每次使用分别定制宏。
文本宏定义的语法见语法19-2。

宏文本可以是与文本宏名在同一行指定的任意文本。如果需要多行来指定文本,换行符必须在前加反斜杠(\)。第一个不带反斜杠的换行符将结束宏文本。在扩展宏中,前面有反斜杠的换行符将被替换为换行符(但前面没有反斜杠字符)。
当形式化参数被用来定义文本宏时,形式化参数的范围应该扩展到宏文本的末尾。在宏文本中,形式参数可以像标识符一样使用。
如果使用了形式参数,则形式参数名称的列表应括在宏名称后面的括号中。形式参数名应该是simple_identifiers,由逗号和可选的空格分隔。左括号紧跟文本宏名,中间没有空格。
如果文本中包含了单行注释(即用字符//指定的注释),那么该注释将不会成为替换文本的一部分。宏文本可以为空,在这种情况下,文本宏被定义为空,并且在使用宏时不替换任何文本。
使用文本宏的语法见语法19-3。

对于没有参数的宏,文本将替换每次出现的`text_macro_name。但是,具有一个或多个参数的文本宏应该通过将每个正式参数替换为在宏用法中用作实际参数的表达式来扩展。
要使用带有参数定义的宏,文本宏的名称后面应该跟一个包含实际参数的列表,用逗号分隔。文本宏名和左括号之间允许有空白。实际参数的数量应与形式参数的数量相匹配。
一旦定义了文本宏名,它就可以在源描述的任何地方使用;也就是说,没有范围限制。文本宏可以交互地定义和使用。
为宏文本指定的文本不应被拆分为以下词法标记:
—注释
—数字
—字符串
—标识符
—关键词
—操作符
例如:

`define wordsize 8 reg [1:`wordsize] data;
//定义一个带有可变延迟的nand
`define var_nand(dly) nand #dly
`var_nand(2) g121 (q21, n10, n11);
`var_nand(5) g122 (q22, n10, n11);

下面的语法是非法的,因为它被拆分为字符串:

`define first_half "start of string
$display(`first_half end of string");

每一个形式参数被替换位字面意义上的形式参数。因此,当一个表达式被用作实际的参数时,该表达式将被完全替换。如果在宏文本中多次使用形式参数,这可能会导致表达式被求值多次。例如:

`define max(a,b) ((a) > (b) ? (a) : (b))
n = `max(p+q, r+s) ;

被扩展为
n = ((p+q) > (r+s)) ? (p+q) : (r+s) ;
这里,两个表达式中较大的p + q和r + s将被求值两次。
define这个词被称为编译器指令的关键字,它不是普通关键字集合的一部分。因此,Verilog HDL源描述中的普通标识符可以与编译器指令关键字相同(尽管不建议这样做)。应考虑以下问题:
a)文本宏名称可能与编译器指令关键字不同。
b)文本宏名可以重用作为普通标识符使用的名称。例如,signal_name和`signal_name不一样。
c)允许重新定义文本宏;当在源文本中遇到宏名时,编译器读取的特定文本宏的最新定义将生效。
宏文本可以包含其他文本宏的使用。这样的用法应该在原始宏被替换后被替换,而不是在宏被定义时被替换。如果一个宏直接或间接地扩展到包含它自己的另一个用法(递归宏)的文本,那将是一个错误。

19.3.2 `undef

指令`undef将取消先前定义的文本宏的定义。试图取消以前没有使用define编译器指令定义的文本宏可能会导致警告。
编译器指令`undef编译器指令在语法19-4中给出。

未定义的文本宏没有值,就像它从未被定义过一样。

【Verilog-19.3】define和undef的用法相关推荐

  1. Verilog语法之`define、`undef

    在这篇文章<从几个简单例子聊聊Verilog的参数化设计(parameter.localparam和`define)>中已经讨论过 `define 的一些用法,但不太深入,所以今天再说道说 ...

  2. 条件编译#define、#undef、#if、#elif、#elif defined、#elif !defined 、#endif用法

    条件编译 上代码 // what is the fucking shit.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h"#include &l ...

  3. #define、#undef、#ifdef、#ifndef、#if、#elif、#else、#endif、defined解释

    #define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. #define            定义一个预处理宏 #undef     ...

  4. Ext.Net学习笔记19:Ext.Net FormPanel 简单用法

    Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...

  5. VS中使用define和undef实现条件编译(csc.exe条件编译)

    在C和C++中常有用到宏定义#define,在C#中也这个关键字,不过功能不同了,C#中是作为条件编译的条件. #define XXX 是定义XXX为条件编译的条件,相当于将XXX设为true. #u ...

  6. #pragma once 与 #define的含义及用法

    #pragma once 与 #define #pragma once的含义及用法 #define的含义及用法 #pragma once的含义及用法 #pragma once是一个比较常用的C/C++ ...

  7. C语言中#undef的用法

    C语言中#undef的语法定义是:#undef 标识符,用来将前面定义的宏标识符取消定义. 然而,在实际应用中,#undef到底可以用来做什么? 整理了如下几种#undef的常见用法. 1. 防止宏定 ...

  8. 21,verilog之宏define介绍

    注:更多.更详细的相关博文请在博主的个人公众号中查看.公众号:FPGA动力联盟 宏define提供用一个相对简单的文字来表示一大段真正有意义的文字作用.换句话说,就是综合软件见到定义的宏,就用这个宏代 ...

  9. 详解C语言中的#define、#undef、#indef、#ifndef、#else、#endif,#if,#elif

    1. 明示常量#define #define为C语言的一个预处理指令,通常用于进行宏定义.每行#define(逻辑行)一般由以下三部分组成,第一部分是#define指令本身,第二部分为宏,第三部分为称 ...

最新文章

  1. .NET2.0隐形的翅膀,正则表达式搜魂者【月儿原创】
  2. 用摩斯电码通关《黑暗之魂3》!up主自制奇葩手柄,连育碧都找上门合作
  3. python绘制灰度图片直方图-用python简单处理图片(5):图像直方图
  4. 计算机建筑材料考试试题,建筑材料试题(建筑材料期中试题及)
  5. 女友晚安之后依然在线:python男友用20行代码写了个小工具
  6. atmega8a如何烧写程序_快捷又安全!如何利用芯片内部Bootloader烧写程序?
  7. JScrollBar().setValue(0)设置滚动条位置失效问题
  8. Dvorak or qwert?
  9. Sigma algebra
  10. foxmail 163企业邮箱配置
  11. 9. PHP接入微信支付订单、退款订单、转款订单的查询
  12. Vue 组件化通信 provide inject ,dispatch ,boardcast
  13. 搭建ELK(ElasticSearch+Logstash+Kibana)日志分析系统(二) Logstash简介及常见配置语法
  14. 天猫双12爬虫(福利:266万条商品数据免费下载)
  15. Android 上面的定位和Poi检索
  16. Kubernetes--k8s---滚动更新--零停机不停服发布服务
  17. 数据结构》算法实现及解析].高一凡.
  18. 腾讯云从业者认证考试内容 分享腾讯云架构tca考试题
  19. pajek教程——根据节点度、节点介数、节点紧密等指标调整节点的大小
  20. 技嘉 linux设置u盘启动项,技嘉u盘启动,教您技嘉主板怎么设置u盘启动

热门文章

  1. echart图表 和弦关系图 悲惨世界人物关系图的使用及配置项 修改旋转角度 顺时针旋转
  2. Win10家庭版升级到专业版出现的声音消失问题
  3. linux下查看网络速度
  4. win10开机报错0xc0000098,bcd文件损坏无法正常启动,全网最简单的修复方法,这里不得不说老毛桃的强大了
  5. 【HTML】HTML作业-----影院售票界面
  6. 法国夺冠,有一半的军功章要给非洲移民呢
  7. 修改PLSQL中文乱码问题
  8. 群体学习Swarm Leaning学习笔记
  9. [Windosw Erro 1114] 动态链接库(Dll)初始化例程失败
  10. JProfiler SN