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工具暂未发现类似的功能,有了解的小伙伴可以私信交流。
浙公网安备 33010602011771号