目录
一、IC验证流程
二、design specification
在此次UVM项目中,笔者将使用UVM的平台架构和编码风格实现AHB—SRAMC的验证工作。
将IC验证的整个流程划分为如下阶段,并按照流程完成整个项目:
1.阅读design specification,目的:
(1)学习设计的架构:包括整个soc架构,待验的IP架构
(2)掌握设计功能:对功能的理解和把握至关重要,这影响了我们整个验证的正确性
(3)数据流向:掌握接口的数据流向,了解该使用什么样的协议
(4)如何使用该DUT:DUT该如何配置,影响了我们灌入激励和收集响应的操作
2.编写verification plan:
提取验证的功能点,明确DUT的接口信号(包括所有信号的名称、位宽、功能、时序),TB的结构,检查点,功能覆盖率,测试用例规划(testcase),验证工作结束的标准。
3.搭建验证平台:
依据计划搭建验证平台,debug,并做到通过第一个testcase
4.编写testcase:
依据验证计划编写testcase。这是我们主要的验证阶段。检查RTL的每个功能点。TB/RTL debug。
5.起regresstion
周期往复性地起regression,为随机测试案例提供不同的seed。
6.分析代码、功能覆盖率:
分析覆盖率、新增测试用例
7.写测试报告:
覆盖率报告,测试用例的结果(pass/fail),覆盖率的结果
这个阶段,我们要熟悉整个SOC的架构,以及待验IP的架构:
(1)SOC的整体架构如下
由总线将各个IP联系起来,片上总线是通过仲裁和译码的方式来完成不同主、从部件的互连及总线复用,比较常见的有ARM的AMBA总线、IBM的CoreConnect总线以及Silicore公司的Wishbone总线等等。
以AMBA 2.0总线为例,AMBA 2.0提供了三种不同类型的总线:AHB、ASB和APB。其中AHB支持多主机从机,采用流水线的工作方式,其上挂载着高性能、高数据吞吐的IP,包括处理器IP:CPU,负责内存与外设之间数据转移的IP:DMA控制器,存储器IP:CPU内的Cache,片内的Pflash和SRAM等,也包括扩展的存储器接口ExtSRAM,算法IP:RSA加密解密算法,以及各种高速的I/O口:SD I/O口,USB串行总线等等。APB则为系统的低速外部设备提供低功耗的简单互连,APB里面唯一的主机就是bridge,APB采用非流水线的工作方式,要两个时钟周期实现一笔读写操作。APB上挂载着System controller(含上电复位控制、中断控制、时钟振荡器、时钟锁相等),WDT(计时器看门狗)、Timer(计时器),以及各种低速外设接口例如UART异步通信串行总线,SPI同步串行总线,以及IIC;
每个IP对应着不同的地址空间,对每个IP进行寻址时,不可超出地址空间的边界。
(2)AHB_SRAMC的设计需求
1)要支持低功耗,由多块SRAM构成的存储器中,根据地址选择一块或者多块SRAM,未被选中的SRAM块处在low power standby状态
2)支持单周期读写
3)根据AHB总线的读写宽度进行相应的SRAM位宽选择,支持8bit,16bit和32bit的SRAM数据读写操作
4)能够支持DFT/BIST测试
(3)AHB_SRAMC的架构设计
整个SRAM的微结构可以统分为两个部分:接口和核心的存储单元,对应的RTL代码名称分别为ahb_slave_if.v和sram_core.v。我们在做白盒验证时,需要验证IP的内部的每个设计部分,也就是说,这两个RTL代码都需要验证。此外,RTL代码sramc_top.v是两个代码的顶层,在top层对两个模块直接进行了调用。当我们做黑盒验证时,只需要验证sramc_top.v,模拟ahb总线的行为,从顶层将信号灌入,并检测相应的输出信号即可。
其中AHB slave interface模块微结构设计如下:ahb_slave模块负责将AHB时序转化为SRAMC的时序,其架构如下:
我们可以 注意到,输入信号主要还是AHB的输入控制信号,值得说明的是sram的读写使能控制信号是由hwrite信号控制的,在ahb总线上,hwrite为高时表示读,需要将sram_o_en拉低(低有效)。而片选信号bank0_csn和bank1_csn则是通过地址的最高位判断,为0时选中bank0,为1时选中bank1,而每个bank内部的小sram通过addr的低两位进行片选,并生成了独热码,共3个有效位宽。
信号名 |
方向 |
位宽 |
详细说明 |
Ahb_slave_if模块输入信号 |
|||
hclk |
Input |
1 |
AHB总线时钟信号 |
hresetn |
Input |
1 |
AHB总线复位信号 |
hsel |
Input |
1 |
Sram控制器片选信号 |
hwrite |
Input |
1 |
Sram控制器写信号 |
hready |
Input |
1 |
Sram控制器准备好信号 |
hsize |
Input |
[2:0] |
传输数据大小信号 |
hburst |
Input |
[2:0] |
未用到 |
htrans |
Input |
[1:0] |
传输数据的类型 |
haddr |
Input |
[15:0] |
AHB总线的地址输入(共64K空间,从0x0040_0000到0x0040_FFFF) |
hwdata |
Input |
[31:0] |
AHB总线的数据输入 |
sram_q0~sram_q7 |
Input |
[7:0] |
Sram的数据读写使能(独热码) |
Ahb_slave_if 模块输出信号 |
|||
Hready_resp |
output |
1 |
Sram控制器接受完成的反馈信号 |
Hresp |
output |
[2:0] |
Sram控制器接受状态的反馈信号 |
Hrdata |
output |
[31:0] |
AHB总线读sram的数据 |
Sram_w_en |
output |
1 |
Sram的读写使能信号 |
Sram_o_en |
output |
1 |
Sram的数据读有效使能信号 |
Bank0_csn |
output |
[3:0] |
Bank0块中的sram块选择信号 |
Bank1_csn |
output |
[3:0] |
Bank1块中的sram选择信号 |
Sram_addr_out |
output |
[12:0] |
发往sram的控制器的地址信号 |
Sram_wdata |
output |
[31:0] |
写sram的数据信号 |
SRAM存储体的架构和信号列表如下,每个小的SRAM的片选信号由Sram_csn[3:0]和haddr_reg[15]的值决定。
信号名 |
方向 |
位宽 |
详细说明 |
Sram_core模块输入信号 |
|||
Hclk |
Input |
1 |
系统时钟 |
Sram_clk |
input |
1 |
Sram控制器的时钟信号 |
Sram_rst_n |
Input |
1 |
Sram控制器的复位信号 |
Sram_addr |
Input |
[12:0] |
Sram的地址输入 |
Sram_data_in |
Input |
[31:0] |
Sram的数据输入 |
Sram_w_en |
Input |
1 |
Sram的数据读写使能 |
Sram_oen |
Input |
1 |
Sram的数据读有效使能 |
Bank0_csn |
Input |
[3:0] |
Sram的bank0块选择信号 |
Bank1_csn |
Input |
[3:0] |
Sram的bank1块选择信号 |
Bist_test |
Input |
1 |
Sram的bist测试模式使能信号 |
Dft_test |
Input |
1 |
Sram的DFT测试模式使能信号 |
Sram_core模块输出信号 |
|||
sram_q0~sram_q7 |
output |
[7:0] |
Sram的数据输出 |
Bist_done |
output |
1 |
Bist测试模式下的测试结束标志 |
Bist_fail |
output |
[7:0] |
Bsit测试模式下的结果输出 |
Sram控制器的顶层信号描述:
顶层模块的接口可以简化为如下,忽略了sram内部信号的状态。
信号名 |
方向 |
位宽 |
详细说明 |
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功能是否正确 |
SRAM控制器ahb slave接口与AMBA总线相连,其中总线上的hburst信号未用到。另外顶层还有好几根独立于AHB接口的输入/输出信号如下:
信号名 |
方向 |
位宽 |
详细说明 |
Sram_clk |
Input |
1 |
为sram_core提供工作时钟 |
Bist_en |
Input |
1 |
Bist测试使能 |
Dft_en |
Input |
1 |
Dft测试使能 |
Bist_done |
output |
1 |
高电平时表示bist测试结束 |
Bist_fail |
ouput |
[7:0] |
8位分别表示8块sram的功能正确与否 |
其中sram_clk的时钟和hclk的时钟周期相同,但相位相差180°。目的是为了实现sramc的单周期读写。