clocking_cb驱动之坑
背景:
最近在case回归中,偶尔会出现配置寄存器的时候没有生效的情况,查看log,adpter打印正常,但是波形上确实没有看到写入,百思不得其解。
Debug:
driver里面加上打印之后发现,driver开始驱动的时间点刚好在clk下降沿,drive信号部分的代码示意如下:
vif.mst_cb.valid <=1;
vif.mst_cb.data <= req_item.data;
@vif.mst_cb;
咋一看,这样好像没有问题啊,使用clocking_cb驱动信号,会自动将信号同步到上升沿处,也就是说即使是在下降沿处开始执行赋值语句,结果也会是在下一个上升沿处才会赋值成功。但是问题也就在这里,因为赋值语句在下一个上升沿处才会赋值成功,这个时候下一行的@vif.mst_cb也会执行成功,此时,如果下一个时刻seq再下发一个item,本次赋值就会被下一次的item覆盖,出现log显示有配置但是实际上没有写成功的情况。
解决办法:
这个就很简单了,确保赋值成功才退出即可。