网站死链检测,中国企业网官方网站,微信小程序代码大全,做的一个网站多少钱文章目录 前言一、代码二、错误1.地址范围2. 并行执行线程中变量覆盖的情况3.有关incr的beat 前言
来源路科验证本节搞定 T3.3 AHB总线协议的覆盖#xff1a;AHB_PROTOCOL_COVER 即测试ahb slave接口和master接口支持#xff08;尽可能#xff09;全部的ahb协议传输场景AHB_PROTOCOL_COVER 即测试ahb slave接口和master接口支持尽可能全部的ahb协议传输场景主要是支持burst传输 并行发送重点在于如何给地址注意该test不是测试映射的完整性的所以不需要关心整个地址是不是更加完备即不是把所有的地址都测试完关心的是协议的完整性只需要保证从三个master到三个slave的访问地址之间没有重合如果重合会给接下来的数据检查的带来问题如果同一个地址被两个master的写所覆盖的话时序上面的延迟会对预测带来障碍可以加一些约束让波形是自己所期望的加的约束越少越好这样的话协议上各种时序出现的可能性更大前提是设计没问题要是设计有问题的话约束一开始不可以放的太开那么就要从singl-----burst------wrap一步一步来
一、代码
思路先搞定其中的一次并行发送多个master到多个slave稳点后外部套一个repeat让其多次发送具体代码
--------------------------AHB_PROTOCOL_COVER_seq------------------
virtual task body();super.body();uvm_info(body, Entered..., UVM_LOW)cfg.enable_scb 0;cfg.enable_cov 0;repeat(loop_count) beginfor(int i0; i cfg.mst_num; i) beginautomatic slv_addr_range_t rng cfg.addrmap.get_addr_range($random_range(0, cfg.slv_num-1));automatic int mid i;forkmem_check(mid, rng.addr_start h1000*(midcfg.mst_num*$random_range(1, 4)));join_noneendwait fork //等第一次传输完以后在repeat第二次enduvm_info(body, Exiting..., UVM_LOW)
endtaskautomatic int mid i; mid 是在循环体内部使用 automatic 关键字声明的变量。这种方式会为每次循环迭代创建一个独立的 mid 变量副本。所以每次循环迭代中 mid 的值都是动态的,不会相互干扰。loop_count别忘记在挂载sequence之前随机 seq中的代码
loop_count设置多少以功能覆盖率能不能达到为准 如何保证三个master给同一个slave写的话地址不重合 这里给的地址是rng.addr_start h1000*(midcfg.mst_num*$random_range(1, 4)可以看作是基地址偏移地址目前的burst_size32bit地址需要以4字节为单位进行递增只要给master一个不一样的地址后面加4都会不一样这样就保证了地址的不一样所以重点在于如何设置偏移地址 将一块地址按照h100032‘h0200_0000---32‘h0200_FFFF分的话共15个区间32‘h0200_0000---32‘h0200_1000是4KBburst传输要求的地址边界不超过1KB所以他会完美的去匹配无论落到哪一个区间master哪怕是incr他也不会越界这样就保证了地址的不重合 midcfg.mst_num*$random_range(1, 4)这块的取值要保证最大值不可以超过14E23*414 上面的4的值与mst_num变大和mid都有关
二、错误
1.地址范围
出现不应该有的地址范围 原因在随机产生数值时发生了错误如果随机到5最大是23*51714将一块地址按照h100032‘h0200_0000---32‘h0200_FFFF分的话最后一个值是E15共15个区间所以将随机值区间最大改为4
mem_check(mid, rng.addr_start h1000*(midcfg.mst_num*$random_range(1, 5)));2. 并行执行线程中变量覆盖的情况
这个错误意味着在并行执行多个序列时,存在某些序列提前完成的情况,导致其他序列的项目无法正常处理。 原因当缺少automatic int mid i;时i 产生的新的数会将原先的覆盖导致i只能是3原先的依次被覆盖掉了
--------------------------AHB_PROTOCOL_COVER_seq------------------
virtual task body();
super.body();
uvm_info(body, Entered..., UVM_LOW)
cfg.enable_scb 0;
cfg.enable_cov 0;for(int i0; i cfg.mst_num; i) beginslv_addr_range_t rng cfg.addrmap.get_addr_range($random_range(0, cfg.slv_num-1));//automatic int mid i;forkmem_check(mid, rng.addr_start h1000*(midcfg.mst_num*$random_range(1, 4)));join_none
end
uvm_info(body, Exiting..., UVM_LOW)
endtask解决之道添加automatic int mid i;最好将rng也添加automatic
3.有关incr的beat 这里的错误提示数据对比出了问题到底哪儿出了问题看的不是很清楚所以在做有关动态数组对比时先比较动态数组的size然后在比较里面的内容比较每一个数据详细显示的话会发现是两边的size不一样 定位会发现错误的前面是incr传输他的地址只要不跨越1KB边界即可到底传了多少拍不大清楚不像incr4之类的他的拍数是固定的在每一次传输的过程中 可以通过该参数记录在写数据时记录下来传递给读数据时的约束 如果给的类型是incr。没有给data.size的话会出问题incr不限定也就是说如果给的burst_type是incr的话要限定burst_type的长度