1.1版本
版本 |
日期 |
描述 |
作者 |
V1.0 |
2021/8/14 |
从sramc_top层直接验证 |
Zhangshuhuai |
V2.0 |
2021/8/24 |
内部模块ahb_slave_if的验证 |
Zhangshuhuai |
1.2参考文档
名称 |
日期 |
作者 |
基于AHB总线的SRAM控制器设计的需求分析.doc |
未知 |
未知 |
基于AHB总线的SRAM控制器架构设计.doc |
未知 |
未知 |
基于AHB总线的SRAM控制微架构设计.doc |
未知 |
未知 |
基于AHB总线的SRAM控制器继承需求.doc |
未知 |
未知 |
2.1 设计架构
2.2 功能点
1.支持8bit、16bit、32bit的SRAM数据读写操作
2.支持SRAM的单周期读写
3.支持低功耗工作(8bit/16bit):在多块SRAM组成的存储器中,根据不同的地址,系统选择一块或者多块SRAM,未被选中的SRAM片处于low-power standby模式;
4.支持bist/dft功能
2.3 接口信号
信号名 |
方向 |
位宽 |
详细说明 |
SRAM控制器输入信号 |
|||
Hclk |
Input |
1 |
AHB总线时钟信号 |
Sram_clk |
Input |
1 |
Sram core时钟信号 |
Hresetn |
Input |
1 |
AHB总线复位信号 |
Hsel |
Input |
1 |
Sram控制器片选信号 |
Hwrite |
Input |
1 |
写使能 |
Hsize |
Input |
[2:0] |
2’b00:字节 2’b01:halfword 2’b10:word |
Hburst |
Input |
[2:0] |
未用到 |
Htrans |
Input |
[1:0] |
2’b10:单笔数据传输或第一笔连续传输中的第一笔数据传输 2’b11:支持burst传输 |
Hready |
Input |
1 |
Sram控制器工作使能 |
Haddr |
Input |
[31:0] |
AHB总线发送的地址 |
Hwdata |
Input |
[31:0] |
AHB总线的数据输入 |
Dft_test |
Input |
1 |
DFT测试使能 |
Bist_test |
Input |
1 |
BIST测试使能 |
SRAM控制器输出信号 |
|||
Hready_resp |
output |
1 |
AHB总线数据传输完成 |
Hresp |
output |
[1:0] |
Sram控制器给AHB总线的应答信号 00:传输状态正常 |
Hrdata |
output |
[31:0] |
AHB总线读slave数据 |
Bist_done |
output |
1 |
1’b1:bist测试结束表示 |
Bist_fail |
output |
[7:0] |
8位分别表示8块sram功能是否正确 |
3.1验证语言:System verilog
3.2验证方法:UVM
3.3验证工具:VCS、Questasim
3.4验证目标:
1.功能点符合设计规范
2.代码覆盖率达到100%
Line
FSM
Toggle
Path
Conditions
3.功能覆盖率达到100%
3.5验证策略
3.5.1灰盒验证:SRAMC设计微架构可见,RTL代码未知,验证sramc_top.v的RTL设计
3.5.2覆盖率驱动的随机化验证
3.6验证平台组件架构
在版本1.0中,从SRAMC-top灌入激励,无需关注SRAMC内部的if和sram core具体信号,架构中的test是testcase层,扩展于uvm_test_top基类,可以视为用户能够修改的最顶层。
Env相当于一个容器类,内部封装了agent、coverage、scoreboard等,并将其实例化port连接
Master agent中封装了sequencer,driver和monitor,三者的接口与AHB总线相连。
Sequencer负责将sequence中的sequence_item传递给driver,通过sequencr完成driver和sequence的握手机制。
Driver在接受到sequence_item后,将该trans转化为具体的信号层次并灌给SRAMC
Monitor负责监视由driver传递给SRAMC的pin级信号并转化为事务级信息传递给scoreboard和coverage进行比对和覆盖率收集
Scoreboard将monitor传递来的事务和从SRAMC的reference model中传递来的事务进行比较。
Coverage用于统计覆盖率。
3.7人员与时间安排
人员数量:1人
时间安排:14天
1.上电复位:关注上电复位后sramc的输出信号状态是否满足要求
2.时钟:Hclk和sram_clk的反相处理(如果是全局验证则无需关注内部信号)
在testbench中根据要求的时钟的周期、时钟相位、时钟的占空比产生相应的时钟信号。
3.上电复位后的sram memory的值:需要初始化
4.8bit、16bit、32bit的SRAM数据读写操作(主要的功能测试)
a)直接测试测试方案:
(1)数据bins:全0,全1,0x55和0xAA等特殊状态数据
(2)8bit/16bit/32bit读操作
(3)8bit/16bit/32bit写操作
(4)8bit/16bit/32bit连续读操作
(5)8bit/16bit/32bit连续写操作
(6)8bit/16bit/32bit先写后读操作
(7)8bit/16bit/32bit先读后写操作
b)ahb的总线位宽为32bit,通过控制hsize信号实现数据有效位宽的位数声明,并通过haddr的低两位实现具体位置指定,从而实现读、写32bit、16bit、8bit的数据。
c)实现SINGLE传输和BURST传输,通过控制信号hburst
d)考虑hready为低的情况,sramc的读写是怎样的,是否会丢失数据?
5.低功耗验证:如何验证8bit、16bit传输时低功耗实现?
通过检查SRAM的片选信号,打印在log中,或者通过波形文件观察
6.DFT和BIST功能的实现
7.验证报告
a)统计分析覆盖率
RTL代码覆盖率
功能覆盖率
b)测试案例通过率
总共编写了多少个testcase,是否都通过了,多少了失败了
c)bug发现率
设计人员debug
5.1直接测试案例如下
Index |
Test name |
Description |
implemented |
1 |
Reg_default_value_check_test |
检查上电复位后所有寄存器的状态值(如果没有则不检验) |
1.Reset_n = 0; 2.检查内部值状态 Bank0_csn[3:0]=1111; Bank1_csn[3:0]=1111; |
2 |
Bank0_reg_read_write_byte_test1 |
检查bank0中第1小片sram的8bit读写寄存器状态 |
1.hsize[1:0]=2’b00; haddr[1:0]=00; haddr[15]=0; hwrite = 1; dft_test=0;bist_test=0; 2.写入0xaa,0x55,0xff,0x00等典型数据 3.读数据并检查 Bank0_csn=1110 Bank1_csn=1111 |
3. |
Bank0_reg_read_write_byte_test2 |
检查bank0中第2小片sram的8bit数据读写寄存器状态 |
1.hsize[1:0]=2’b00; haddr[1:0]=01; haddr[15]=0; hwrite = 1; dft_test=0;bist_test=0; 2.写入0xaa,0x55,0xff,0x00等典型数据 3.读数据并检查 Bank0_csn=1101 Bank1_csn=1111 |
4. |
Bank0_reg_read_write_byte_test3 |
检查bank0中第3小片sram的8bit数据读写寄存器状态 |
1.hsize[1:0]=2’b00; haddr[1:0]=10; haddr[15]=0; hwrite = 1; dft_test=0;bist_test=0; 2.写入0xaa,0x55,0xff,0x00等典型数据 3.读数据并检查 Bank0_csn=1011 Bank1_csn=1111 |
5. |
Bank0_reg_read_write_byte_test4 |
检查bank0中第4小片sram的8bit数据读写寄存器状态 |
1.hsize[1:0]=2’b00; haddr[1:0]=11; haddr[15]=0; hwrite = 1; dft_test=0;bist_test=0; 2.写入0xaa,0x55,0xff,0x00等典型数据 3.读数据并检查 Bank0_csn=0111 Bank1_csn=1111 |
6. |
Bank0_reg_read_write_halfword_test1 |
检查bank0中第1.2小片sram的16bit数据读写寄存器状态 |
1.hsize[1:0]=2’b01; haddr[1]=0; haddr[15]=0; hwrite = 1; dft_test=0;bist_test=0; 2.写入0xaa,0x55,0xff,0x00等典型数据 3.读数据并检查 Bank0_csn=1100 Bank1_csn=1111 |
7. |
Bank0_reg_read_write_halfword_test2 |
检查bank0中第3.4小片sram的16bit数据读写寄存器状态 |
1.hsize[1:0]=2’b01; haddr[1]=1; haddr[15]=0; hwrite = 1; dft_test=0;bist_test=0; 2.写入0xaa,0x55,0xff,0x00等典型数据 3.读数据并检查 Bank0_csn=0011 Bank1_csn=1111 |
8. |
Bank0_reg_read_write_word_test |
检查bank0中所有4片sram的32bit数据读写寄存器状态 |
1.hsize[1:0]=2’b10; haddr[1:0]=xx; haddr[15]=0; hwrite = 1; dft_test=0;bist_test=0; 2.写入0xaa,0x55,0xff,0x00等典型数据 3.读数据并检查 Bank0_csn=0000 Bank1_csn=1111 |
9 |
Bank1_reg_read_write_byte_test1 |
检查ban1中第1小片sram的8bit读写寄存器状态 |
1.hsize[1:0]=2’b00; haddr[1:0]=00; haddr[15]=1; hwrite = 1; dft_test=0;bist_test=0; 2.写入0xaa,0x55,0xff,0x00等典型数据 3.读数据并检查 Bank0_csn=1111 Bank1_csn=1110 |
10 |
Bank1_reg_read_write_byte_test2 |
检查bank1中第2小片sram的8bit读写寄存器状态 |
1.hsize[1:0]=2’b00; haddr[1:0]=01; haddr[15]=1; hwrite = 1; dft_test=0;bist_test=0; 2.写入0xaa,0x55,0xff,0x00等典型数据 3.读数据并检查 Bank0_csn=1111 Bank1_csn=1101 |
11 |
Bank1_reg_read_write_byte_test3 |
检查bank1中第3小片sram的8bit读写寄存器状态 |
1.hsize[1:0]=2’b00; haddr[1:0]=10; haddr[15]=1; hwrite = 1; dft_test=0;bist_test=0; 2.写入0xaa,0x55,0xff,0x00等典型数据 3.读数据并检查 Bank0_csn=1110 Bank1_csn=1111 |
12 |
Bank1_reg_read_write_byte_test4 |
检查bank1中第4小片sram的8bit读写寄存器状态 |
1.hsize[1:0]=2’b00; haddr[1:0]=11; haddr[15]=1; hwrite = 1; dft_test=0;bist_test=0; 2.写入0xaa,0x55,0xff,0x00等典型数据 3.读数据并检查 Bank0_csn=1111 Bank1_csn=0111 |
13 |
Bank1_reg_read_write_halfword_test1 |
检查bank1中第1.2小片sram的16bit数据读写寄存器状态 |
1.hsize[1:0]=2’b01; haddr[1]=0; haddr[15]=1; hwrite = 1; dft_test=0;bist_test=0; 2.写入0xaa,0x55,0xff,0x00等典型数据 3.读数据并检查 Bank0_csn=1111 Bank1_csn=1100 |
14 |
Bank1_reg_read_write_halfword_test2 |
检查bank1中第3.4小片sram的16bit数据读写寄存器状态 |
1.hsize[1:0]=2’b01; haddr[1]=1; haddr[15]=0; hwrite = 1; dft_test=0;bist_test=0; 2.写入0xaa,0x55,0xff,0x00等典型数据 3.读数据并检查 Bank0_csn=1111 Bank1_csn=1100 |
15 |
Bank1_reg_read_write_word_test1 |
检查bank0中所有4片sram的32bit数据读写寄存器状态 |
1.hsize[1:0]=2’b10; haddr[1:0]=xx; haddr[15]=1; hwrite = 1; dft_test=0;bist_test=0; 2.写入0xaa,0x55,0xff,0x00等典型数据 3.读数据并检查 Bank0_csn=1111 Bank1_csn=0000 |
16 |
Bist_test |
检查bist功能 |
Bist_fail=0xFF |
17 |
Dft_test |
检查dft功能 |
|
5.2 随机测试案例
Index |
Test name |
Description |
Implement |
1 |
Sramc_random_test |
随机读写 |
Hsize[1:0] inside{2’b00,2’b01;2’b10} Haddr inside{‘h0;[‘h1:’h3FFE];’h3FFF;’h4000; [‘h4001:’hFFFE];’hFFFF} Hwdata inside{‘h0;[‘h1:’hFFFE];’hFFFF} Random hwrite/hwdata/htrans Dft_test=0;bist_test=0 Read register and check 检查bank0_csn[3:0] 检查bank1_csn[3:0] bist_done bist_fall |
2 |
先写在读 |
||
3 |
先读再写 |
||
4 |
连读读 |
||
5 |
连续写 |
6.1功能覆盖率
1)Hwrite:0/1
2)Hsize[1:0]:2’b00/2’b01/2’b10
3)Htrans:2’b10/2’b11
4)haddr:
32’h0000_0000/[32’h0000_0001:32’h0000_3FFE]/32’h0000_3FFF
32’h0000_4000/[32’h0000_4001:32’h0000_4FFE]/32’h0000_4FFF
5)hwdata:
32’h0000_0000/[32’h0000_0001:32’HFFFF_FFFE]/32’HFFFF_FFFF
6)bist_test:0/1
7)bist_done:0/1
8)bist_fail:0/[1:8’hFE]/8’hFF
9)dft_test:0/1