0,2,UVM_BIG_ENDIAN,0);invert=reg_invert::type_id::create("invert",,get_full_name());invert.configure(this,null,"");invert.build();default_map.add_reg(invert,'h9,"RW");endfunction`uvm_object_utils(reg_model)functionnew(inputstringname="reg_model");...
然后,从uvm_reg_block里派生一个寄存器组(block)类,在这个类里也有一个build函数,完成各个寄存器的实例化,default_map的实例化和地址的配置,这样一个简单的寄存器模型就建好了。 22 class reg_model extends uvm_reg_block; 23 rand reg_invert invert; 24 25 virtual function void build(); 26 default_map ...
调用create_map函数完成default_map的实例化,default_map = create_map(“default_map”, 0, 2, UVM_LITTLE_ENDIAN, 0); 第一个参数,表示名字; 第二个参数,表示该 reg block 的基地址; 第三个参数,表示寄存器所映射到的总线的宽度(单位是 byte,不是 bit ); 第四个参数,表示大小端...
在创建了多个reg_map以后,你将可以在顶层环境与各自的adapter/bus_agent连接。不过,在稍后寄存器的write/read访问当中,你还应该匹配map的参数,否则它将按照default_map,使用默认的map和bus访问。
在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...
4)local_model调用后,reg_model就不能再加入新的寄存器。 5)reset:如果不调用,默认都是0;调用后,都将变为复位值。 6)前门都是由uvm_reg_map完成,因此在connect_phase中,使用set_sequencer 将adapter 和bus_sequencer 告诉reg_model的 default_map。 7)将default_map 设置为自动预测状态。
2)一个uvm_reg_block 对应一个uvm_reg_map,default_map系统已经声明,只需在build中例化,调用create_map。 第一个参数是名字。 第二个参数是基地址。 第三个是系统总线宽度,单位是byte。 第四个是大小端。 第五个是是否按照byte寻址。 3)例化invert 并调用invert.configure。指定后门访问时的路径。
m_maps[uvm_reg_map],该reg挂载在的map的对象,在default_map,add_reg时,指定。 hdl_pool,以string为索引,uvm_queue为对象,string方便指定RTL,Gate等不同的hdl。 coverage收集信息,m_has_cover,m_cover_on。has_cover表示reg new的时候加入的coverage选项, ...
层次化的寄存器结构通过uvm_reg_block创建,通常用两层结构组织,第一层包含uvm_reg,第二层用于组织子块。在配置和初始化时,需在父reg_block中实例化并调用configure和build方法,同时将子reg_block的default_map添加到父block的default_map中,以确保地址完整。UVM的寄存器模型中,uvm_reg_file用于区分...
default_map = create_map("default_map", 'h0, 1, UVM_LITTLE_ENDIAN); foreach (B[i]) begin B[i] = reg_block_B::type_id::create($sformatf("B[%0d]", i)); B[i].configure(this); B[i].build(); default_map.add_submap(this.B[i].default_map, 'h100 + i*'h100); ...