马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 Pu1se 于 2022-8-17 20:26 编辑
uvm register model get error in reg mirror/read/write method for reg2bus running 2 times?
description:
问题概述:
我在搭建验证环境的时候,使用了apb总线读写寄存器,对寄存器读写进行了测试,测试过程为对寄存器前门写,然后mirror检查(前门方式):
regname0.write(status, data, UVM_FRONTDOOR) -> 500ns delay -> regname.mirror(status, UVM_CHECK, UVM_FRONTDOOR)
验证环境设置为:自动预测关闭set_auto_predict(0),adapter中provide_response = 1
然后就遇到了奇怪的问题,mirror检查报错了error,但是通过看总线波形读出的数据是正确的,如图所示:
随后我猜测是adapter的问题,于是在adapter中添加了如下的debug语句,打印了sequence item中的信息,同时为了确定bus2reg方法执行中拿到的哪个sequence item,在monitor中将监测并创建的read sequence item的 transaction id设置为 1111,将reg2bus产生的seq_item设置为2222, 如图所示:
然后比较诡异的事情就发生了,输出如图所示:
输出信息中:
1. 在对reg的第一次读的过程,先执行了reg2bus一次,这个对寄存器进行操作是然后自动调用的,这里执行是正确的,
2. reg2bus将reg_op转换成总线sequence_item,然后由driver驱动,并由monitor监测到,到这里都是正确的。
3. 然后发现bus2reg方法被调用了两次,bus2reg方法是在adapter从sequencer中拿到RSP的时候调用的(我在adapter中设置了provide_response = 1),但为什么这里bus2reg被调用了两次呢?
然后导致mirror结果出错的就是下面的执行过程了:
1. 在mirror的方法执行中,由于是前门访问,先调用了寄存器的read操作,对应的会先调用一次总线driver read操作,因此会调用一次reg2bus,这里是正确的
2. 随后可以在总线wave上观察到read操作,总线上读出的数据与先前reg写入的数据相同
3. 在消息日志中看到bus2reg被执行了一次,此时sequence item的 transaction id是1111,并且item中的数据是正确的
4. 然后bus2reg又被执行了一次,此时sequence item的 transaction id是2222,并且item中的地址正确,data出错,并且由于这次bus2reg的结果,导致了读出数据与寄存器模型的mirrored value不符,导致报错
整体问题就是这样的,不知道由于什么原因,寄存器模型更新的时候bus2reg被执行了两次,并且在前门读的过程中数据发生错误了,求助各位大佬,研究了好几天也没明白是什么原因?
在西门子论坛上看到了与此相似的问题,但是帖子下面并没有明确的解决方案,(已经是2011年的问题了...)(https://verificationacademy.com/ ... r-abstraction-layer)
2022.8.16 更新:bug解决了
debug了半天,终于解决了,问题发现出在driver read上,在dut侧的prdata由于设置了延时#2导致了2ns有prdata才发生改变,driver中prdata sample的逻辑是在pready为高后10ps才采样,因此采样到的数据是错误的...(但monitor监测到的seq item是正确的)因此导致了第二次bus2reg拿到driver 返回的RSP item更新寄存器出错。
同时,有关于为什么bus2reg被调用了两次的问题,这个debug之后发现,无论设置auto_predict为0还是为1,只要连接了predictor更新路径,在调用mirror方法都会调用bus2reg两次,一次是拿到driver RSP调用,一次是拿到monitor item调用。auto predict决定的是对寄存器模型进行write/read操作后是否自动更新镜像值,如果为0,进行write/read后更新是通过monitor监测的item来完成的,但同时driver RSP也会调用。
|