验证IP(VIP)编写-item

今天接着上期,我们一起学习一下vip中item的编写思路和方法。那么item其实就是把我们要发送的激励进行打包封装起来,然后sequence驱动的时候就直接以item的形式进行发送。那么在item里面定义哪些变量,其实很多时候可以参考interface(仅是参考哦,这两者没有必然联系),比如我们要进行握手,然后发送数据,那么item里面是不是得有vld变量,然后得有data吧,大概就是这个意思。

那么我想了一下,其实无论什么代码都有很多写法。不应该固化,只要了解原理,我们随时可以写出各种正确且简便的代码。因此这一章,我打算不展示代码写法了,而是和大家一起学习一下写item一些基础的方法。比如随机变量的定义;约束怎么加;如果搭建的uvm平台,有哪些uvm机制等等。

1,随机变量的定义
其实很简单了,这里主要知道两个关键字就行了:rand,randc
那他两有什么区别呢
rand bit [1:0] a; //这句话声明了a是一个2位的无符号整数,其值在0到3的概率是相等的。相当于样本放回的随机采样,相邻两次可能相同。
randc bit [1:0] a; //也是声明了a是一个2位无符号整数,区别在于randc是循环随机,是拿一个少一个,当每个可能的值都出现一遍后才会重复。比如拿a来说,你循环三次,那必然1,2,3都能取到,只是顺序不一定,第四次随机才可能出现重复数字。
注意:指向对象的句柄成员,也可以声明为rand(不能被声明为randc)

2,约束
那么item的约束后面单独出一期再说

3,filed automation机制
定义完item的变量,uvm平台中我们一般会对变量进行注册,这里就用到了filed automation机制。那么这个有什么用呢?
UVM field automation机制是主要为了方便用户对事物进行一系列的功能处理而建立的一套服务机制。对于使用了这个机制的成员,就有clone,copy,print,sprint,pack,unpack,record这些UVM的内建函数可以涵盖它。举个例子吧

//假设transanction已经通过automiation机制进行注册
transanction a;//声明句柄
a = new();//new对象
a.print();
a.compare();//对于使用了automiation机制的成员
//直接调用print,compare等函数,不用编写多余的代码

说了半天这个机制多好多方便,但好像把最重要的没说,那我们到底怎么注册呢?
非常方便,uvm给了我们一些宏,通过宏对变量进行注册,宏很多,我挑几个常用的说一说

`define uvm_field_int(ARG,FLAG)
`define uvm_field_real(ARG,FLAG)
`define uvm_field_enum(T,ARG,FLAG)
`define uvm_field_object(ARG,FLAG)
`define uvm_field_array_int(ARG,FLAG)
`define uvm_field_queue_int(ARG,FLAG)

ARG就是我们要注册的变量,很简单。那么这个FLAG代表什么呢?就是代表我们要选择使用哪些内建函数,一般情况下我们都写UVM_ALL_ON或者UVM_DEFAULT,这两个都表示所有方法,我全都要!(但这两个其实也有细微的差别,我就不说了,有兴趣的同学去看看源码)。那有的同学说我就不全要,比如我不爱copy,不想要这个方法,那我这个FLAG怎么写,就是UVM_NOCOPY,不要啥就UVM_NO啥 就可以了。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值