sv小技巧
宏定义转换字符串
有时候会想将宏定义作为字符串传递给函数。直接传递是不行的,可以采用下面的方法
不带参数的宏
`define PATH TB.DUT
$display(`"`PATH`");
带参数的宏
`define PATH(num) TB.DUT``num
int temp;
$display($sformatf($sformatf("%s", `"`PATH(%0d)`"), temp));
force 和 uvm_hdl_force
区别
区别 | 参数的区别 | |
---|---|---|
force | 只能对静态变量操作 | force后的后门路径不是字符串 |
uvm_hdl_force | 静态变量,动态变量都可以 | uvm_hdl_force后的后门路径是字符串 |
⚠ 如果uvm_hdl_force
后不是字符串,编译不会报错,但是无法正确force值。
vcs和verdi的一致性问题
查看波形有两种常用的方式:
- verdi 吃文件列表,编译设计,然后手动选择波形(当前常用的方法)
- 命令行查看:
verdi -ssf wave.fsdb -sswr wave.rc
第一种方法,只要有波形文件就可以查看波形。但是存在和vcs不一致的问题
-
generate
块缺省名字时,vcs和verdi的默认块名字不相同。 - 分析upf的时候,对于缺省端口方向的iso语句,vcs默认钳位输出(和dc行为一致),verdi默认钳位输入。
- 当RTL代码已经更新,但是波形是用旧代码仿真的时候,使用第一种方法就会出现verdi中波形和代码不一致的情况。
第二种方法,需要确保vcs编译的simv.daidir
文件夹存在,不然无法载入设计(只能看波形,没有对应代码)。还需要确保当前终端已经正确设置vcs
和verdi
的环境。如果只设置verdi
环境,仍然无法查看代码。
如果使用第二种方法查看波形,推荐设置别名ss
,快速设置vcs
和verdi
环境。
alias ss "setdt vcs2020.03 && setdt verdi2020.03"
测试一下能不能更新