systemverilog(3)之Randomize
what to randomize?
(1) primary input data <==one data
(2)encapsulated input data <== muti group data
(3)protocol exceptions,errors and violations
(4)delays
overview
1.randomization enables users to automatically generate random input sitimuls for functional verification
2.systemverilog enable user to specify random constrained (legal) values
3.random costraint should be specified using OOP
Randomization in SV
(1) keyword
rand bit [1:0] y;
randc bit [1:0] y;
(2)simple class with random variables
class BUS
rand bit [15:0] addr;
randc bit [31:0] data;
constraint range1{
addr > 1024;
data<16384;
}
endclass
(3)randomize() function <==启动一个随机约束
if success return 1
if failture return 0
BUS bus = new();
repeat(50) begin
if(bus.randomize() == 1)
$display(bus.addr.bus.data);
else
$display(“randomization failed”);
end
(4) constrain solver ===> seed
the same seed results in the same random value
(5)constraint blocks
constraint constraint_indentifier {
constraint_statmemts
}
(6)simples expressions
only one relational operator(< <= > >= …)
(7)set membership operator:inside
eg1: class BUS
rand bit[15:0] addr;
randc bit [31:0] data;
constraint range1{
addr inside {[0:1000],[1024:16384]};
data > 1000;
data < 100000;
}
endclass
eg2:
integer fives[0:3] = {5,10,15,20};
rand integer v;
constraint c3 {v inside fives};
constraint c4 !{v inside fives};
(8)weighted distribution:dist
property1: They are a relational test for test membership
property2: They specify a statistical distribution function for the result
:= <====the same value in the range every(可以对一个区间也可以对一个独立的数)
/= <=====to be equally divided by all values range_weight/n(对一个区间约束)
cannot be used with a randc
eg:

