文章目录

  • 前言
  • 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相关推荐

  1. systemverilog 宏定义 `define 用法。

    #将宏定义转化成字符串 `define stringfy(x) `"x`" string s; s = `stringfy(`macro);#此时宏`macor不可以有输入,否则报 ...

  2. [C++]宏定义#define A B C

    C++关于宏定义的用法,有形如#define A B C的格式,此时B和C都是已知的字符串常量. 在宏定义中. 可以把两个常量字符串连在一起 如果#define A "a" 那么宏 ...

  3. 宏定义Define的一些用法

    ---转载百度文库 一. #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处 ...

  4. VS无法使用宏定义#define解决方案

    在使用VS编译C语言或者其他语音用到宏定义#define,VS会报错提示(以VS2019为例) 解决方式: 在工具-->选项-->文本编辑器-->C/C++-->查看中,将&q ...

  5. [C语言]宏定义#define的使用详解

    一.宏定义定义常量 预定义符号 FILE //进行编译的源文件 LINE //文件当前的行号 DATE //文件被编译的日期 TIME //文件被编译的时间 STDC //如果编译器遵循ANSI C, ...

  6. C语言 | 预处理 | 宏定义 | #define | 定义函数

    文章目录 预处理 预处理运算符 宏定义 无参宏定义 带参宏定义 宏定义-定义函数 此文主要介绍宏定义,并在介绍宏定义时举例介绍预处理命令 预处理 参考:C 预处理器 | 菜鸟教程 重要的预处理器指令如 ...

  7. 预处理命令 宏定义 #define #undef

    预处理命令 源程序中以#开头的行称为预处理指令. 预处理指令并不是C语言的语法成分,而是传给编译程序的指令. 包括: 宏定义 #define #undef 文件包含 #include 条件编译 #if ...

  8. 宏定义#define整理

    一.宏定义#define 优点:一方面可以节省程序的空间上的篇幅,另外,恰当地使用宏定义可提高程序的时间效率.代码可以写的通俗易懂.可以提高程序的清晰性.可读性,使于修改移植等. 缺点:宏定义的使用实 ...

  9. 枚举(enum)、宏定义(#define)、结构体(struct)的拾遗

    1.宏定义 1.1.不带参数的宏定义 #define 标识符 字符串           例如:#define PI 3.1415926 说明: (1)宏名一般习惯用大写字母表示,但并非规定,也可以用 ...

最新文章

  1. 二维树状数组 ----2021广东省赛 ----- K - Kera‘s line segment[区间转二维平面+树状数组维护前缀最小最大值]
  2. 如何看待消息中间件的选型
  3. 如何让linux服务器同步互联网时间
  4. arduino w5500 mysql,W5500网络模块会出现奇怪的问题
  5. java 清屏_【图片】请问java编写中如何做到清屏啊。。。_java吧_百度贴吧
  6. 【Hadoop】用web查看hadoop运行状态
  7. Ubuntu中vim编辑器的常用操作
  8. PCS7服务器数据包安装位置,PCS7中应用PH服务器的配置问题
  9. checkIP——烂代码又堆了一个ip活性检测工具
  10. 高速下载百度网盘资料(Tampermonkey+百度网盘直链下载助手+xdown)
  11. 第一讲 ISO 17799/27001 标准简介
  12. 学科前沿:基因启动子甲基化与宫颈癌发展的关系 | 文献科普
  13. 政府12345便民服务热线 -- MICC全媒体智能呼叫中心建设方案
  14. 微信再次成师父 Facebook开始卖电影票
  15. 荣耀8青春版android,华为荣耀8青春版有几个版本?荣耀8青春版低配版/标准版/高配版区别对比评测...
  16. 电脑显示没有被指定在上运行_win7运行QQ时出现“.dll没有被指定在Windows上运行,或者它包含错误”如何解决...
  17. 学法减分助手PRO小程序源码
  18. 新手选择蓝牙耳机要注意什么?双11发烧友疯狂推荐五款蓝牙耳机
  19. MacOS 查看硬盘分区参数
  20. 智慧城市之城市应急智慧系统

热门文章

  1. notepad js自动补全html标签,JavaScript Notepad
  2. bzoj2142 礼物
  3. js向服务器写入文件,js创建、写入、读取文件、FileSystemObject
  4. Java compareTo
  5. 恐怖游戏需要优秀的剧情吗?聊聊《港诡实录》的剧情架构
  6. 在线一键JS混淆还原
  7. mate鸿蒙什么时候上市,华为mate40依然搭载安卓 鸿蒙手机上市时间最快或在今年底...
  8. 贴吧推广之长尾关键词精准流量引爆技术
  9. 管理经济学【十一】之 寡头垄断市场中的企业决策
  10. Springboot+vue前后端项目的部署和搭建