【转】VIP学习(1)SVT Memory模型用法

转载:Synopsys验证VIP学习笔记(1)Memory模型用法_PoPo's Blog-优快云博客

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);
1
基于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
1
2
3
4
5
6
7
svt_mem同样提供了一些后门访问方法:

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

function logic [1023:0] svt_mem::read (bit [63:0] addr, int set_lock = -1);
function bit write (bit [63:0] addr = 0, 
                    bit [1023:0] data = 0, 
                    bit [127:0] byteen = ~0, 
                    int set_lock = -1)
1
2
3
4
5
另外,axi slave本身提供了write_byte() 和read_byte() 两个按字节地址实现后门读写的方法,原型如下:

task write_byte(input bit[`SVT_AXI_MAX_ADDR_WIDTH-1:0] addr, bit[7:0] data);
task read_byte(input bit[`SVT_AXI_MAX_ADDR_WIDTH-1:0] addr, output bit[7:0] data);
1
2
load_men() 可以将$readmemh格式的文件加载至mem模型中。
set_meminit() 可以配置mem模型对未写过的地址返回一些特定值,以此实现mem的随机初始化,这个task的原型如下:

task 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)
1
2
3
其中,参数meminit包含以下枚举类型:

UNKNOWNS
ZEROES
ONES
ADDRESS
VALUE
INCR
DECR
USER_PATTERN
RANDOM
将参数meminit指定为VALUE类型时,参数meminit_value值可指定其初始值,如配置所有未写过的地址初始值为随机64bit数:

axi_env.axi_system_env.slave[0].axi_slave_mem.set_meminit(svt_mem::VALUE, {$urandom,$urandom}, 0);
1
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
————————————————
版权声明:本文为优快云博主「小破同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/yumimicky/article/details/120207683

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值