Case对于multi&parrallel rd/wr interface共享一片address allocation的DUT,从interface上可能没办法确认data是否已经真正写入到memeory了。这样容易造成在多套intf访问同一个address且有读有写的情况下,testbench很难知道谁先谁后,增加验证的难度
Solution
使用UVM自带mem management,从sequence上避免这一情况对testbench造成的干扰
Example
class a16b extends uvm_mem_mam_policy; ,
constrint c_user {start_offset[3:0]==0;}
endclass
class my_seq extends uvm_sequnce;
……
uvm_mem_mam_cfg cfg=new();
uvm_mem_mam mam;
uvm_mem_region my_region;
bit[31:0] wr_addra16b a16b_inst=new();
cfg.n_byte=1; <- Number of bytes in each memory locationcfg.
start_offset=32'h8000_0000;
cfg.end_offset=32'h9ffff_ffff; <--config mam allocation is inside [32'h8000_0000:32'h9fff_fff]
mam=new("mam",cfg);
my_region=mam.request_region(32,a16b_inst); <--get one region, 大小是32byte,start_offset是16byte align 该动作会随机出一片32byte的空间,并将该空间lock住,其它人 用同样方法get region时,不会overlap该片空间. (每次调用,会自动开辟一个内存空间,相当于进行了一次new,所以不用担心在循环中多个句柄指向同一对象)
wr_addr=my_region.get_start_offset(); <--get 该region的start_offset
……
my_region.release_region(); (or mam.release_region(my_region)) <--使用完成后release region,使这片空间可以再次被使用Attention
Attention:
对于本来有优先级或先后顺序要求的DUT,该方法虽然避免了很多麻烦,但一定要记得对优先级加check
PS:
uvm_mem_mam_policy extend出来可以定义一些自己的变量以达到更优化的控制,mam request_region时会随机policy里面的所有随机变量。