SV/UVM 使用记录
这篇博客用来记录一些SV/UVM使用过程中不太常用但很好玩的用法。
void
void通常被用来在function声明时修饰function,表示该function没有返回参数。除了这种用法之外void可以修饰有返回值的实体,这种用法需要在void后加上‘修饰。
For example:
bit [31 : 0] m_test_q[$];
m_test_q.push_back('b1);
void'(m_test_q.pop_front());
上述代码中m_test_q是一个queue,在pop_front时应该有返回值,如果没有编译器则会报错,加上void’()之后相当于手动通知编译器这个值我不想用,可以直接抛弃,这种情况可以忽略这个报错。
uvm_hdl_force 不成功
今天在用uvm_hdl_force时,发现force不成功,仔细检查了信号路径发现还是没有成功,最后发现一个宏导致vcs debug_access+all选项没有了。
因为uvm_hdl_force需要heir信息,由此推测只有设置debug_access+all才能得到heir信息。
uvm_glob_to_re
uvm也提供了正则匹配,API为uvm_re_match(const char * re, const char *str) 其中re为正常的正则表达式。uvm_glob_to_re 可以将简单的正则表达式转换成正常的正则表达式,但是该API只支持三种简单的正则表达式转换。
简单的正则表达式 | 正常的正则表达式 |
---|---|
* | .* |
+ | .+ |
? | . |
Example:
string str_to_be_match = "12345abc6789";
uvm_re_match(uvm_glob_to_re("*abc*"), str_to_be_match);
等效于
string str_to_be_match = "12345abc6789";
uvm_re_match("/.*abc.*$/", str_to_be_match);
Systemverilog event reset
在测试reset case时如果环境中使用event来做同步,则可能会遇到多个event 有的在reset之前trigger有的在reset之后trigger,这种情况可能会导致case异常,因此需要在reset时清理掉所有已经trigger的event。
清理已经trigger的event很简单,如下:
event1=null;
typedef使用场景
当同一个文件中包含多个class并且互相引用的场景时,编译器在编译时就会出现先有鸡还是现有蛋的问题。
这时就需要使用typedef class来做一个forward declaration来避免编译器找不到被引用的class。
typedef class example
在运行过程中将打印信息重映射到其它文件中
有时可以将cfg信息等打印到指定的文件中,这样可以方便查找cfg信息的值并且可以减少vcs仿真log的冗余度。
uvm在运行过程中打印信息是由uvm_report_object控制的,在该class中有两个成员控制uvm打印信息是否输出到其它文件。
- uvm_action:该成员需要设置成UVM_LOG
- default_file_handle:该成员为0时将即使设置的uvm_action为UVM_LOG也不会将信息打印到其它文件中。
上述两个设置方法如下:
cfg_log = $fopen("cfg_info.log", "w")
// pass the file handle to defualt_file_handle
this.env.set_report_defualt_file(cfg_log);
this.env.set_report_severity_id_action(UVM_INFO, "end_of_elaboration_phase", UVM_LOG);
$fclose(cfg_log);
以上代码设置了打印信息文件的default_file_handle,并通过uvm_severity及id将需要打印信息的UVM_LOG attribute设置成功。
在设置好之后在运行中uvm_severity为UVM_LOW,id为end_of_elaboration_phase的打印信息就会打印到仿真目录下的cfg_info.log文件中。
SNPS VIP打印信息控制
synopsis VIP提供单独控制打印信息功能。E.G
-simv +vip_verbosity="svt_axi_system_env:UVM_LOW"
对uvm_reg_field读写
对reg_field进行读写时报individual field access not available for field warning,这时可以通过加宏定义:UVM_REG_NO_INDIVIDUAL_FIELD_ACCESS来解决这个warning。而且不管这个warning是否处理都会写到DUT相应的field中,但是返回的status不是UVM_IS_OK,具体解释可参考https://blog.csdn.net/kobetriumph/article/details/137080451