Dskpimc? · 2020年09月01日

芯片验证Systemverilog用例可重用方法

对于芯片验证来说,验证平台的可重用和验证效率至关重要,在早期写测试用例时就要想好如何可以复用,来提升效率。本文讲下在芯片验证中,如何采用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差异来执行不同的行为,还有很多其它方式,千变万化,大家可以自己想想,以上只是一个简单例子。

更多相关阅读

Bash shell语言学习
Makefile文件

作者:谷公子
首发博客:https://blog.csdn.net/W1Z1Q/article/details/104401297
更多IC设计相关的文章请关注IC设计极术专栏,每日更新。
推荐阅读
关注数
19642
内容数
1303
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息