如果driver对interface驱动是使用clock blocking,那么在多时钟域的情况下,由于clock blocking的特性,有可能会有丢失package的问题。
ex:
task my_rd_task;
cb.rd_en <= 1'b1;
cb.address <= tr.addr;
@(cb);
cb.rd_en <= 1'b0;
cb.addr<= 0;
tr.rdata = cb.rdata;
endtask
上面这段code,如果sequnce_item是由另一个异步时钟域的seq丢过来的。那么my_rd_task不会在cb的posedge启动。
第一次rd_en的赋值在下一个posedge clock才真正会生产出来,此时刚好又把rd_en再次赋0,导致这一次rd_en根本没有拉起来就结束了。
my_rd_task不能在最开始就@cb进行同步,这样同步的sequnce没办法做的back-to-back的access。
解决方法如下
task my_rd_task;
bit[31:0] addr_sample;
cb.rd_en <= 1'b1;
cb.address <= tr.addr;
@(cb);
addr_sample = cb.addr
if(addr_sample != tr.addr)
@(cb); -->判断addr是不是已经在采样周期有效了,条件不成立说明上一次驱动有效
条件成立,说明上一次驱动无效,进行一次同步
cb.rd_en <= 1'b0;
cb.addr <= 0;
tr.rdata = cb.rdata;
endtask