(1) 一个寄存器模型必须包含一个reg_block;一般DUT内具有相同的基地址的所有寄存器,会放在一个reg_block中. (2) uvm_reg_block可以包含任意数量的uvm_reg, register files, memories以及其他低层次的uvm_reg_block; (3) uvm_reg block里含有uvm_reg_map类对象default_map,用于地址映射以及完成寄存器前门访问操作...
(2) 在使用get_root_blocks函数得到reg_block的指针后,使用cast将其转化为目标reg_block形式; externstaticfunctionvoidget_root_blocks(refuvm_reg_block blks[$]); functionvoiduvm_reg_block::get_root_blocks(refuvm_reg_block blks[$]);foreach(m_roots[blk]) begin blks.push_back(blk); end endfunc...
uvm_reg_field:包含uvm_reg_data_t类型的三个成员变量value,m_mirrored,m_desire。 uvm_reg:包含成员变量m_fields,加入各个uvm_reg_field。 uvm_reg_block:uvm_reg的集合,uvm_reg需要加入到uvm_reg_map中,且属于同一个uvm_reg_block。每个uvm_reg_block至少包含一个uvm_reg_map。uvm_reg_block中也可以再...
uvm_reg_map:用于存储寄存器模型里寄存器的地址,在每个reg_block里至少有一个uvm_reg_map(通常也只有一个)。 接下来我们来分享如何定义一个最简单的寄存器模型(只有一个寄存器,且寄存器里只有一个寄存器域)。 首先,要先从uvm_reg类里派生一个寄存器类(即先生成一个寄存器的版图),在这个类里会有一个build函数(完...
1.2.2. reg_block 建立完所有的reg类之后,需要建立一个reg_block类,将一组reg包含进对应的reg...
定义好此寄存器后,需要在一个由reg_block派生的类中将其实例化: 每一个由uvm_reg_block派生的类也要定义一个build函数,一般在此函数中实现所有寄存器的实例化 一个uvm_reg_block中一定要对应一个uvm_reg_map,系统已经有一个声明好的default_map,只需要在build中通过调用uvm_reg_block的create_map来将其实例化...
UVM入门学习笔记:寄存器模型1. 层次化的寄存器结构 创建方式:通过uvm_reg_block创建层次化的寄存器结构。 组织方式:通常使用两层结构组织,第一层包含uvm_reg,第二层用于组织子块。 配置与初始化:在父reg_block中实例化子reg_block,并调用configure和build方法。同时,将子reg_block的default_map...
寄存器模型在创建后还需显式调用build()函数。需要注意uvm_reg_block是uvm_object类型,因此其预定义的build()函数不会自动执行,需单独调用。 在还未集成predictor之前采用了auto prediction的方式,因此调用了函数set_auto_predict()。 顶层环境的connect阶段还需要将寄存器模型的map组件与bus_sequencer和adapter连接。这样...
一个reg_block可以包含多个reg_map, 从而实现一个reg_block应用到不同总线,或不同地址段上。 uvm_mem是对dut中memory进行建模使用的。 这些类均是继承自uvm_object类。一个完整的register model, 均有这些层次化的register元素构成,放到顶层的reg block中。一个reg block可以包含子block,register,register file和me...
UVM的寄存器模型中,uvm_reg_file用于区分不同的hdl路径,通过派生的reg_file,可以避免因reg_block名称变动导致的大量修改。当多个域的寄存器需要配置时,每个field需单独配置并添加到reg中的hdl路径。对于大位宽寄存器,UVM允许它们占用多个地址,只需在configure中指定位宽,UVM会自动处理读写操作。验证人员...