寄存器模型中的两种预测方法
1、set_auto_predict(n)
当n=1时,会在调用 uvm_reg::write 或 uvm_reg::read方法中,自动调用uvm_reg::predict 方法更新镜像值与期望值。
2、reg predictor
通过monitor得到总线上的读写传输,如果读写传输的地址是寄存器的地址,则predictor会更新该地址对应寄存器的期望值和镜像值。
3、区别
对于第一种方法:如果不通过寄存器模型对design中reg进行操作,uvm_reg::predict 方法就不能够被自动调用,从而无法实现自动更新镜像值与期望值。
对于第二种方法:由于依赖于monitor监测到的数据,所以该预测方式可能在寄存器读写操作成功后的几个周期之内,才能把镜像值和期望值更新为正确的值。
reg predictor带来的问题
如下代码:首先获取chnl_ctrl_reg的期望值,并通过前门访问的方式把期望值写进寄存器中。然后再获取chnl_ctrl_reg的期望值,并从design中读取寄存器的值。最后再重复一次上述操作。
在调用reset后,chnl_ctrl_reg的期望值为7。那么,无论是data还是exp,其值都应为7。然而,在仿真的时候,exp和data的值有时为0,有时为7。
当设置了set_auto_predict(1),仿真结果正常。而关闭第一种预测方式,仅仅使用第二种预测方式,仿真结果异常。

从下面的仿真结果可以看出,写传输占用一个周期,读传输占用两个周期。所以读传输的时候,monitor会捕获两个数据包,只有第二次捕获的包是正确的。然而,monitor把捕获的这两个包都会发给reg predictor。monitor把第一个数据包发送给reg predictor,则chnl_ctrl_reg的期望值和镜像值就更新成异常值。monitor把第二个数据包发送给reg predictor,chnl_ctrl_reg的期望值和镜像值才会更新成正常值。当然,这样的情况是在特定的代码环境下,并不具有通用性。由monitor给reg_predict带来的时许还是值得关注!



文章讨论了寄存器模型中的两种预测策略,set_auto_predict自动更新期望值,而regpredictor依赖monitor捕获数据。实验指出,仅使用regpredictor可能导致预期值和镜像值在读传输期间更新不一致。
4185

被折叠的 条评论
为什么被折叠?



