systemverilog 宏定义 `define
文章目录
- 前言
- 1 标准中关于`define宏的介绍
- 1.1 特殊符号`"
- 1.2 特殊符号\`\`"
- 1.3 特殊符号``
- 2 带参数的宏`define
- 2.1 带参数宏的使用方法及其存在的问题
- 2.2 解决宏定义变量传参的方法
- 总结
前言
本文主要记录一下systemverilog中`define宏定义的使用,主要介绍带参数的宏传递方法。
1 标准中关于`define宏的介绍
在《SystemVerilog_3.1a》标准中,关于`define宏的描述如下所示:
可以看到,在systemverilog中,define宏包含三个关键的特殊符号。
1.1 特殊符号`"
`" //这个符号表示一个特殊的引号,引号内部的变量也会被替换
1.2 特殊符号``"
`\`" //表示展开时包含转义序列,转义出来就是\"符号
1.3 特殊符号``
`` //分隔词,标记而不引入空白,允许从参数构造标识符,在宏定义的变量前后都加上这个符号,就可以实现变量的整体替换。
2 带参数的宏`define
2.1 带参数宏的使用方法及其存在的问题
下面这个文章介绍了,如何使用带参数的宏define。
[SV]SystemVerilog中`define传参 — 带参数的宏函数(Macro function)
文章中提到,宏定义在传参的时候有一个缺陷,不能接收传进来的变量,不然会将变量的名字传进define中,而不是变量所代表的值传进去,造成这个现象的本质原因是,宏的参数传递的本质是替换,具体描述如下。
引用传进来的参数时要在参数前和后加``,不接收传进来的变量
比如
generate
for(genvar jj=1;jj<`CC_NUM;jj++)begin
`A_SRAM_RW(jj,0)
end
endgenerate
上面这种写法是不行的,相当于只是把jj传进了define中,并不会把jj所代表的值传进去。
2.2 解决宏定义变量传参的方法
考虑到宏定义传参的本质是替换,那么解决宏定义变量传参的方法,就是将宏作为参数。
下面将展示,将宏作为参数传递所带来的妙用。
有如下场景:要检查寄存器的值和对应的端口连线是否正确。
常规的思路,先检查默认值,再检查翻转值。
检查默认值:针对每个寄存器,先读出寄存器的默认值,再取到端口上的值,进行比对。
检查翻转值:将读到的默认值取反,写到寄存器中,再读出来,重新取端口上的值,进行比对。
按照上面的思路,如果挨个寄存器进行操作,代码量将非常大,而且基本上都是重复的代码,后期维护起来也不方便。
那么能不能将上述重复的代码放到一个task里边呢,每次只需要将必要的参数传进去就好了。
在传参的过程中,存在一个问题:端口名字如何作为一个参数传进去呢?
由于取端口上的值的时候,路径都是一样的,只是端口名字不一样,所以自然的想到用带参数的宏定义,那么在task中调用这个宏的时候,端口名字如何作为一个参数怎么传进去呢?
那么解决方案就是用宏作为参数传进去,那么在外层调用的时候,就只需要改变这个宏就好了。代码如下所示:
`define PMU_TOP(x) CHIPTOP.A_PMU.``x``
`define PORT pow_15 //这里定义端口名字的宏
task reg_connect_check(input bit[31:0] addr, input int index);...read_data(addr, data)if(data[index] == `PMU_TOP(`PORT))//这里将端口名字的宏作为参数传进去...
endtask : reg_connect_check
// 外层的调用
addr = 32'h10;
index = 0;
`define PORT pow_15 //这里通过改变宏,从而将端口名字传进去task
reg_connect_check(addr, index); addr = 32'h14;
index = 1;
`define PORT pow_11 //这里通过改变宏,从而将端口名字传进去task
reg_connect_check(addr, index);
可以看到,通过上述的改变,原本读寄存器、取端口值、数据比对等,这些重复的代码,在task里边得到了很好的复用,外层则只需要改变参数,调用task就可以了,简洁明了,维护起来也方便。
特别注意:
reg_connect_check这个task和外层调用最好放到同一个类中。如果reg_connect_check这个task放到基类中,然后外层调用的时候在子类中进行调用,就起不到传参的效果,原因是子类中改变宏定义的值无法影响到基类,reg_connect_check这个task始终会用到基类的宏定义。
总结
本文首先记录了在systemverilog中,标准文档对于宏定义的描述,以及几个特殊符号的使用;其次,着重介绍了带参数的宏的使用,解决了如何将变量作为一个参数传递给宏,并通过一个例子,演示了这样做带来的好处。
systemverilog 宏定义 `define相关推荐
- systemverilog 宏定义 `define 用法。
#将宏定义转化成字符串 `define stringfy(x) `"x`" string s; s = `stringfy(`macro);#此时宏`macor不可以有输入,否则报 ...
- [C++]宏定义#define A B C
C++关于宏定义的用法,有形如#define A B C的格式,此时B和C都是已知的字符串常量. 在宏定义中. 可以把两个常量字符串连在一起 如果#define A "a" 那么宏 ...
- 宏定义Define的一些用法
---转载百度文库 一. #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处 ...
- VS无法使用宏定义#define解决方案
在使用VS编译C语言或者其他语音用到宏定义#define,VS会报错提示(以VS2019为例) 解决方式: 在工具-->选项-->文本编辑器-->C/C++-->查看中,将&q ...
- [C语言]宏定义#define的使用详解
一.宏定义定义常量 预定义符号 FILE //进行编译的源文件 LINE //文件当前的行号 DATE //文件被编译的日期 TIME //文件被编译的时间 STDC //如果编译器遵循ANSI C, ...
- C语言 | 预处理 | 宏定义 | #define | 定义函数
文章目录 预处理 预处理运算符 宏定义 无参宏定义 带参宏定义 宏定义-定义函数 此文主要介绍宏定义,并在介绍宏定义时举例介绍预处理命令 预处理 参考:C 预处理器 | 菜鸟教程 重要的预处理器指令如 ...
- 预处理命令 宏定义 #define #undef
预处理命令 源程序中以#开头的行称为预处理指令. 预处理指令并不是C语言的语法成分,而是传给编译程序的指令. 包括: 宏定义 #define #undef 文件包含 #include 条件编译 #if ...
- 宏定义#define整理
一.宏定义#define 优点:一方面可以节省程序的空间上的篇幅,另外,恰当地使用宏定义可提高程序的时间效率.代码可以写的通俗易懂.可以提高程序的清晰性.可读性,使于修改移植等. 缺点:宏定义的使用实 ...
- 枚举(enum)、宏定义(#define)、结构体(struct)的拾遗
1.宏定义 1.1.不带参数的宏定义 #define 标识符 字符串 例如:#define PI 3.1415926 说明: (1)宏名一般习惯用大写字母表示,但并非规定,也可以用 ...
最新文章
- 二维树状数组 ----2021广东省赛 ----- K - Kera‘s line segment[区间转二维平面+树状数组维护前缀最小最大值]
- 如何看待消息中间件的选型
- 如何让linux服务器同步互联网时间
- arduino w5500 mysql,W5500网络模块会出现奇怪的问题
- java 清屏_【图片】请问java编写中如何做到清屏啊。。。_java吧_百度贴吧
- 【Hadoop】用web查看hadoop运行状态
- Ubuntu中vim编辑器的常用操作
- PCS7服务器数据包安装位置,PCS7中应用PH服务器的配置问题
- checkIP——烂代码又堆了一个ip活性检测工具
- 高速下载百度网盘资料(Tampermonkey+百度网盘直链下载助手+xdown)
- 第一讲 ISO 17799/27001 标准简介
- 学科前沿:基因启动子甲基化与宫颈癌发展的关系 | 文献科普
- 政府12345便民服务热线 -- MICC全媒体智能呼叫中心建设方案
- 微信再次成师父 Facebook开始卖电影票
- 荣耀8青春版android,华为荣耀8青春版有几个版本?荣耀8青春版低配版/标准版/高配版区别对比评测...
- 电脑显示没有被指定在上运行_win7运行QQ时出现“.dll没有被指定在Windows上运行,或者它包含错误”如何解决...
- 学法减分助手PRO小程序源码
- 新手选择蓝牙耳机要注意什么?双11发烧友疯狂推荐五款蓝牙耳机
- MacOS 查看硬盘分区参数
- 智慧城市之城市应急智慧系统
热门文章
- notepad js自动补全html标签,JavaScript Notepad
- bzoj2142 礼物
- js向服务器写入文件,js创建、写入、读取文件、FileSystemObject
- Java compareTo
- 恐怖游戏需要优秀的剧情吗?聊聊《港诡实录》的剧情架构
- 在线一键JS混淆还原
- mate鸿蒙什么时候上市,华为mate40依然搭载安卓 鸿蒙手机上市时间最快或在今年底...
- 贴吧推广之长尾关键词精准流量引爆技术
- 管理经济学【十一】之 寡头垄断市场中的企业决策
- Springboot+vue前后端项目的部署和搭建