(9)bidirectional constraints
not procedural but declarative
all active at one time
(10) conditional constraints
implication operator –> 相当于 if..else
(11) unconstrainted
rand bit x ;
rand bit [1:0] y;
the same probability
(12)implication
class imp1;
rand bit x;
rand bit [1:0] y;
constraint c_xy{
(x==0) –> (y==0);
}
endclass
(13)implication and bidirectional constraints
class imp_Bid;
rand bit x;
rand bit [1:0] y;
constraint c_xy{
y > 0;
(x==0) –> (y==0);
}
endclass
(14)solve before
class solvebefore;
rand bit x;
rand bit [1:0] y;
constraint c_xy;
{
(x==0) –> y==0;
solve y before x;
}
(15) interative constraints
allows arrayed variable to be constrained in a parameterized manner using loop variables
class c;
rand bye A[4];
constraint C1
{
foreach(A[i])
A[i] inside{2,4,8,16};
}
constraint C2
{
foreach (A[j])
A[j] > 2*j;
}
endclass
(16) functions in constraints
class B;
rand int x,y;
constraint C{x <= F(y);}
constraint D{y inside{2,4,8};}
endclass
1.functions cannot contain output or ref arguments <===ref 相当于inout
2.functions should be automatic <===automatic可以立即返回值
3.functions that appear in constraint cannot modify the constraint <===只是简单调用而已
4.functons shall be called before constraints are solved, and their return values shall be treated as state variables
5.random variables used as function argumets shall establish an implicit variable ordering or priority
(17)in_line constraints ---xx.randomize()with{constraints_statememt}
equivalent to adding an extra constraint to any existing one in effect
(18) disabling random variables ---rand_mode() <==control a random variable is active or inactive
class packed;
rand integer src,dst;
endclass
int r;
packet packect_a=new;
packet_a.rand_mode(0);
packet_b.src.rand_mode(1);
(19)controlling constraints with constraint_mode() <===control a constraints is active or inactive
class packet;
rand interger src,dst;
constraint filter{src>2*dst;}
endclass
function integer toggle_rand(packet p);
if(p.filter.constraint_mode() ==1 )
p.filter.costraint_mode(0);
else
p.filter.constraint_mode(1);
toggle_rand = p.randomize();
endfunction
总结:constraints主要用于transaction中,
systemverilog(3)之Randomize的更多相关文章
- [转载]转一篇Systemverilog的一个牛人总结
原文地址:转一篇Systemverilog的一个牛人总结作者:dreamylife Systemverilog 数据类型 l 合并数组和非合并数组 1)合并数组: 存储方式是连续的,中间没 ...
- SystemVerilog基本语法总结(上)
SystemVerilog基本语法总结(上) 在总结SV的语法之前,先分享一些关于SV的笔试题目,这样更显得具有针对性的总结. a. 验证中,代码覆盖率是指(衡量哪些设计代码在激活触发,而哪一些则一直 ...
- VBA使用的Randomize和DoEvents
Randomize private function getInt() dim n,m as integer Randomize n=1 m=3 getInt=Int((m+1-n)*rnd + n) ...
- SystemVerilog的历史
随着软件的功能需求越来越复杂,C语言不足以解决现有的问题,于是C++被发明了:C++的指针漫天飞,对内存的处理过于复杂,于是Java被发明了:芯片的功能不断地扩大,Verilog不足以应对日益复杂的芯 ...
- Randomize select algorithm 随机选择算法
从一个序列里面选择第k大的数在没有学习算法导论之前我想最通用的想法是给这个数组排序,然后按照排序结果返回第k大的数值.如果使用排序方法来做的话时间复杂度肯定至少为O(nlgn). 问题是从序列中选择第 ...
- vim中systemverilog的高亮显示
vim中systemverilog的高亮显示 Linux中的vim显示systemverilog语法高亮 windows中的gvim显示systemverilog语法高亮 Linux系统 查看打开vi ...
- SystemVerilog搭建验证平台使用DPI时遇到的问题及解决方案
本文目的在于分享一下把DPI稿能用了的过程,主要说一下平台其他部分搭建好之后,在完成DPI相关工作阶段遇到的问题,以及解决的办法. 工作环境:win10 64bit, Questasim 10.1b ...
- SystemVerilog语言简介(三)
15. 强制类型转换 Verilog不能将一个值强制转换成不同的数据类型.SystemVerilog通过使用'操作符提供了数据类型的强制转换功能.这种强制转换可以转换成任意类型,包括用户定义的类型.例 ...
- SystemVerilog语言简介(二)
6. 用户定义的类型 Verilog不允许用户定义新的数据类型.SystemVerilog通过使用typedef提供了一种方法来定义新的数据类型,这一点与C语言类似.用户定义的类型可以与其它数据类型一 ...
随机推荐
- JS创建函数的方法
方法一:函数声明. function foo(){ } 方法二:函数表达式. var foo=function(){ } 另外还有一种自执行函数表达式.主要用于创建一个新的作用域,在此作用域内声明的变 ...
- C# 面向对象之封装
封装是指将类的内部数据隐藏起来不让对象实例直接对其操作,C#中提供了属性机制来对类内部的状态进行操作. 在C#中封装可以通过public.private.protected和internal等关键字来 ...
- Codeforces Round #390 (Div. 2) D
All our characters have hobbies. The same is true for Fedor. He enjoys shopping in the neighboring s ...
- freertos之内存管理
任务.信号量.邮箱才调度器开始调度之前就应该创建,所以它不可能像裸奔程序那样的函数调用能确定需要多少内存资源,RTOS提供了3种内存管理的方法: 1 方法一:确定性好适合于任务.信号量.队列都不被删除 ...
- Spark Mllib里如何将数据集按比例随机地分成trainData、testData和validationData数据集(图文详解)
不多说,直接上干货! 具体详情见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的第11章 电影推荐引擎
- 解析Javascript事件冒泡机制(转)
本文转自:http://blog.csdn.net/luanlouis/article/details/23927347 1. 事件 在浏览器客户端应用平台,基本生都是以事件驱动的,即某个事件发生,然 ...
- 一个普通Java程序包含哪些线程??
package com.java.threads; import java.lang.management.ManagementFactory; import java.lang.management ...
- Tame Your Software Dependencies for More Flexible Apps
http://msdn.microsoft.com/en-us/magazine/cc337885.aspx
- 8、二进制中1的个数------------>剑指offer系列
题目 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 法一:分析 这是一道考察二进制的题目 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1. 二进制 ...
- 洛谷 P1902 刺杀大使
刺杀大使 一道并不难的二分题,竟让我交了上20次,诶,果然还是我太弱了. 看完题目就基本想到要怎么做了: 只需要对最小伤害代价进行二分即可,check()函数里用搜索判断是否可以到达最后一行,这里的c ...