AHB_RAM
AHB_RAM是一个存储容量为64KB的RAM(随机存储器),其中RAM内部含有4块BRAM模块,每块BRAM均能存储8bit的数据,存储空间为16KB,功能就是将AHB 总线上的读写操作转化成标准的RAM读写操作进行随机读写,按照不同的burst_size_bit类型将8bit\16bit\32bit的数据按照不同的地址存储到RAM的4个BRAM寄存器中,也可以从ram中读取数据。数据存储的时候根据地址的低两位addr[1:0]决定对哪一个BRAM操作,根据地址的高addr[15:2]来索引哪一个BRAM的byte位,例如:写入一个32bit的数据,四个BRAM的使能信号就会打开,每个BRAM有2^14个byte,读写同理。
AHB协议
AHB_RAM是一个以AHB协议通信的RAM存储模块,其中,通信协议AHB采用了简化版:
1、只有一个master和一个slave,hgrant = 1;
2、模块预置条件:每次传输均正确且传输完成,hready = 1,hresp = okay;(对代码覆盖率有影响)
3、单时钟沿变化;
4、支持burst传输,但只考虑single传输,即hburst = single,htrans = idle / Nonseq两种状态;
5、burst传输支持最大位宽为32bit。
AHB时钟和复位的产生:
时钟在tb产生:
复位在ahb_if产生
initial begin end 表示在仿真开始的时候执行;
AHB_RAM验证结构
tb中主要包括AHB_RAM模块的例化、模块与验证平台接口的连接,config_db机制将ahb_interface传递于env的agent里,将ahbram_interface传递到base_test层里面例化的config里。
在base_test中例化了enviroment, config,与寄存器模型,在顶层test中配置config,通过config_db机制将config类set到底层的env组件中,config类中的rgm句柄指向寄存器模型实例,这样底层的组件通过调用cfg.rgm就可以索引到寄存器模型,方便后期代码修改。
验证环境env中例化了ahb_mst_agent, virtual_sequencer, scorboard, coverage, adapter和predictor, ahb_mst_agent包括driver, sequencer, monitor,同時將monitor的uvm_analysis_port连接到scoreboard和coverage_model的uvm_analysis_imp中。
测试
(1)smoke_test:
做了冒烟测试,写入地址范围在1000~1FFF之间 32bit_burst_size数据 再读出;
(2)diff_haddr_test:
做了随机地址测试,写入的地址范围扩大了从0000~FFFF之间32bit_burst_size数据 再读出;
(3)diff_hsize_test:
做了字对齐测试,写入的数据宽度可以是8bit,16bit,32bit,每个数据都是字对齐,地址后两位都是00);
(4)haddr_word_unaligned_test:
做了字不对齐测试,写入的数据宽度可以是8bit,16bit,32bit,可以按字分别写入不同位;
(5)reset_w2r_test:
复位之后再进行读出测试,测试复位之后还能否读出有效数据(设计的bug,复位之后不能读出0,反而是原来写入的值;
其余test则继承于base_test,但在其run_phase中例化了不同的seq,且将其挂载至顶层virt_sqr,同时通过objection机制控制仿真的运行。
diff_haddr_test和diff_hsize_test分别针对要传输的transaction的addr和burst_size做随机约束后,通过uvm_do_with宏完成读写测试; haddr_word_unligned_test随机约束burst_size,并规定burst_size = 16bit和32bit时,addr[1] = 0和addr[1:0] = 0(即支持字不对齐传输),通过
uvm_do_with宏完成读写测试;
覆盖率收集
定义2个covergroup,分别关心传输地址addr和传输类型、传输位宽:
使用shell脚本控制的文档,固定种子seed随机种子跑完以上测试,可以得到合并后的代码覆盖率情况如下:
功能覆盖率如下:
分析覆盖率收集情况:
关心传输地址addr的功能覆盖组地址的边界未覆盖到,同时非法地址未覆盖到。
代码覆盖率中hwdata和hrdata等信号的个别bit的翻转未覆盖到。
添加新的测试用例
非法地址读写时,会按低位截取有效地址进行读写,即能正常读写,但写入地址不是预期地址。
此时加入新的定向测试后的代碼覆盖率情况如下:
加入新的定向测试后的功能覆盖率:
所有测试用例运行,
由于设计中AHBRAM不支持64bit位宽传输,同时只验证single传输,功能覆盖率对应部分可以先exclude;而hready、hreadyout恒为1,hresp=okay,且hselbram为1,代码覆盖率部分也可先exclude;可以得到最终的覆盖率情况: