Synopsys的VIP(本文以AXI slave为例)提供了由svt_mem类表示的momory模型,在passive模式下其观测值与寄存器模型类似,会基于总线更新,在active模式下则由slave sequence更新。
在配置VIP时,首先要通过svt_axi_system_configuration::set_addr_range() 配置每个memory的地址范围,并且可以多次配置。这里在cust_svt_axi_system_configuration类中生成32bit地址的axi memory,第一个参数为slave编号,后两个参数为地址范围:
set_addr_range(0, 32'h0000_0000, 32'hffff_ffff);
基于transaction更新的active模式和基于总线更新的passive模式为前门访问,用法如下:
// svt_axi_slave_base_sequencet
if(req_resp.xact_type == svt_axi_slave_transaction::WRITE) begin
put_write_transaction_data_to_mem(req_resp);
end
else begin
get_read_data_from_mem_to_transaction(req_resp);
end
svt_mem提供了一些后门访问方法:
function logic [SVT_MEM_MAX_DATA_WIDTH-1:0]
svt_mem::read(bit [SVT_MEM_MAX_ADDR_WIDTH-1:0] addr, int set_lock = -1)
function bit
svt_mem::write(bit [(SVT_MEM_MAX_ADDR_WIDTH-1):0] addr = 0,
bit [(SVT_MEM_MAX_DATA_WIDTH-1):0] data = 0,
bit [(SVT_MEM_MAX_DATA_WIDTH/8-1):0] byteen = ~0,
int set_lock = -1)
task svt_axi_slave_agent::write_byte(input bit[`SVT_AXI_MAX_ADDR_WIDTH-1:0] addr, bit[7:0] data);
task svt_axi_slave_agent::read_byte(input bit[`SVT_AXI_MAX_ADDR_WIDTH-1:0] addr, output bit[7:0] data);
save_mem() 可用于dump memory至文件,data_wdth参数可用于指定数据位宽(需为2的幂且大于8,否则值为-1),enable_autosize_of_saveddata可实现高位补零,原型如下:
function bit
svt_mem::save_mem ( string filename,
int data_wdth = -1,
bit [SVT_MEM_MAX_ADDR_WIDTH-1:0] start_addr = 0,
bit [SVT_MEM_MAX_ADDR_WIDTH-1:0] end_addr = 1 << 64 - 1,
bit enable_autosize_of_saveddata = 0)
set_meminit() 可以配置mem模型对未写过的地址返回一些特定值,以此实现mem的随机初始化,原型如下:
task
svt_mem::set_meminit (svt_mem::meminit_enum meminit = UNKNOWNS,
bit [SVT_MEM_MAX_DATA_WIDTH-1:0] meminit_value = 0,
bit [SVT_MEM_MAX_ADDR_WIDTH-1:0] meminit_address_offset = 0)
其中,参数meminit包含以下枚举类型:
UNKNOWNS/ZEROES/ONES/ADDRESS/VALUE/INCR/DECR/USER_PATT/ERN/RANDOM
将参数meminit指定为VALUE类型时,参数meminit_value值可指定其初始值,如配置所有未写过的地址初始值为随机64bit数:
axi_env.axi_system_env.slave[0].axi_slave_mem.set_meminit(svt_mem::VALUE, {$urandom,$urandom}, 0);
INCR或DECR类型可以使初始值递增或递减,同时参数meminit_value值指定了最小地址的初始值。
ADDRESS类型可使未写过的地址读出其地址值,并可通过参数meminit_address_offset指定一个偏移量。
USER_PATTERN类型可使未写过的地址读出通过load_mem函数加载到内存的数据。
RANDOM类型可使未写过的地址每次读出随机值。
可以在scoreboard中声明svt_mem类句柄以实现对VIP的后门访问,注意传递句柄时需要在合适的phase中,因为UVM中build_phase是自上而下而其他phase是自下而上,至少要在VIP创建svt_mem后再传递,否则仿真可能会报”[NOA] Null object access”错误。
参考资料:VC Verification IP AMBA AXI UVM User Guide R-2020.09
没有回复内容