`uvm_info("RegModel", $sformatf("%s:%0d - RegModel block %s does not need updating", fname, lineno,this.get_name()), UVM_HIGH);return; end `uvm_info("RegModel", $sformatf("%s:%0d - Updating model block %s with %s path", fname, lineno,this.get_name(), path.name ), UV...
1//uvm_reg.svh2functionvoid uvm_reg::set(uvm_reg_data_t value,3stringfname ="",4intlineno =0);5//Split the value into the individual fields6m_fname =fname;7m_lineno =lineno;89foreach (m_fields[i])10m_fields[i].set((value >> m_fields[i].get_lsb_pos()) &11((1<< m_fi...
uvm自建的针对reg的sequence,针对普通的reg有:reg_access_seq,reg_bit_bash_seq,reg_hw_reset_seq。 uvm_reg model,主要实现了 1) 增加了对dut的reg进行访问的方式,可以直接通过reg model进行访问。传统的只能是通过sequence,启动在bus的sequencer上来实现。 2) 方便了对dut reg进行测试的方法,通过build-in sequ...
在使用get_root_blocks获得reg_block的指针后,要使用$cast将其转化为目标reg_block形式(即我们已经定义好的reg_model)。以后就可以直接使用在使用处定义的local变量p_rm来进行寄存器操作了。 get_reg_by_offset函数可以通过寄存器的地址得到一个uvm_reg指针,再调用此uvm_reg的read/write函数就可以进行读写操作。如果...
用来检查硬件寄存器,以及配合scoreboadr来实时检查DUT功能。(refmodel被集成到scoreboard里,而在模拟的时候可以通过regmodel对设计的配置来模拟打包) 更方便对寄存器进行操作,前门访问和后门访问。在用前门访问验证了寄存器访问的物理通路工作正常的情况下,可以在后续测试中用后门访问节省时间。
一、reg_model的实现 uvm_reg_field 用来针对寄存器功能域来构建对应的比特位 uvm_reg 与寄存器相匹配,其内部可以例化和配置多个uvm_reg_field对象(uvm_object) uvm_mem 匹配硬件存储模型 uvm_reg_map 用来指定寄存器列表中各个寄存器的偏移地址、访问属性以及对应的总线 uvm_reg_block 可以容纳多个寄存器(uvm_reg)...
dmap.set_sequencer(m_env.apbm.m_seqr,reg_adp);regm.lock_model();endfunction 因为是最简单的...
寄存器模型中的adapter就是一个适配器,提供了reg2bus和bus2reg的接口,充当uvm_reg_map和uvm_sequencer中的转换器。uvm_reg_map操作uvm_reg_bus_op类型的item,而uvm_sequencer操作uvm_sequence_item类型的item。 adapter 继承uvm_reg_adapter,重写reg2bus和bus2reg这两个pure virtual function。
`uvm_object_utils(reg_model) function new(input string name="reg_model"); super.new(name, UVM_NO_COVERAGE); endfunction endclass 每一个由uvm_reg_block派生的类也要定义一个build函数。一般在此函数中实现所有寄存器的实例化。 系统已经有一个声明好的default_map,只需要在build中将其实例化,这个过程...
default_map是uvm_reg_block中的成员,是系统已经默认声明好的default_map,所以寄存器组类定义中不用再创建新的uvm_reg_map成员了,只需要在build中将其例化。 lock_model(): 一般在寄存器block定义完之后,要进行锁定,reg_model中就不能再添加新的寄存器了。