#VERDI# 关于查看event sequence和event region方法

sv和verilog虽然是并行语言,但是对于仿真而言细分到底其实是做不到的,事件发生总是有先后的,所以sv使用了event region,然后为了解决tb和rtl的竞争后来出了program,再后来有了clocking block,验证中常犯的一个错误就是clk和clocking block 的混用,用着用着就把自己搞迷糊了。

那么遇到这种问题时是否有比较好的debug方式,其实是有的,下面介绍一下在verdi中如何查看event sequence,event region。

一 查看event sequence

运行时加入命令:

打开波形,开启event sequence

可以看到对应时刻的event sequence,下图所示的就是代码中第一次赋值的时刻

clk:0->1

a:x->77

b:x->0

虽然在波形上看到三个signal是同一时刻变化的,但是对于sv的仿真来看,他们在执行上是存在先后顺序的

 

 

2  查看event region 

如果要看到event region,运行时加入命令:

打开波形后开启region mode并打开expand time at cursor:

然后就可以看到event region,同时也可以看event sequence:

图中黄色区域是region active ,执行了阻塞赋值,也即clk的赋值,红色区域是region NBA,执行了非阻塞赋值,也即a和b的赋值。到这里已经把debug的手段理清了,接下来试试各种场景。

  • 上述代码中第二个赋值时刻对a_data分别在interface和drv_cb中进行了<=赋值,v_if.a_data的值发生了两次变化:77->99和99->88,后一次是在drv_cb中对v_if.a_data的赋值;drv_cb.a_data的和clk的变化在同一个region,这是因为虽然使用的是<=操作符,但实际是个clocking drive,因为使用了drv_cb,并不是非阻塞赋值

  • 如果我们把clk的赋值改为<=,可以看到clk的变化和drv_cb.a_data的赋值不在同一个region了

  • clk和clocking block混用的后果,下面这段代码的意图是先一拍赋值88,隔一拍后赋值99,但最终是一拍变成了99,和预期并不一致,这里值得注意的是drv_cb.a_data的两次赋值是发生在不同time slot的active region

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值