对于芯片验证来说,验证平台的可重用和验证效率至关重要,在早期写测试用例时就要想好如何可以复用,来提升效率。本文讲下在芯片验证中,如何采用SystemVerilog语法中的`define生成大量类似用例。一方面可以让用例简洁明了,方便维护,另一方面可以快捷生成各种用例。define经常用来代替某些复杂的文本内容或数字,比如:1、
define D(x,y) initial $display("start", x , y, "end");2、`define test_num 1414;。
但define还有更强大的功能,就是从参数构造字符串,采用
`来达到这一效果。如:
define append(f) f
`_master =》 `append(clock) =》 clock_master
在SystemVerilog中,双引号内的文本默认都处理为字符串,即便define(x) "the x",这种情况传入任何x的值都没有用,最终替换的结果肯定是"the x"。但如果在双引号"前面加上撇号就不一样了,如define(x)
"the x`",这是假如为define(man),那么最终替换的结果就为"the man"了。
在define中,如何后面的语句太长了,想要分成多行来写,可以在每一行的结尾处使用反斜杠\来结尾,切记,必须是最后一个。如果在define后面的内容想用反斜杠\,那么可以在反斜杠前加上撇号
\就行了。
基于上述`define的功能,我们在写class的时候,可以留一些后门,然后用case等方法,可以改某些变量的值,从而达到不同的sequences和用例等效果,以下举个例子:
定义一个基类class:
`define seq_gen(sequence_name, conditions); \
string cond = conditions;\
class sequence_name extend uvm_sequence\
uvm_object_utils(sequence_name);\
function new(string name="sequence_name
")\
super.new(name);\
endfunction\
case(cond)\
zhao: beign...end\
qian: begin...end\
sun: begin...end\
:li: begin..end\
default:...\
endcase\
其它语句\
endclass
有了以上的define,我们可以如下来使用:
`define(zhao_seq, zhao)
`define(qian_seq, qian)
`define(sun_seq, sun)
`define(li_seq, li)
通过这个可以看出,我们可以很方便的构造出四个sequence,每个sequence的功能不同点可以在case里体现,从而让用例差异化。当然也可以采用不同的方法,比如用string.match(stings)这个SystemVerilog自带的字符串匹配函数,识别要生成的seq_name差异来执行不同的行为,还有很多其它方式,千变万化,大家可以自己想想,以上只是一个简单例子。
更多相关阅读
作者:谷公子
首发博客:https://blog.csdn.net/W1Z1Q/article/details/104401297
更多IC设计相关的文章请关注IC设计极术专栏,每日更新。