0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SV中define宏定义的用法

小杜的芯片验证日记 来源:数字芯片验证日记 2024-10-21 14:22 次阅读

Hi,我是小杜。小杜工作中经常看到验证环境中的宏定义,之前仅有一点了解,最近小杜需要用到宏,于是整理了一下宏的使用场景和注意事项。小杜经验尚浅,如有错误,还请批评指正。

宏定义`define的用法

SV中使用预处理指令`define来定义宏,宏可以用来创建文本替换。根据场景不同,`define主要用来定义常量简化复杂的表达式或代码段以及提高代码的可移植性。其基本语法为:

`defineMACRO_NAMEreplaced_text

下面是小杜对一些使用场景的简单举例:

定义常量

`defineDATA_WIDTH 32

条件编译

`ifdef USE_SNPS_VIP
...
`endif

简化复杂表达式

`defineIS_EVEN(x)((x)%2==0)


initial begin
  num = 10;
if(`IS_EVEN(num))
  ...
end

定义宏函数

如果需要定义带参数的宏函数,使用``来实现变量的整体替换。

`definePRINT_MAX(a, b) 
if((a)> (b)) 
$display("Maxvalue:%0b",a);
  else  
$display("Max value: %0d", b);

initial begin
x = 10;
y= 20;
`PRINT_MAX(x,y);
end
`defineTEST_PARAM(X)'"test_``x``param`"
$display(`TEST_PARAM(a));
//打印:test_a_param

定义信号路径

相较于上面,这是一种常用但并非spec推荐的用法,因为`define只是文本替换工具,使用宏来指代信号路径会导致信号可读性降低,在调试和维护中容易出错。但工作中真的很有用。

`define INNER_DATA u_submodule2.u_submodule1.inner_data


module submodule1;
    reg [31:0] inner_data;


    initial begin
        inner_data = 32'hDEADBEEF;
    end
endmodule


module submodule2;
    submodule1 u_submodule1();
endmodule


module top;
    submodule2 u_submodule2();


    initial begin
        // 使用 `define 定义的信号路径
        $display("Inner Data: %h", `INNER_DATA);
    end
endmodule

`define的作用域

`define定义的宏在SV中是全局有效的,作用域从宏被定义的地方开始,一直到文件结束,或者宏被`undef显示的取消定义为止。比如经常使用宏定义信号位宽就是全局作用。

如果在被包含的文件中定义了一个宏,该宏对包含该文件的主文件以及该文件之后的所有内容有效。

//test.sv
`defineTEST_NUM 100


//main.sv
`include "test.sv"


module to;
  initial begin
$display("TEST_NUM:%0d", `TEST_NUM);
//将打印 TEST_NUM: 100
  end
endmodule

使用`undef显示取消宏定义来控制宏的作用范围。

`defineMY_MACRO 32
...
`undefMY_MACRO
//在`undef之后再调用MY_MACRO就会报错

`define的使用注意事项

小杜这里列举几个会经常遇到的注意事项:

尽量使用大写字母命名,以便和变量名/函数名区分开,并且一定要避免和其他宏出现命名冲突。尽量保持宏定义简单明了,保持代码的可读性和可维护性,必要时在宏定义旁添加注释。

如果使用宏定义简化表达式,最好使用括号来确保表达式求值顺序的正确,这是因为宏展开后会直接替换文本,可能会导致变量执行顺序出错。

最重要的是避免过度使用宏!!虽然宏使用起来非常方便,但对于较大的验证环境,这会导致代码可读性变差和维护难度提升。平时随手写个宏,方便了自己,但很可能会让负责环境维护的同事付出更多的时间进行维护。

以上就是小杜对SV中`define宏定义的一些总结,工作中根据需求使用`define即可。感谢你看到这里。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4779

    浏览量

    68524
  • 宏定义
    +关注

    关注

    0

    文章

    50

    浏览量

    9007
  • define
    +关注

    关注

    0

    文章

    15

    浏览量

    3742

原文标题:【SV】宏定义`define的使用场景和注意事项小结

文章出处:【微信号:小杜的芯片验证日记,微信公众号:小杜的芯片验证日记】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言typedef与#define用法和区别

    在C语言编程,typedef 和 #define是最常用语句,可能很多工作过几年的工程师都没有去深究过它们的一些用法和区别。
    发表于 10-12 10:39 679次阅读

    C语言中定义的使用技巧

    #define命令是C语言中的一个定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为名,被
    发表于 09-05 10:12 1159次阅读
    C语言中<b class='flag-5'>宏</b><b class='flag-5'>定义</b>的使用技巧

    Verilogparameter和define的区别

    推荐使用`define 定义的方式,因为'define 定义在编译时自动替换整个设计中所
    发表于 04-25 14:32

    C语言定义#和##的作用

    : helloworld , 就可以通过这样的的调用, printf( str(helloworld) );2. ## : 在定义,将其前后的两个变量拼接在一起。eg: #define
    发表于 08-23 18:22

    请问定义的##有什么用途?

    );第一句的osThreadDef是个定义:#define osThreadDef(name, thread, priority, instances, stacksz)\cons
    发表于 03-29 07:49

    define定义多条语句的语法规则有哪些

    在单片机编程过程,有时候需要反复操作多条同相语句,这时候运用#define定义多条语句可以大大简化编程内容。语法规则如下:1.
    发表于 07-15 08:39

    typedef和define区别

    typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,与定义有些差异。它本身是一种存储类的关键字define,无参
    发表于 11-09 14:22 6916次阅读
    typedef和<b class='flag-5'>define</b>区别

    C语言中#define的一些用法介绍概述

    今天整理了一些#define用法,与大家共享!1.简单的define定义#define MAXTIME 1
    的头像 发表于 04-14 11:29 7383次阅读

    #define的高级用法简介

    #define的高级用法
    的头像 发表于 02-05 11:50 3921次阅读

    C语言基础:定义使用do{}while(0)的好处

    C语言定义使用do{}while(0)的好处1. 概述 经常写项目代码,有时需要用到定义,而定义
    发表于 01-13 13:06 2次下载
    C语言基础:<b class='flag-5'>宏</b><b class='flag-5'>定义</b>使用do{}while(0)的好处

    C语言中的定义

    #define命令是C语言中的一个定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为名,被
    的头像 发表于 09-28 16:05 3452次阅读
    C语言中的<b class='flag-5'>宏</b><b class='flag-5'>定义</b>

    c语言定义用法规则

    定义会在编译的时候进行替换展开。最好将的参数用括号括起来。这样就避免了当一个表达式同时含有定义
    发表于 07-31 09:39 850次阅读

    c语言带参数的定义

    定义 2. 带参数的定义 3. 带可变参数的定义 本文将重点探讨带参数的
    的头像 发表于 09-04 17:45 2401次阅读

    基于select!的进阶用法

    ,它可以让我们同时监听多个异步事件,一旦其中一个事件触发,就可以立即执行相应的代码。在本教程,我们将详细介绍 select!的进阶用法,并提供多个示例来帮助您更好地理解和掌握这个
    的头像 发表于 09-19 15:35 663次阅读

    define定义

    ,常量表并没有用define定义的常量,系统不为它分配内存。define定义的常量,预处理时只是直接进行了替换,,它用来将一个标识符
    的头像 发表于 11-24 15:35 866次阅读