UVM寄存器篇之二:寄存器模型概览(下)

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

寄存器模型构建

在构建UVM寄存器模型的过程中,读者需要了解下面这些与模型构建相关的类和它们的功能:


简化后的MCDF寄存器模型定义如下:

从上面的定义中,读者可以整理出关于寄存器建模的基本要点和顺序:

在定义单个寄存器时,需要将寄存器中的各个域整理出来,在创建之后还应当通过uvm_ref_field::configure()函数来进一步配置各自属性。考虑到uvm_reg_field::configure函数自身的参数较多,且都要求指定出来,需要读者保证参数的一一对应。

在定义uvm_reg_block时,读者需要注意reg_block与uvm_mem、uvm_reg以及uvm_reg_map的包含关系。首先uvm_reg和uvm_mem都分别对应着硬件中独立的寄存器或者存储,而一个uvm_reg_block可以用来模拟一个功能模块对应的寄存器模型,因此其中可以容纳多个uvm_reg和uvm_mem的实例;其次map的作用一方面用来表示寄存器和存储对应的偏移地址,同时由于一个reg_block可以包含多个map,各个map可以分别对应不同总线或者master访问uvm_reg_block时的地址段。在reg_block中创建了各个uvm_reg之后,需要调用uvm_reg::configure()去配置各个uvm_reg实例的属性。

考虑到uvm_reg_map也会在uvm_reg_block中例化,在例化之后需要通过uvm_reg_map::add_reg()函数来添加各个uvm_reg对应的偏移地址和访问属性等。只有规定了这些属性,才可以在稍后的前门访问(frontdoor)中给出正确的地址。

一个uvm_reg_block可以用来对更大的子系统或者芯片系统的寄存器建模,这意味着uvm_reg_block之间也可以存在包含关系构成层次,同时上层的uvm_reg_map也可以添加子一级uvm_reg_block的uvm_reg_map,用来构建更全局的“版图”。继而通过uvm_reg_block与uvm_reg_map之间的层次关系来构建更上层的寄存器模型集成。

上面的寄存器模型mcdf_rgm在构建时暂时没有考虑功能覆盖率收集和后门访问路径指定,这些特性的添加我们将在后面的具体环节中进一步添加。那么当一旦拥有一个寄存器模型之后,它接下来的使用步骤是什么呢?实际上对于不同的角色,他们对寄存器模型也有着不同的关注,譬如VIP开发者主要关注实现总线适配器,TB开发者关系如何将总线适配器与寄存器模型的连接等。但寄存器模型从一开始的寄存器描述文档到最后的功能检查,都需要贯穿如下的生命周期:

对于不同的验证过程中的角色,他们可能会参与上述的部分流程:

  • 对于系统工程师需要提供寄存器描述文件。

  • 对于模块验证人员需要生成寄存器模型。

  • 对于VIP开发人员需要提供总线适配器。

  • 对于TB构建人员(与模块验证人员有时候不是同一个人)需要集成寄存器模型。

  • 对于模块验证人员还需要完成后续的寄存器模型检查和功能覆盖率收集。

但对于寄存器模型的生命周期,接下来的环节中我们除了已经介绍的生成寄存器模型以外,将逐一将寄存器模型的集成和总线适配器、寄存器模型的常用方法以及寄存器模型检查和功能覆盖率收集介绍给读者。

猜你喜欢

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