(1.2) uvm_reg_map的do_write任务会查看系统是否设置了adapter,如果没有设置,就直接启动sequence, 让sequencer发送uvm_reg_item类型的transaction;如果设置了,那就调用do_bus_write任务. (1.3) uvm_reg_map的do_write完成后,如果auto predict功能打开了, uvm_reg的do_write会根据写入的值更新register model中寄存器...
· bit byte_address=1,按byte访问,默认为1 由于我们在本reg_block中只定义了一个map,因此可以直接用get_default_map获取该map,然后对该map设置sequencer和reg_adapter,sequencer其实就是在环境中用于配置寄存器的driver对应的那个sequencer,uvm_reg本质就是通过reg中的write,read等API,将读写请求,数据等通过API启动...
1local semaphore m_atomic;2local process m_process;34functionvoid uvm_reg::reset(stringkind ="HARD");5foreach (m_fields[i])6m_fields[i].reset(kind);7//Put back a key in the semaphore if it is checked out8//in case a thread was killed during an operation9void'(m_atomic.try_get...
uvm_reg和dut中每个register对应,其宽度一般和总线位宽一致,里面可以包含多个uvm_reg_field。 uvm_reg_block里包含uvm_reg,一般一个最底层模块级的DUT的所有寄存器,具有相同的基地址,会放在一个reg_block中。uvm_reg_block内也可包含其他低层次的reg_block。 reg_block里有含有uvm_reg_map类的对象default_map,进...
在lock或者add_submap的时候,更新map_info中的addr,调用Function Xinit_address_mapX 定义自己的do_bus_write和do_bus_read, uvm_reg_block,包含类,包含底层的uvm_reg_block,uvm_reg, default_path,定义自己的hdl_path, lock,表明当前的model是lock住的,调用function lock_model() ...
现在,我们通过指定register layer具有的访问类型以及寄存器层和agent之间的映射来扩展interface template file。这是通过标识register layer用于读取和写入 DUT 中的寄存器的command, address和data: reg_access_mode = WR reg_access_block_type = bus_reg_block ...
现在,我们通过指定register layer具有的访问类型以及寄存器层和agent之间的映射来扩展interface template file。这是通过标识register layer用于读取和写入 DUT 中的寄存器的command, address和data: reg_access_mode = WR reg_access_block_type = bus_reg_block ...
· bit byte_address=1,按byte访问,默认为1 由于我们在本reg_block中只定义了一个map,因此可以...
其中mem的size在address map中定义,可以通过get_size()的返回值得到: // m_addr_map_h class sj_test_mem_cfg_tbl_t extends uvm_mem; virtual function void build(); endfunction `uvm_register_cb(sj_test_mem_cfg_tbl_t, uvm_reg_cbs)
关于map使用我们可以理解为我们需要比对uvm_monitor发送过来的transaction中address与实际寄存器模型uvm_reg_...