要实现register model与adapter和sequencer的关联我们通常在寄存器模型所在组件的build_phase执行下面这段代码 也就是说register model中的default_map里的set_sequencer方法实现了将三者的关联,传递的两个参数分别对应着实际的sequencer和adapter。 我们看看这个default_map的声明和类型定义 于是寄存器模型的default_map就把对...
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");...
第二个此块存储器的hdl 路径。 3)加入default_map,可以进行前门操作。 4)如果没有对存储器分配地址空间,可以不加入default_map。只能后门访问。 4.要进行读写通过read,write,peek,poke。这4个在调用的时候需要额外一个offset 参数,说明读取哪个地址: 5在一个16位系统中加入512x32 的存储器: 1)一个单元占据...
于是寄存器模型的default_map就把对应的sequencer和adapter存放在了default_map中的m_sequencer和m_adapter...
reg_block里有含有uvm_reg_map类的对象default_map,进行地址映射,以及用来完成寄存器前后门访问操作。 一个寄存器模型必须包含一个reg_block。 一个reg_block可以包含多个reg_map, 从而实现一个reg_block应用到不同总线,或不同地址段上。 uvm_mem是对dut中memory进行建模使用的。
调用create_map函数完成default_map的实例化,default_map = create_map(“default_map”, 0, 2, UVM_LITTLE_ENDIAN, 0); 第一个参数,表示名字; 第二个参数,表示该 reg block 的基地址; 第三个参数,表示寄存器所映射到的总线的宽度(单位是 byte,不是 bit ); ...
default_map.add_reg(invert, 'h9, "RW"); endfunction `uvm_object_utils(reg_model) function new(input string name="reg_model"); super.new(name, UVM_NO_COVERAGE); endfunction endclass 每一个由uvm_reg_block派生的类也要定义一个build函数。一般在此函数中实现所有寄存器的实例化。
并且将模块级寄存器的base_address分别作为submap添加到顶层寄存器模型的default_map中。
层次化的寄存器结构通过uvm_reg_block创建,通常用两层结构组织,第一层包含uvm_reg,第二层用于组织子块。在配置和初始化时,需在父reg_block中实例化并调用configure和build方法,同时将子reg_block的default_map添加到父block的default_map中,以确保地址完整。UVM的寄存器模型中,uvm_reg_file用于区分...
在创建了多个reg_map以后,你将可以在顶层环境与各自的adapter/bus_agent连接。不过,在稍后寄存器的write/read访问当中,你还应该匹配map的参数,否则它将按照default_map,使用默认的map和bus访问。