【SV/UVM 使用记录】

本文分享了SV/UVM中的几个技巧,如void函数的特殊用法、uvm_hdl_force问题的解决、正则表达式的转换以及在SystemVerilogresetcase中的event管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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打印信息是否输出到其它文件。

  1. uvm_action:该成员需要设置成UVM_LOG
  2. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值