UVM讲解系列之五:常用的SV数据结构与随机化

目录

一、常用的数据结构

数组的复制

定位

排序

二、随机化方式

约束块

随机化transaction

应用举例


上一节讲述了sequence以及virtual sequence的工作原理,但是其中的技术细节没有展开描述,本节主要讲sv和uvm的基础知识,是我们编写组件都会用到的。

根据上一节引用的transaction代码,前两行定义了输入的信号类型,接下来是随机信号的约束。最后讲变量注册到uvm_field。这一节讲主要用的数据结构,数据类型和随机化。下一节主要讲field automation机制。

我们在产生激励或者处理的数据的时候会用到各种数据结构。上面例子,transaction中定义了两个信号,vld和data,一般情况下,环境会将随机好的数据放到队列里,当需要发送的时候,从队列取出。但是如果rtl的接口数据位宽是8bit,就需要把data按8bit存放,这时会用到尺寸为8,位宽是8bit的数组来存放64bit的数据。

上面是一种简单的情况,sv提供了很多数据结构的选择,用于处理各种复杂的情况。下面简单介绍一下常用的,不是全集,只是想到的一些常用的。

一、常用的数据结构

数组:int data0[3];

动态数组:int data1[];

队列:int data2[$];

数组的复制

我们常常用到复制操作,使用复制的数据进行计算,删改等操作可以避免改变原始数据。

①常量数组:

dst_data0 = src_data0;

②动态数组:

dst_data1=new(src_data1);

③动态数组如果只想复制其中一部分:

dst_data1=new[3](src_data1);

定位

find_index适用于数组与队列,find_index有多个用法,下面举个简单例子,基本上已经够用了。右边表达式表示在data_q中找到数值等于my_data的数,将其所在位置的索引放到左边的队列中,因此左边实际上放的是索引。我们使用find_index得到索引之后,就可以使用索引对查找到的数据进行操作,同时也可以根据是否查询到目标的数据my_data,来进行一些操作。

排序

以队列为例,我们通过int data_n[$]的方式定义了队列,定义之后队列还是空的,称之为size=0。队列也支持初始化和复制等操作。

常用的队列操作就是push_back、pop_front。当产生一个数时,通过push操作放到队列里面,使用的时候通过pop操作取出来。有一些场景需要将队列里面的数据重新排序,会用到一些方法:shuffle:将队列里面的元素打乱位置;sort:将队列里面的元素按从小到大排序;reverse:将队列的元素倒序。

下面这一小段代码的含义是:将已知的队列打乱顺序,通过foreach,逐个处理队列的元素,将已知队列的数据逐个pop_front出来,再逐个push_back到另一个队列里。

有的场景需要我们按顺序发包,为了保证严格按顺序执行,包里面带有顺序编号psn,要求按从小到大排列,此时就会用到sort

二、随机化方式

约束块

上面例子中如果需要在一定范围内随机data,一般我们会将约束写在constraint中

随机化transaction

上述transaction定义好变量之后,并切已经将随机的约束写好,那么我们如何在激励或者配置使用这个transaction呢?如下代码,首先实例化这个transaction,然后调用randomize函数,就产生一个符合约束的transaction了。

应用举例

以下代码中展示了常用的随机使用方式,使用foreach产生队列size那么多个数的transaction:①实例化并使用randomize随机transaction的内部变量;②randcase的使用,按设定的权重产生c_tr内的err变量;③使用std::randomize进行随机化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值