索手锋芒的个人空间 https://blog.eetop.cn/calvin [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

multi-clock system driver使用clock blocking注意事项

已有 826 次阅读| 2015-4-18 23:27 |个人分类:UVM notebook

如果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

点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 4

    获赞
  • 4

    评论
  • 3176

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-11 03:58 , Processed in 0.016914 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部