验证工程师经常犯的错误(1)

来源 杰瑞IC验证 Author Q哥

01谈一个关于class句柄传递的坑

假设现在有如下的一个类MyClass:

Image

大家都知道,class变量本身呢只是一个句柄(有点像C语言里面的指针),没有new之前,指向空(null)。

当我们进行赋值的时候,只是传递句柄,并没有创建新的对象。比如:

Image

看似很简单吧,但是随着验证环境的复杂,容易忽视这一点:

比如在函数调用的时候:

Image

Image

可以看到funcX的第一个参数是input int类型。在函数调用的时候进行了单向复制,之后在funcX里面修改b(15行),并没有影响到funcY里面a的值;在funcY里面修改a(33行),也没有传递给b。

但是第二个参数就不一样了,由于是class类型,所以函数调用传递了句柄,也就是说,funcX里面的B 和funcY里面的A指向了同一个对象,操作B.ID和操作A.ID是等效的。 16行改变了ID值,所以17行和30行打出的ID值是一样的。之后,34行改变了A.ID的值,而A和B因为指向同一个对象,所以19行打印出的B.ID和25行的A.ID是一样的。
所以,如果不希望这两个类变量指向同一个对象,需要在funcX的一开始,就手动拷贝一份。

Image

这样之后对C的操作不会传递给A,A的操作也不影响C。
对象就像是一个提线木偶,句柄就是线!!

还是很简单?又比如在uvm port传递transaction的时候,monitor中抓transaction就发给scoreboard,如果scoreboard处理过程中,monitor又发了新的transaction,后果不堪设想啊!
再来,当我们把一个对象push进队列的时候,其实保存的也只是句柄:

Image

// 结果是
myclass_q[0].ID = 2
myclass_q[1].ID = 2
myclass_q[2].ID = 2

所以,需要每次create一个新的对象,再放入队列,这是一个好的coding sytle:

Image

02谈一个枚举类型拼位的坑

今天再讲一个小的枚举相关的问题代码:

Image

Fruit_e默认是32 bit;

如果需要声明成2 bit,需要改成:

Image

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值