• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

xrun中宏的debug

SystemVerilog中的宏是一种预处理指令,用于在代码中定义和使用常量、字符串、表达式、代码段。宏可以使代码更加简洁和易于阅读,提高代码的可重用性和可维护性。
宏在验证环境的搭建中经常使用,主要有以下的一些场景。
定义常量
宏可以用来定义常量,如数据位宽,lane个数等。

`define DATA_WIDTH 32
`define LANE_NUM 16

代码中可以使用DATA_WIDTH代替32,LANE_NUM代替16。如此,一方面可以使代码更加简洁和易于阅读。另一方面在不同版本间适配环境时,也方便修改。
参数宏
可以将一些复杂的代码实现封装在一个宏中,以便在代码中使用。例如:

`define MAX(a, b) ((a>b)?a:b)
`define ADDER(A, B, SUM) adder u_adder(.a(A), .b(B), .sum(SUM))

在代码中使用MAX(x, y)来取两个数的最大值,并提高代码的可读性。在代码中使用ADDER(a, b, sum)来实例化一个加法器模块,提高代码的可重用性和可维护性。
UVM,可能是把参数宏运用到极致的典范。
条件编译
可以使用ifdef和ifndef来实现条件编译。还有代码的分支例如:

`ifndef A__SV
....
`endif

`ifdef DEBUG
  $display("Debug message");
`endif

`ifdef TSMC_16
....
`endif

`ifdef USE_AXI_VIP
...
`endif

在编译时,如果定义了DEBUG宏,则会输出"Debug message";否则不会输出。验证中主要用于防止文件重复定义,调试信息开关,底层库模型选择,RTL版本选择,验证VIP选择等。
当你从已有的testcase拷贝建立新的case时,记得修改文件开头处的"ifdef xxx__SV".....
RTL Hierarchy
另一种宏的常用场景是定义RTL的层次路径,如:

`define TB_TOP_HIER tb_top.dut.A
`define B_TOP_HIER `TB_TOP_HIER.B
`ifdef ASIC
...
`else
...
`endif

在顶层连接DUT/interface或者env中引用DUT信号时,可以直接使用hierarchy宏。
SystemVerilog宏使用得当的话,可以提高环境质量。但如果滥用宏,比如每个ENV或者组件都随处定义自己的宏,再加上缺少必要的说明,则会引起难以维护的问题。
如果参数宏写的层级较多,含义复杂,也会存在可读性变差的问题,出了问题后不易debug。
有些IDE工具可以在编码时即可看到宏展开后的代码,可以帮助理解宏的含义。
此外使用EDA工具,添加编译选项后,可以在编译log中看到宏展开后的代码。
XRUN可以添加:"-parseinfo include,inxdef,macro"。VCS工具暂未发现类似的功能,有了解的小伙伴可以私信交流。

posted on 2023-06-09 19:50  SOC验证工程师  阅读(434)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3