UVM寄存器篇之五:寄存器模型的集成(下)

本文转自:http://www.eetop.cn/blog/html/28/1561828-6266222.html

前门访问

利用寄存器模型,我们可以更方便地对寄存器做操作。接下来我们分别两种访问寄存器的方式,即前门访问(front-door)和后门访问(back-door)。前门访问,顾名思义指的是在寄存器模型上做的读写操作,最终会通过总线UVC来实现总线上的物理时序访问,因此是真实的物理操作;而后门访问,指的是利用UVM DPI (uvm_hdl_read()、uvm_hdl_deposit()),将寄存器的操作直接作用到DUT内的寄存器变量,而不通过物理总线访问。

下面给出一段进行前门访问的例码。下面的这个sequence,继承于uvm_reg_sequence,其除了具备一般uvm_sequence的预定义方法外,还具有跟寄存器操作相关的方法。下面对寄存器操作的例码中,用户可以看到两种方式:

  • 第一种即uvm_reg::read()/write()。在传递时,用户需要注意将参数path指定为UVM_FRONTDOOR。uvm_reg::read()/write()方法可传入的参数较多,除了status和value两个参数需要传入,其它参数如果不指定,可采用默认值。

  • 第二种即uvm_reg_sequence::read_reg()/write_reg()。在使用时,也需要将path指定为UVM_FRONTDOOR。

扫描二维码关注公众号,回复: 3598692 查看本文章

后门访问

在进行后门访问时,用户首先需要确保寄存器模型在建立时,是否将各个寄存器映射到了DUT一侧的HDL路径。下面的例码即实现了寄存器模型与DUT各个寄存器的映射:

例码中通过uvm_reg_block::add_hdl_path(),将寄存器模型关联到了DUT一端,而通过uvm_reg::add_hdl_path_slice完成了将寄存器模型各个寄存器成员与HDL一侧的地址映射。例如在稍后对寄存器SLV0_RW_REG进行后门访问时,UVM DPI函数会通过寄存器HDL路径“reg_backdoor_access.dut.regs[0]”映射到正确的寄存器位置,继而对其进行读值或者修改。另外,寄存器模型build()函数最后一句,以lock_model()结尾,该函数的功能是结束地址映射关系,并且保证模型不会被其它用户修改。

在寄存器模型完成了HDL路径映射后,我们才可以利用uvm_reg或者uvm_reg_sequence自带的方法进行后门访问,下面仍然给出一段后门访问的例码。类似于前门访问,后门访问也有几类方法提供:

  • uvm_reg::read()/write(),在调用该方法时需要注明UVM_BACKDOOR的访问方式。

  • uvm_reg_sequence::read_reg()/write_reg(),在使用时也需要注明UVM_BACKDOOR的访问方式。

  • 另外,uvm_reg::peek()/poke()两个方法,也分别对应了读取寄存器(peek)和修改寄存器(poke)两种操作,而用户无需指定访问方式尾UVM_BACKDOOR,因为这两个方法本来就只针对于后门访问。

前门访问和后门访问的比较

下面的表总结了前门访问和后门访问的主要差别:

从上面的差别可以看出,后门访问较前门访问更便捷一些更快一些,但如果单纯依赖后门访问也不能称之为“正道”。实际上,利用寄存器模型的前门和后门访问两种混合方式,对寄存器验证的完备性更有帮助。下面给出一些实际应用的场景:

  • 通过前门访问的方式,先验证寄存器访问的物理通路工作正常,并且有专门的寄存器测试的前门访问用例,来遍历所有的寄存器。在前门访问被验证充分的前提下,可以在后续测试中使用后门访问来节省访问多个寄存器的时间。

  • 如果DUT实现了一些特殊寄存器,例如只能写一次的寄存器等,我们建议用物理方式去访问以保证反映真实的硬件行为。

  • 寄存器随机设置的精髓不在于随机可设置的域值,而是为了考虑日常不可预期的场景,先通过后门访问随机化整个寄存器列表(在一定的随机限制下),随后再通过前门访问来配置寄存器。这么做的好处在于,不再只是通过设置复位之后的寄存器这种更有确定性的场景,而是通过让测试序列一开始的寄存器值都随机化来模拟无法预期的硬件配置前场景,而在稍后设置了必要的寄存器之后,再来看是否会有意想不到的边界情况发生。

  • 有的时候,即便通过先写再读的方式来测试一个寄存器,也可能存在地址不匹配的情况。譬如寄存器A地址本应该0x10,寄存器B地址本应该为0x20;而在硬件实现用,寄存器A对应的地址位0x20,寄存器B对应的地址位0x10。像这种错误,即便通过先写再读的方式也无法有效测试出来,那么不妨在通过前门配置寄存器A之后,再通过后门访问来判断HDL地址映射的寄存器A变量值是否改变,最后通过前门访问来读取寄存器A的值。上述的方式是在之前前门测试的基础之上又加入了中途的后门访问和数值比较,可以解决地址映射到内部错误寄存器的问题。

  • 对于一些状态寄存器,在一些时候外界的激励条件修改会依赖这些状态寄存器,并且在时序上的要求也可能很严格。例如,上面MCDF的寄存器中有一组状态寄存器表示各个channel中FIFO的余量,而channel中FIFO的余量对于激励驱动的行为也很重要。无论是前门访问还是后门访问,都可能无法第一时间反映FIFO在当前时刻的余量。因此对于需要要求更严格的测试场景,除了需要前门和后门来访问寄存器,也需要映射一些重要的信号来反映第一时间的信息。

猜你喜欢

转载自blog.csdn.net/qq_41394155/article/details/82757067
今日推荐