我们在创建uvm_reg_map的时候(如果只有一个uvm_reg_map我们一般会用uvm_reg_block自带的default_map)默认会将m_auto_predict设为0。 由于m_auto_predict是被local修饰的本地变量,因而不能在uvm_reg_map类外部访问,可以使用get_predict_map获取当前predict类型 m_auto_predict = 1 首先我们看下当我们执行寄存器...
uvm_reg中的主要变量有,m_locked,由顶层的reg_block调用 m_parent,指向的uvm_reg_block; m_is_busy,当该reg正在执行frontdoor的读写操作时,该信号置 1,避免此时做predict。 m_backdoor,外部设置进去的backdoor的方法。 m_maps[uvm_reg_map],该reg挂载在的map的对象,在default_map,add_reg时,指定。 hdl_...
在connect_phase中,adapter将uvm_reg_map和sequencer连接,实际就是调用set_sequencer给uvm_reg_map中的成员变量m_sequencerm_adapter赋值: functionvoidbase_test::connect_phase(uvm_phase phase); super.connect_phase(phase); ... rm.default_map.set_sequencer(env.bus_agt.sqr, reg_sqr_adapter); rm.defaul...
于是寄存器模型的default_map就把对应的sequencer和adapter存放在了default_map中的m_sequencer和m_adapter中。 下面在看看uvm_reg_adapter中reg2bus和bus2reg原型的定义 我们实际写的adapter中都会对这两个函数做override,所以里面执行的具体内容其实并不重要,只是给我们自己写的函数提供了个参考的思路,真正对我们有意义...
dmap = regm.get_default_map();dmap.set_sequencer(m_env.apbm.m_seqr,reg_adp);regm.lock_...
(1) 一个uvm_reg_block一定要对应一个uvm_reg_map; 系统已经有一个声明好的default_map,只需在uvm_reg_block的build中将其实例化; (2) uvm_reg_map的实例化,并不是直接调用其new函数,而是通过调用uvm_reg_block的create_map函数来实现; 1default_map=create_map("default_map",0,2,UVM_BIG_ENDIAN,0...
uvm_reg_block的定义 default_map与create_map(): default_map是uvm_reg_block中的成员,是系统已经默认声明好的default_map,所以寄存器组类定义中不用再创建新的uvm_reg_map成员了,只需要在build中将其例化。 lock_model(): 一般在寄存器block定义完之后,要进行锁定,reg_model中就不能再添加新的寄存器了。
uvm_reg_block里包含uvm_reg,一般一个最底层模块级的DUT的所有寄存器,具有相同的基地址,会放在一个reg_block中。uvm_reg_block内也可包含其他低层次的reg_block。 reg_block里有含有uvm_reg_map类的对象default_map,进行地址映射,以及用来完成寄存器前后门访问操作。
第一个所在reg_block 的指针。 第二个此块存储器的hdl 路径。 3)加入default_map,可以进行前门操作。 4)如果没有对存储器分配地址空间,可以不加入default_map。只能后门访问。 4.要进行读写通过read,write,peek,poke。这4个在调用的时候需要额外一个offset 参数,说明读取哪个地址: ...
层次化的寄存器结构通过uvm_reg_block创建,通常用两层结构组织,第一层包含uvm_reg,第二层用于组织子块。在配置和初始化时,需在父reg_block中实例化并调用configure和build方法,同时将子reg_block的default_map添加到父block的default_map中,以确保地址完整。UVM的寄存器模型中,uvm_reg_file用于区分...