1.一般设计那些地方会出问题
(1)器件配置:(2)环境配置:(3)原始输入数据:(4)封装后的输入数据:
(5)协议异常:(6)延时:(7)事务状态:(8)错误和违规:
2.带有随机变量的简单类例子
class packet;
//随机变量
rand bit [31:0] src,dst,data[8]; //rand随机,每次随机的概率相同
randc bit [31:0] kind; //randc随机,每次随机之后会抽出随机概率会变大
//src的约束
constraint c {src>10;src<15;} //约束语句,使用{}
endclss packet
packet p;
initial begin
p = new();
assert(p.randomize()); //断言语句,正确返回1,错误返回0
else:$fatel(0);
transmit(p);
end
3.关于constraint的注意点
1.constraint语句中可以使用if...else...等表达式
2.constraint中只能使用二进制约束
4.权重分布的两种方式
(1):=分布总和为相加数量
(2):/分布总和为100
rand int src,dst;
constraint c_dist{
src dist {0:=40,[1:3]:=60};
//src = 0,weight = 40/220
//src = 1,weight = 60/220
//src = 2,weight = 60/220
//src = 3,weight = 60/220
dst dist {0:/40,[1:3]:/60};
//dst = 0,weight = 40/100
//dst = 1,weight = 20/100
//dst = 2,weight = 20/100
//dst = 3,weight = 20/100
}
5.inside的用法
rand int c;
int lo , hi;
constraint c_range{
c inside {[lo:hi]}; //等同于lo<=c;c<=hi;
}
//如果想取反,可修改为 !(c inside{[lo:hi]});
6.$的使用方法
//$可以表示最大值和最小值
rand bit [6:0] b;
rand bit [5:0] e;
constraint c_range{
b inside {[$:4],[20:$]}; //0<=b<=4 || 20<=b<=127
e inside {[$:4],[20:$]}; //0<=e<=4 || 20<=e<=63
}
7.使用数组的随机集合约束
rand int f;
int fib[5] = '{1,2,3,4,5};
constraint fib_range{
f inside fib;
}
8.条件约束
->表达式可以达到case操作符的效果
class Busop;
...
constraint c_io{
(io_space_mode)->
addr[31]==1'b1;
}
9.双向约束
rand logic[15:0] r,s,t;
constraint c_bidir{
r<t;
s==r;
t<10;
s>5;
}
10.约束的控制
class Packet;
rand int length;
constraint c_short{length inside {[1:32]};}
constraint c_long {length inside {[1000:1023]};}
endclass
Packet p;
initial begin
p = new();
//constranint_mode()可以打开或者关闭约束控制块
//通过禁止c_short约束产生长包
p.c_short.constraint_mode(0);
assert(p.randomize());
transmit(p);
//通过禁止所有的约束,然后使能短包约束来产生短包
p.constraint_mode(0);
p.c_short.constraint_mode(1);
assert(p.randmize());
transmit(p);
end
11.内嵌约束
- 使用randomize()with来内嵌约束
class Transaction;
rand bit[31:0] addr,data;
contrasint c1 {addr inside{[0:1000],[1000:2000]};}
endclass
Transaction t;
initial begin
t = new();
//addr 范围:50-100,1000-1500,data<10
assert(t.randomize() with{addr>=50;addr<=1500;data<10;});
driveBus(t);
//强制addr取固定值,data>10
assert(t.randomize() with{addr>=50;addr<=1500;data>10;});
driveBus(t);
end