SV_3_随机

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


前言

本章学习随机约束


一、最简单的随机

可以用在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, w_word
<think>根据用户提供的搜索词“-sv_seed”,结合常见的编程和测试领域知识,可以推断用户可能是在询问与SystemVerilog(SV)相关的随机数种子(seed)设置问题。在SystemVerilog中,`-sv_seed`是一个命令行选项,用于指定仿真器的随机种子值,确保测试的可重复性。 通过搜索确认:在SystemVerilog仿真中,`-sv_seed`选项用于设置随机数生成器的起始种子值。例如,在Synopsys VCS等仿真器中,可以通过命令行传递该参数来控制随机化过程。 因此,回答将围绕如何设置和使用`-sv_seed`进行说明,并强调其重要性。</think>在SystemVerilog仿真中,`-sv_seed`是用于控制随机数生成器种子的命令行参数,直接影响测试用例的随机化行为。其核心作用如下: ### 功能与用法 1. **设置固定种子** 通过`-sv_seed <value>`指定具体数值(如`-sv_seed 123`),使每次仿真产生相同的随机序列,用于重现特定测试场景。 示例命令: ```bash vcs -sverilog test.sv -sv_seed 42 ``` 2. **随机种子模式** 使用`-sv_seed random`让仿真器自动选择随机种子(通常基于系统时间),适用于需要每次运行不同随机序列的场景: ```bash vcs -sverilog test.sv -sv_seed random ``` 3. **种子报告** 添加`-sv_seed show`参数可在仿真日志中输出实际使用的种子值,便于后续复现问题: ```bash vcs -sverilog test.sv -sv_seed show ``` ### 应用场景 - **调试确定性缺陷**:固定种子复现随机化导致的边界条件错误 - **回归测试**:通过相同种子验证代码修改是否引入新问题 - **覆盖率收敛**:多组随机种子提升状态/分支覆盖率 ### 注意事项 - 种子值范围通常为32位无符号整数(0 到 $2^{32}-1$) - 不同仿真器(VCS/Xcelium/Questa)支持此参数,但具体实现可能略有差异 - 需在测试平台中正确调用`$urandom`或`std::randomize()`等随机化方法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值