systemverilog随机化
文章目录
一、前言
随着设计变得越来越大,要产生一个完整的激励集来测试设计的功能变得越来越困难。可以编写一个定向测试集来检查某些功能项,但当一个项目的功能项成倍增加时,编写足够多的测试集就不可能了。更严重的是,这些功能集之间的关系是大多数错误(BUG)的来源,而且这种BUG很难按清单检查功能项的方法来排查。
解决的方法是采用受约束的随机测试法(CRT)自动产生测试集。准备CRT的环境要比准备定向测试集的环境复杂。然而,只要准备好了这个环境,你就可以运行上百次的仿真而无需手工检查结果,从而提高工作效率。这种用CPU时间来换取人工检查的时间的方法是CRT的优势。(CRT全称constrained randomized test,翻译为随机测试法。)
当你想采用随机化的技术产生激励时,首先想到的可能是产生随机化的数据,这种方法实现起来非常简单,只需要调用$random函数。问题是这种方法找到Bug的能力有限,它只能找到数据路径方面的Bug,或者Bit级的错误。这种测试方法的本质还是基于定向测试的方法。那些具有挑战性的Bug大都在控制路径里。因此,必须对DUT里所有的关键点都采用随机化的技术。随机化使控制路径里的每一个分支都可能被测试。
二、SV中的随机化
首先建立一个具有一组相关的随机变量的类,然后用随机函数为这些变量赋随机值。你可以用约束来限制这些随机值的范围,使它们是有效的值,可以测试某些专用的功能。下面是一个带有随机变量的简单类:
class Packet;
rand bit [31:0]src,dst,data[8];
randc bit [7:0]kind;
constraint cstr{
src>10;
src<15;
}
endclass
Packet p;
initial begin
p=new();