总结一下平时遇到或者看到的在uvm 环境中使用到的uvm自带的一下字符串处理相关的函数,有时能给我们带来很多便利。
1. from_name,先来看class reference上面的描述:
其实就是把string转换成enum,转换成功返回1,否则返回0,转换成功的条件其实就是看你传入的字符串是不是在对应的enum中有定义,并且是大小写敏感的。 那这个有什么用处呢?
我们平时应该都有遇到这样的场景,design支持多种mode,假设是两种:FAST_MODE和SLOW_MODE,我们通常会创建一个mode_e 的enum,然后对应会有两支case分别去测这两种mode,不同mode,要么我们用config传入,要么通过$value$plusargs去传入。这个时候就有可能发生传入的字符串和enum定义的字符串不完全一样,导致仿真不符合case预期,这个时候我们的from_name就派上用场了,怎么用呢?
typedef enum bit [1:0] {
FAST_MODE = 0,
SLOW_MODE = 1
} mode_e
typedef uvm_enum_wrapper #(mode_e) mode_wrapper;
首先是define enum和对应的uvm_enum_wrapper,然后在需要判断的地方调用from_name:
class my_vseq extends uvm_sequence;
string _mode_str;
mode_e _work_mode;
//some code
if(!$value$plusargs("mode=$0s",_mode_str)) begin
_mode_str = "FAST_MODE";//default mode
end
assert(mode_wrapper::from_name(_mode_str,_work_mode))
else `uvm_fatal("ENUM_MIS",$sformatf("_mode_str:%0s is not mode_e number",_mode_str))
//others code
endclass
通过assert语句,如果传入的_mode_str不是在mode_e中有定义则会报错,这样就能避免typo造成不必要的debug。