Synopsys VIP中向用户提供了内存模型,项目初期或block级验证cpu时时,用户可以使用memory模型代替真实内存用于存储软件代码,加快仿真速度和迭代。
CHI SN Agent中包含了svt_chi_mem类型的memory模型。
svt_chi_mem扩展自svt_mem类,该类用于模拟单个memory region,在使用时需要为其分配可以访问的地址范围,内部实现了许多task可以实现用于对memory的访问。
active_mode,可以通过SN response sequence更新memory;
passive_mode,可以通过成功完成的write transaction更新内存,在该模式下,如下要为read transaction更新内存,需要配置svt_chi_node_configuration::memory_updata_for_read_xact_enable = 1
上述两种更新内存的方式都是前门访问的方式,还可以使用后门访问的方法直接对memory进行访问
svt_chi_mem的后门访问方法:
read()
write()
save_mem() //用于将memory内存dump到文件中
load_mem() //将$readmemh格式的文件加载到memory模型中
clear() //清除memory的内容
在进行软件仿真时,可以将编译后的软件程序通过后门加载的方式加载到memory模型中。出于后门操作的需要seq需要获取到验证平台中的chi sn_agent并对其中的memory模型进行操作:
1.首先通过uvm_root的find()方法和chi sn_agent的例化名,获取到验证平台中sn_agent的句柄
uvm_pkg::uvm_root **root** = uvm_pkg::uvm_root::get();
uvm_pkg::uvm_component **comp_inst**;
svt_chi_sn_agent **sn_agent**;
svt_mem **memory**;
initial begin
#1ns;
comp_inst = root.find("uvm_test_top.top_env.sub_env.amba_env.chi_system[0].sn[0]");
assert($cast(sn_agent,comp_inst ));
memory = sn_agent.chi_sn_mem;
end
然后就可以直接调用memory模型中的方法进行后门加载操作
memory.read();
memory.write();
memory.clear();
为了操作方便,用户可以根据需求对上述读写操作进行封装
function void write_mem8(bit[`ADDR_WIDTH-1:0] addr,logic [7:0] data);
//add your code
void'(memory.write(mem_addr,mem_data,mem_strb));
endfunction::write_mem8
补充:uvm_root.find/find_all的介绍