路科验证(Rocker IC)专注于验证系统思想和前沿工程资讯,拥有一支活跃的技术原创团队,著有《芯片验证漫游指南》一书,致力为高校微电子相关专业学生与IC从业人员提供技术食粮。 您可以在手机移动端同步关注微信订阅号“路科验证”或是登录网页www.rockeric.com了解更多资讯。如果您需要联系我们,请发送邮件至 rocker.ic@vip.163.com 。

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

上一篇 / 下一篇  2018-05-20 13:33:23 / 个人分类:验证系统思想

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的桥接功能才可以工作。


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



TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

路科验证

路科验证

路科验证(Rocker IC)专注于验证系统思想和前沿工程资讯,拥有一支活跃的技术原创团队,为高校微电子相关专业学生与IC从业人员提供技术食粮。 您可以在手机移动端同步关注微信订阅号“路科验证”。如果您需要联系我们,请发送邮件至 rocker.ic@vip.163.com 。

日历

« 2018-12-06  
      1
2345678
9101112131415
16171819202122
23242526272829
3031     

数据统计

  • 访问量: 195012
  • 日志数: 272
  • 建立时间: 2016-06-25
  • 更新时间: 2018-12-01

RSS订阅

Open Toolbar
博聚网