Synopsys验证VIP学习笔记(1)Memory模型用法-FPGA常见问题社区-FPGA CPLD-ChipDebug

Synopsys验证VIP学习笔记(1)Memory模型用法

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提供了一些后门访问方法:

  • read()
  • write()
  • set_meminit()
  • load_mem()
  • save_mem()
  • clear()

可以用read() 和write() 实现基本的后门访问,这两个函数的原型如下:

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)

 

另外,axi slave本身提供了write_byte() 和read_byte() 两个按字节地址实现后门读写的方法,原型如下:

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);

 

load_mem() 可以将$readmemh格式的文件加载至mem模型中。

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

请登录后发表评论

    没有回复内容