验证创建的模块时,经常需要几种随机测试方法来检测隐藏漏洞。
与verilog相比,sv在随机化方面非常强大,有很多关于随机化的操作。
=====================================
随机数据:
一般来说,随机化操作需要封装到类中。 classBus
randbit[15:0]addr;
randbit[31:0]data;
constraint word _ align { addr [ 1:0 ]==2’B0; }
最终类
这是一个简单的例子,只要在类的数据类型之前添加rand或randc,就可以实例化该类
对象调用randomize ()方法,具有rand和randc的数据类型是随机化的。
但是,随机化不是完全随机化,往往需要一定的限制,所以也需要constraint语句
构建约束条件。
其中有各种各样的限制。
(1)公式约束) constraintword_align ) addr [ 1:0 ]==2’B0; 数据传输
(2)条件约束) classMyBusextendsBus;
randAddrTypeatype;
constraintaddr_range
{
(atype==low )-addrinside([0:15];
(atype==mid (-addr inside ([ 16:127 ] );
(atype==high )-addrinside([128:255];
//(以前的条件)-(相应的限制) ) ) ) ) )。
}
最终类
条件约束可以使用-方法,也可以使用if-else方法。 只有满足前一个条件时,才能进行后一个约束。
(3)嵌套约束) taskexercise_bus ) mybusbus;
内含子;
//example 1: restricttolowaddresses
res=bus.randomize () with ) atype==low; (;
//example 2: restricttoaddressbetween 10 and 20
RES=bus.randomize(with ) 10=addraddr=20; (;
//example 3: restrictdatavaluestopowers-of-two
res=bus.randomize(with ) data (数据-1)==0; (;
结束任务
在randomize方法之后使用with { }添加约束条件。
(4)权重约束) xd ist ([ 1003360102 ] :=1,2003360=2,3003360=5) /其中,(=之前的各要素的权重值为)=之后的值
xd ist { [ 100:102 ] :/1,2003360/2,3003360/5 } /其中,/之前的各要素将/之后的权重值平分
双随机序列:
是randsequence(main )
main:firstseconddone; 从主节点开始依次运行firstseconddone
first :添加| dec; 运行//add或dec
第二阶段: pop|push;
done:{$display('done ); (;
ADD:{$display('add ); (;
DEC:{$display('dec ); (;
pop:{$display('pop ); (;
推式: { $ display (' push ); (;
结束序列
决策树(randcase )
3:x=1; //前一个值是相应的权重
1:x=2;
4:x=3;
6:randcase
4:x=4;
5:x=5;
结束案例
结束案例