索手锋芒的个人空间 https://blog.eetop.cn/calvin [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

mem management

热度 1已有 1981 次阅读| 2015-4-17 23:51 |个人分类:UVM notebook

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里面的所有随机变量。


点赞

发表评论 评论 (1 个评论)

回复 y396181009 2021-3-24 15:11
学习了

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 4

    获赞
  • 4

    评论
  • 3176

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-11 03:12 , Processed in 0.026133 second(s), 17 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部