寄存器模型的意义
寄存器模型,字面理解,跟参考模型类似。就是为工程里的寄存器提供一个参考模型。
这个模型里,包括各个寄存器字段描述、寄存器、寄存器组、寄存器地址映射等信息。
有如下好处:
- 寄存器模型建立的目的,初始目的,是为了验证寄存器配置过程的。
- uvm里提供内置sequence,可以实现后门访问的路径检查、寄存器初始值的检查、寄存器读写属性的检查等。
- 寄存器模型里,有一套标准的访问接口,暂且叫做reg接口;可以通过uvm_adapter实现apb到reg的接口转换,以及reg到apb的接口转换。ps:其中apb是apb协议的事务接口,而非apb协议的信号接口。
- 增加了后门访问机制。带来的好处是,不消耗仿真时间;提供直接访问hdl path的方式,而非DUT apb接口信号方式,所以能够做的事情更多,比如强制改变某寄存器的初始值等。
- 寄存器模型,可以跟寄存器描述文档对应。所以,可以根据寄存器模型,更新寄存器描述文档;又或者根据寄存器描述文档,更新寄存器模型。最终实现,寄存器描述文档与设计代码的准确对应。
- 有了寄存器模型,任意uvm_component都可以很方便的获取寄存器的状态值。比如reference model组件。
寄存器模型的搭建
- reg_model的定义
- uvm_reg的定义
- uvm_reg_field,寄存器字段的实例化
- reg_field的configure
- uvm_reg_block的定义
- uvm_reg,寄存器的实例化
- reg的configure
- build
- default_map,地址映射
-
uvm_adapter的定义
-
base_test的定义
- reg_model的实例化以及初始化【为什么不在env里实例化?个人理解,reg_model的实例化需要紧接初始化步骤,初始化的步骤,更适合放在base_test里。好像uvm实战里,在uvm_env层次里定义了reg_model的指针,全局系统里,都是利用uvm_env里的这个reg_model指针进行的connect;有了这一步骤,使得reg_model看起来是uvm_env层次下的一个组件。】【reg_model为什么不是uvm树形结构的组件?因为它没有在env里实例化。:)】
- adapter实例化
- 寄存器模型的default_map在uvm验证环境方面的设置
- 寄存器模型在base_test和sequencer做connect_phase的连接。
- virtual sequence
寄存器的写操作,一般都在virtual sequence里发起。当然,virtual sequence也可以发起寄存器的读操作。
- uvm_reg_mem_hdl_paths_seq(需要后门访问)
- uvm_reg_hw_reset_seq
- uvm_reg_access_seq(需要后门访问)
- p_sequencer.p_rm.rab_ctrl.write(status,32’hffffffff,UVM_FRONTDOOR);
p_sequencer.p_rm.rab_ctrl.read(status,value,UVM_FRONTDOOR);
- 其它组件访问寄存器,主要是发起寄存器的读操作。比如reference model
- uvm_reg不需要实例化,提供一个指针即可。当然,在uvm_env层次里,要定义该指针与virtual sequencer之间的连接(实际上采取了两步骤,第一步骤,指针与reg_model实例的build_phase挂接;第二步骤,reg_model实例与virtual sequencer之间的connect_phase连接)。
- p_rm.rab_ctrl.read(status,value,UVM_FRONTDOOR);
- 上述步骤,实现了reg_model的前门访问。至于后门访问,是通过7.3.5章节实现的。
寄存器模型的FAQ