SV_3_随机

本文详细介绍了Verilog中的随机化方法,包括$random、$urandom和$urandom_range系统函数的使用,以及如何通过约束实现加权分布、条件约束、解决约束关系等高级随机化技巧。示例代码展示了如何在实际设计中应用这些随机化技术。
摘要由CSDN通过智能技术生成


前言

本章学习随机约束


一、最简单的随机

可以用在sequence中或者testcase中,直接使用。常见的随机函数如下:

  • $random()——平均分布,返回32位有符号随机数
  • $urandom()——同上,无符号
  • $urandom_range(a,b)——在指定范围内同上,上下限位置不限,只有一个表示0-a/b

1. $random——系统方法,返回32bit的有符号伪随机数

语法如下:

$random(seed)
//种子变量seed是可选的。

$random产生一个32bit的有符号随机数,可以是正数、也可以是负数。其种子变量(必须是reg类型、整型或时间型变量)。

  • 用法一:$random%b

b为一个大于0的整数,表达式给出了一个范围在[-b+1 : b-1]之间的随机数,例如:

int randval;
randval = $random % 60;      //随机产生一个-59~59之间的有符号数
  • 用法二:{$random%b}

{ }化为无符号数,拼接操作符{ }将$random返回的有符号数转换成了无符号数。

int randval;
randval = {
   $random % 60};      //随机产生一个0~59之间的无符号数

2. $urandom——系统方法,返回32bit的无符号伪随机数

语法如下:

function int unsigned $urandom(int seed);
//种子seed是可选参数,决定了生成的随机数值。相同的种子生成的随机数值也相同

示例:

bit[64:1]   addr;
bit [3:0]   number;

addr[32:1] = $urandom(254) ;      //初始化随机数发生器(RNG),获得一个32bit的随机数

addr = {
   $urandom, $urandom};     //产生一个64bit的随机数
number = $urandom & 15;          //产生一个4bit的随机数

3. $urandom_range()——系统方法,返回指定范围内的无符号随机整数

语法如下:

function int unsigned $urandom_range(int unsigned maxval,
                                     int unsigned minval = 0);
//参数最小值min是可以省略的 , 且最大值与最小值的位置是可以互换的。

下述三个随机值都在0~7的范围内,示例:

val1 = $urandom_range(7,0) ;
val2 = $urandom_range(7) ;
val3 = $urandom_range(0, 7) ;

二、加约束的随机

首先建立一个具有一组相关的随机变量的类,然后用随机函数为这些变量赋随机值,可以用约束来限制这些随机值的范围,使他们是有效的值。

如下代码举例最简单的随机约束:

class Packet;
    typedef enum {
   BYTE, WORD, LWRD} length_e;
    rand length_e len;
    rand 	bit[31:0] 	src,dst,data[8];
    randc 	bit[7:0]	kind;    //随机变量
	bit [31:0] w_byte=
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在SystemVerilog(SV)中,randomize是一个用于随机化对象中的随机变量的方法。有几种不同的随机化方法和函数可以在SV中使用。 首先,可以使用类的randomize()函数随机化类中的随机变量。这个方法会为对象中的所有随机变量选择新的值,以满足所有的约束条件。 其次,SV提供了一些系统随机函数,如$urandom、$urandom_range和$random,可以直接调用来返回随机数值,而不需要通过类来调用。 此外,SV还提供了一些代码分支执行方法,如randcase和randsequence,用来执行随机的代码分支。 还有一种方法是使用std::randomize()来随机化范围变量。这个方法是内建的,并且不能被重载。 在随机化之前或之后,我们有时候希望立即执行一些操作。SV提供了两个内建方法来满足这个需求,即pre_randomize()和post_randomize()。这两个方法在随机化之前或之后会自动调用。 如果只想随机化一个随机变量,可以只传递该变量给randomize()方法。同时,使用constraint_mode()方法可以启用或禁用对象中的任何命名约束,使用rand_mode()方法可以控制随机变量的激活或禁用状态,这些状态会被求解器视为状态变量。所有的随机变量最初都是激活的。 综上所述,SV中的randomize方法可以用于随机化对象中的随机变量,而且还有其他的方法和函数可以用于不同的随机化需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [sv随机总结](https://blog.csdn.net/weixin_40401463/article/details/108421423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [SV---随机函数](https://blog.csdn.net/weixin_42263208/article/details/107449966)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值