路科验证的个人空间 https://blog.eetop.cn/1561828 [收藏] [复制] [分享] [RSS]

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

日志

天哪!竟然还有UVM寄存器模型的隐藏剧情

已有 1037 次阅读| 2018-12-1 20:45 |个人分类:验证前沿资讯|系统分类:芯片设计

rockeric.com

不少路粉对寄存器模型的使用可能还停留在这个阶段:

也就是说,通过寄存器句柄,配合读写指令,即可完成一次总线上的访问。

当然,你也可以通过指定BACKDOOR,来做后门访问。这两种方式在红宝书中,我们都已经详细介绍过了。今天路桑再来介绍一点儿不一样的,针对一些特殊的寄存器,有的时候这个寄存器可能是未映射的、非线性连续的,又或者需要通过BURST模式才能访问,总之无法通过一次SINGLE总线数据传输完成读写,这个时候,我们就可以考虑采用自定义的前门序列来实现了。


所以,今天路桑带来了一篇DVCon 2017的论文,Doing Funny Stuff with the UVM Register Layer: Experiences Using Front Door Sequences, Predictors, and Callbacks,来自于Dolous的John Aynsley,来深入谈一谈如何使用自定义的register sequence,来完成前门以及后门访问。



自定义前门访问序列

从这张图上可以看到,原有的前门访问是通过将寄存器级别的操作类型经过adapter转换为了总线级别的transanction,或者利用其反向路径完成转换,作为响应数据交回给寄存器模型一侧。当我们无法通过在adapter中使用bus transaction,而是需要通过多次bus transaction的组合来完成一次复杂的寄存器访问时,我们就可以使用用户自定义的寄存器前门序列,下面给出一段代码。


其中,rw_info是uvm_reg_item类型,是uvm_reg_frontdoor的成员变量,该对象包含着用来读写的目标uvm_reg的信息,譬如rw_info.kind为读写类型,rw_info.value表示读写数据,rw_info.status表示访问状态。在下面这个例子中,即是通过寄存器模型中的一个“虚拟寄存器”,其内容非连续分布在DUT中。因此,对于该寄存器的一次读写操作,实际上需要转换为两次读或者写操作,才可以通过两次访问非连续的地址,对其中片段数据完成操作才最终实现了该“虚拟寄存器”的读写操作。


其中task one_transaction的定义很直观:


点赞

评论 (0 个评论)

facelist

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

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

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

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

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

GMT+8, 2024-3-29 03:35 , Processed in 0.015492 second(s), 12 queries , Gzip On, Redis On.

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