System Verilog随机约束

编程入门 行业动态 更新时间:2024-10-25 08:22:58

<a href=https://www.elefans.com/category/jswz/34/1757696.html style=System Verilog随机约束"/>

System Verilog随机约束

目录

随机约束与分布

声明随机变量的类

约束块

数组约束


随机约束与分布

随机测试可以找到未知缺陷、减少代码量;

约束使随机自由是一种合法的随机,即限定激励的合法范围;

随机分布:器件配置、环境配置、原始输入配置、延时、协议异常

注意:随机发生在仿真阶段


声明随机变量的类

第一步声明含关键词rand、randc和constrait的类,第二步例化并在initial中使用:句柄.randomize

class Packet;rand bit[31:0] src,dst,data[8];randc bit [7:0] kind;constraint c {src>10;src<15;}//声明性质的代码
endclassPacket p;
initial beginp=new();assert(p.randomize());//使用断言检查randomize结果else $fatal(0,"Packet::randomize failed");transmit(p);
end

约束块

形式:constraint+约束块名称,

randomize() with { }增加额外约束;关闭所有约束块P.constraint_mode(0),打开c_short约束块P.c_short.constraint_mode(1);pre_randomize()和post_randomize()是在randomize()之前或之后执行的操作;randomize(low)则只随机化low成员(无论low是否加关键词rand声明)

约束块中的部分关键词:dist、inside、->、if...else...

///dist应用
constraint c_stim{
src dist{0:=40,[1:3]:=60};//一共220, := 表示每一个值权重相同 
dst dist{0:/40,[1:3]:/60};//一共100, :/ 表示平分
}///使用“$”指定最大和最小值
rand bit [6:0]b;//0<=b<=127
rand bit [5:0]e;//0<=e<=63
constraint c_range{b inside {[$:4],[20:$]};//0<=b<=4||20<=b<=127e inside {[$:4],[20:$]};}带有->操作符的约束块
class BusOp;
...constraint c_io{(io_space_mode)->addr[31]==1'b1;}/带有if-else操作符的约束块
class BusOp;
...
constraint c_len_rw{if(op==READ)len inside{[BYTE:LWRD]};elselen==LWRD;}/带有权重变量的dist约束
typedef {READ8,READ16,READ32} read_e;
class ReadCommands;rand read_e read_cmd;int read8_wt=1,read16_wt=1,read32_wt=1;constraint c_read{read_cmd dist{READ8:=read8_wt,READ16:=read16_wt,READ32:=read32_wt};}
endclass

注意:
1、一个表达式中最多只能使用一个关系操作符(constraint bad{lo<med<hi;}错误)

2、约束块不加“;”、约束条件加“;”

3、约束块内只包含表达式(A==B;),不能进行赋值(A=B;)

4、小心使用有符号变量

5、子类中添加约束不能与父类相违背,变量前加soft为软约束、优先级低


数组约束

声明动态数组一般会约束其大小,还可以在约束中结合数组的其它方法A.sum()、A.size()、and()、or()、xor()

///约束动态数组的大小
class dyn_size;rand logic[31:0] d[];constraint d_size{d.size()inside{[1:10]};}
endclass

使用foreach针对每个成员进行约束

randc是每次randomize后与之前randomize值不同,无法使数组中的每一个数都不同

///使用foreach产生唯一的数组元素
class Ascend;rand bit[7:0]ua[64];constraint c{foreach(ua[i])  //对数组每一个元素操作foreach(ua[j])	if(i!=j)          //除了元素自己ua[i]!=ua[j];    //和其他元素比较}
endclass
///使用randc产生唯一数组
class randc8;randc bit [7:0] val;
endclass
class ARRAY;bit [7:0] ua[64];function void pre_randomize();ranc8 rc8;r8 = new();foreach(ua[i]) beginassert(r8.randomize());ua[i] = rc8.val;endendfunction
endclass

绿皮书中典型的数组约束问题

数组约束问题
// 6.44约束动态数组的大小
class dyn_size;rand logic[31:0] d[];constraint d_size{d.size()inside{[1:10]};}
endclass// sum()函数约束随机数组只有四位有效
class StrobePat;rand bit strobe[10];//数组有10位1比特的数,要求有四个是1。constraint c_cetc_four{strobe.sum()==4'h4;}
endclass//sum()由于verilog 8位数值的和也是用8位数值保存
//sum_bad1
class bad_sum1;rand byte len[];constraint c_len{len.sum()<1024;len.size()inside{[1:8]};}
endclass//会产生负数,且sum始终小于127//sum_bad2
class bad_sum2;rand bit[7:0] len[];//8位constraint c_len{len.sum()<1024;len.size()inside{[1:8]};}
endclass//sum始终小于256,因为8位数值的和也是用8位数值保存//sum_bad3
class bad_sum3;rand bit[32:0] len[];//32位constraint c_len{len.sum()<1024;len.size()inside{[1:8]};}
endclass//会产生很大数相加产生进位,只剩小的数但满足条件的问题。//sum_bad4
class bad_sum4;rand bit[9:0] len[];//10位constraint c_len{len.sum()<1024;len.size()inside{[1:8]};}
endclass//8位数的和用8位保存sum不超过256,与10位数sum不超过1024但单个数高于256出现;//解决方法如下:用foreach对数组的每个元素进行约束
class good_sum5;rand bit[9:0] len[];//10位或者更宽的位宽,但必须是无符号数constraint c_len{foreach(len[i]) len[i]inside{[1:255]};len.sum()<1024;len.size()inside{[1:8]};}
endclass

更多推荐

System Verilog随机约束

本文发布于:2024-03-09 05:30:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1723987.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:System   Verilog

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!