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

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

日志

UVM寄存器篇之四:寄存器模型的集成(中)

已有 3585 次阅读| 2018-5-20 13:33 |个人分类:验证系统思想|系统分类:芯片设计

MCDF寄存器模块代码

下面我们给出实现后的MCDF寄存器RTL设计代码:


上面的设计中采取了宏的方式来替代一些寄存器的序列号和地址,这些宏在稍后的寄存器模型在映射硬件寄存器路径上也使用了。这么做使得设计和验证都因为采用同一套宏,而在后期寄存器地址、位置等修改时,更易维护环境,保持设计和验证两侧的一致,同时采用宏(或者parameter)的可读性也更好。


Adapter实现

在具备了MCDF总线UVC之后,需要实现adapter。每一个总线对应的adapter所完成的桥接功能即是在uvm_reg_bus_op(寄存器操作transaction)和具体总线的transaction(这里指mcdf_bus_trans)之间的转换。uvm_reg_adapter类以及通过稍后的adapter集成,使得用户在开发某一个总线adapter类型时,只需要下面几点:

  • uvm_reg_bus_op与总线transaction中各自的数据映射。

  • 实现reg2bus()和bus2reg()两个函数,这两个函数即实现了不同transaction之间的数据映射。

  • 如果总线支持byte访问,可以使能supports_byte_enable;如果总线UVC要返回response数据,则应当使能provides_responses。在本例中,mcdf_bus_driver在读数时会将读回的数据填入到RSP并返回至sequencer,因此需要在adapter中使能provides_responses。由此使得bus2reg()函数调用时得到的数据是总线返回时的transaction,但读者需要注意如果总线UVC不支持返回RSP(没有调用put_response(RSP)或者item_done(RSP)),那么不应置此位,否则adapter将会使得验证环境挂起。默认情况下,上述的两个成员的复位值都是0。


uvm_reg_bus_op类型的成员包含下面6个域:

从下面给出的MCDF桥接类reg2mcdf_adapter的实现来看,在构建函数中使能了provide_responses,这是因为mcdf_bus_driver在发起总线访问之后会将RSP一并返回至sequencer。reg2bus()完成的桥接场景是,如果用户在寄存器级别做了操作,那么寄存器级别操作的信息uvm_reg_bus_op会被记录并系统会调用uvm_reg_adapter::reg2bus()函数。在完成了将uvm_reg_bus_op中的信息映射到mcdf_bus_trans之后,函数将mcdf_bus_trans实例返回。而在后台,返回了mcdf_bus_trans之后,该实例将通过mcdf_bus_sequencer传入到mcdf_bus_driver。这里的transaction传输是后台隐式调用的,不需要读者自己发起。而寄存器无论读写,都应当知道总线操作后的状态返回,对于读操作时,也需要知道总线返回的读数据,因此uvm_reg_adapter::bus2reg()即是从mcdf_bus_driver()将数据写回至mcdf_bus_sequencer,而一直保持监听的reg2mcdf_adapter一旦从sequencer获取了RSP(mcdf_bus_trans)之后,就将自动调用bus2reg()函数。该函数的功能与reg2bus()相反,完成了从mcdf_bus_trans到uvm_reg_bus_op的内容映射。在完成映射之后,更新后的uvm_reg_bus_op数据最终返回至寄存器操作场景层。对于寄存器操作,无论读操作还是写操作,都需要经历调用reg2bus(),继而发起总线事务,而在完成事务发回反馈之后,又需要调用bus2reg(),将总线的数据返回至寄存器操作层面。



Adapter集成

在具备了寄存器模型mcdf_rgm、MCDF总线UVC mcdf_bus_agent和桥接reg2mcdf_adapter之后,就需要考虑到集成到验证环境中去了。下面给出了adapter集成例码。在这段例码中,读者需要注意下面几点:

  • 对于mcdf_rgm的集成,我们倾向于从顶层传递的方式,即最终从test层传入寄存器模型句柄。这种方式有利于验证环境mcdf_bus_env的闭合性,在后期不同test如果要对rgm做不同的配置,都可以在顶层例化,而后通过uvm_config_db来传递。

  • 寄存器模型在创建之后,还需要显式调用build()函数。需要注意uvm_reg_block是uvm_object类型,因此其预定义的build()函数并不会自动执行,还需要单独调用。

  • 在还未集成predictor之前,我们采用了auto prediction的方式,因此调用了函数set_auto_predict()。关于prediction的几种方式我们将在下一节《寄存器模型的常规方法》中详细介绍。

  • 在顶层环境的connect阶段中,需要将寄存器模型的map组件与bus sequencer和adapter连接。这么做的必要性即在于将map(寄存器信息)、sequencer(总线侧激励驱动)和adapter(寄存器级别和硬件总线级别的桥接)关联在一起。也只有通过这一部,adapter的桥接功能才可以工作。


谢谢你对路科验证的关注,也欢迎你分享和转发真正的技术价值,你的支持是我们保持前行的动力。



点赞

评论 (0 个评论)

facelist

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

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

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

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

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

GMT+8, 2024-3-29 01:45 , Processed in 0.016495 second(s), 12 queries , Gzip On, Redis On.

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