SV学习笔记——randc为什么不能随机化产生具有唯一元素值的数组

 “如果想要产生一个随机数组,它的每一个元素值都是唯一的。如果使用randc数组,那么数组的每一个元素都会独立的随机化,并不会按照我们的本意使得数组中的元素值都是唯一的。”

       在学习路科验证的课程的SV语言部分之四随机约束一讲中有上述这么一句话,路桑在这里没有细讲,当时一头雾水,想着randc这个关键词修饰的变量,随机化之后产生的随机值不是不会重复嘛?

        然后翻了下绿皮书(《SystemVerilog验证——测试平台编写指南》),第六章“随机化”章节中,6.13.5小节“产生具有唯一元素的数组”中,有这么一句话:

“怎么才能产生一个随机数组,他的每一个元素的值都是唯一的?如果使用randc数组,那么数组的每一个元素都会独立的随机化,所以几乎一定会出现重复的值。”

        但是也没有给出详细的解释。书上的这句话到底怎么理解?“每一个元素都会独立的随机化”是什么意思?甭急,咱慢慢聊~


        我们都知道,randc这个关键词修饰的变量在多次随机化中,随机出来的值不会重复,就相当于抽卡牌,每抽出一张,不会将这张卡牌放回去,那抽下一张卡牌就不会抽中重复的。对于单一的变量,确实是这样的,比如:

randc bit[7:0] offer;

只要你随机的次数不多,每次随机出来的结果都会不同。因为offer是8bit变量,取值范围0~255,可以取256个数据,你要是随机257次肯定会随机出来相同的数。

randc单一的变量是这样的,那randc数组呢?就不是这样了!(正片开始:)

先看绿皮书上对randc是怎么描述的,绿皮书136页,6.3.1节,是这么说的:

“kind变量是randc类型,表示周期随机性,即所有可能的值都赋过值后随机值才可能重复。这就好像发牌,从一副牌里一张一张的、随机地抽出所有牌,洗牌后再按一个顺序随机地抽出牌。注意,周期性是指单一变量的周期性,例如具有八个元素randc数组就会有八种不同的周期。”

这段话前半段没什么问题,重点是最后一句“周期性是指单一变量的周期性”。这一句是之前所有问题答案的关键所在。对这句话理解如下(重点来了):

首先,单一变量是什么?

randc bit[7:0] offer;

上述代码中,offer就是一个单一变量。

randc bit[7:0] offer [1:0];

此时,offer是一个二维数组,数组中有两个元素offer[0]、offer[1],每个元素都是8bit数据。那这两个元素就是两个单一的变量:offer[0]、offer[1]。

然后,单一变量的周期性怎么理解呢?

假设offer[0]代表小汪的offer数量,offer[1]代表小段的offer数量,

对offer进行随机化:

offer.randomize();

系统会分配两套纸牌,小汪offer[0]和小段offer[1]各有一套,randomize()随机化后俩人各自从自己的那套卡牌里抽取一张属于自己的卡牌。因此小汪和小段每次随机的offer数量互不影响。

小段和小汪并不是抽取同一套卡牌,所以小段和小汪的offer数量是“独立的随机化”。“单一变量有自己的周期性”,这里的“周期性”就是指小段和小汪的两套不同顺序的卡牌抽取周期。

那这样就理解了“数组的每一个元素都会独立的随机化”是什么意思,因为每一个元素都是独立的进行随机,导致的结果就是不同的元素很有可能会有重复的值。所以只用randc 不能产生具有唯一元素值的数组。

(本篇完结撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* )

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小wang的IC自习室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值