郑晓亮 戴澜
【摘要】存储器内置自测试是嵌入式存储器测试的一种极为重要的方法,本文以ROM测试作为研究的对象。而CRC码(循环校验码)是一种在实际通信中应用很广泛的差错控制编码,具有很强的检错能力,可以很好的完成Rom内容的校验测试。本文把CRC串行运算方法作为依据,连续完成8bit串行运算作为一个单元,实现了8bitCRC并行运算,并通过逻辑推理和运算,给出了Verilog HDL语言的逻辑表达式。最后,基于CRC算法提出了一种Rom测试的设计方案。
【关键词】CRC;ROM;BIST;Verilog HDL
引言?
随着soc技术的不断发展,嵌入式存储器所占的面积也已经超过了60%以上。因为存储器的单元排列非常紧密,导致产生的故障类型多种多样,并且嵌入式存储器比逻辑模块具有更高的复杂度和更多的共用信号,所以产生故障的可能性就更高。这种趋势不但增加软硬件协同设计的难度,而且在芯片的成品率控制和故障检测方面也引发了新的技术难题。快速而高效地对存储器测试,是批量存储器测试的一个重要课题[1]。
内建自测试已被认为是用于嵌入式存储器测試的一种极为重要的方法。存储器内置自测试(BIST)是 SoC 设计中用来测试嵌入式存储器的标准技术,它以合理的面积开销来对单个嵌入式存储器进行彻底的测试[2][3]。内建自测试即芯片内部自行测试,是可测性的一种实现方式。
论文对ROM测试的方法进行研究,以CRC-CCITT校验算法作为基础,用CRC校验的方式完成ROM内容的校验,并设计RomBist电路。
1.CRC校验算法
循环校验码(CRC码),是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。CRC校验码的基本思想是利用线性编码理论,在发送方根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。下表列出了一些常见于标准的CRC多项式[4][5][6]。
表1 常见标准CRC
名称 生成多项式 简记式 应用举例
CRC-4 X4+X1+1 3 ITU G 704
CRC-12 X12+X11+X3+X+1
CRC-16 X16+X15+X+1 8005 IBM SDLC
CRC-CCITT X16+X12+X5+1 1021 ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS
CRC-32 X32+X26+X23+…+X2+X+1 04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP- FCS
CRC-32C X32+X28+X27+…+X8+X6+1 1EDC6F41 SCTP
2.8位并行CRC算法
CRC-CCITT算法的多项式为X^16+X^12+X^5+1,计算CRC实际上是将数据通过线性反馈移位寄存器,所有数据移入后CRC寄存器的值即为16位CRC。原理如下图所示,其中C15-C0为线性反馈移位寄存器R15-R0的初始值,数据按位移入CRC线性移位寄存器,CRC移位寄存器的依次右移一位,移出位C0与新移入的数据D0异或作为R15寄存器的新值,C11、C0与D0异或的值作为R10寄存器的新值,C4、C0与D0异或的值作为R3寄存器的新值,依次类推完成CRC运算(见图1)。
ROM存储器是按照byte操作,每次读取1byte数据(8bit数据),需要把上述串行移位运算转化为并行运算,相当于一次并行运算就得到了串行移位运算时需要8bit移位所得的结果。每个时钟完成8bit数据的CRC值计算,下一个8bit数据到来时,把上一个8bit数据的CRC值C15-C0作为初值,继续完成并行CRC计算,即每次处理1byte),如表1所示。
串并行运算推移图中,Ri为CRC移位寄存器(R0为低位),Ci为CRC移位寄存器的初值(C0为低位),Di为输入数据(D0为低位),Xi=Di^Ci,同一栏中数据的关系是异或。可得表2——8位并行计算的CRC16逻辑关系式。
表2 8位并行计算的CRC16逻辑关系式
R0=C8^X4^X0 R8=X0^X5^X1
R1=C9^X5^X1 R9=X1^X6^X2
R2=C10^X6^X2 R10=X2^X7^X3
R3=C11^X0^X7^X3 R11=X3
R4=C12^X1 R12=X4^X0
R5=C13^X2 R13=X5^X1
R6=C14^X3 R14=X6^X2
R7=C15^X4^X0 R15=X7^X3
3.Verilog HDL逻辑表达式
使用Verilog HDL硬件描述语言实现上述算法,设:
crc_low[7:0]为低8位移位寄存器R7~R0;
crc_high[7:0]为高8位移位寄存器R15~R8;
t_rom_d[7:0]为8位输入数据D7~D0。
crc_cal[7:0]为8位中间变量寄存器[7]。
由8位并行CRC16逻辑关系式可知,寄存器中的值为Xi和Ci的组合,首先,利用Xi<=Di^Ci的关系,得出X7~X0。
crc_cal[7:0]<=crc_low[7:0]^t_rom_d[7:0];
crc_cal[7:0] X7 X6 X5 X4 X3 X2 X1 X0
其次,根据R15~R12,R10~R7,R3~R0可知,Xi^X(i+4)成对出现。
crc_cal[7:4]<=crc_cal[7:4]^crc_cal[3:0]
crc_cal[7:0] X7^X3 X6^X2 X5^X1 X4^X0 X3 X2 X1 X0
可以推导出crc_low[7:0]和crc_high[7:0]的表达式,如下所示。
crc_low[7:4]<=crc_high[7:4]^crc_cal[4:1];
crc_low[3]<=crc_high[3]^crc_cal[0]^crc_cal[7];
crc_low[2:0]<=crc_high[2:0]^crc_cal[6:4];
crc_high[7:3] <= crc_cal[7:3];
crc_high[2:0]<=crc_cal[2:0]^crc_cal[7:5];
4.Rom Bist设计
只读存储器ROM(Read only Memory)。只读存储器是能对其存储的内容读出,而不能对其重新写入的存储器。这种存储器一旦存入了原始信息后,在程序执行过程中,只能将内部信息读出,而不能随意重新写入新的信息去改变原始信息。因此,通常用它存放固定不变的程序、常数以及汉字字库,甚至用于操作系统的固化。芯片电源掉电后,存储器数据不丢失。存储器中的数据在wafer制造时利用光刻工艺掩膜(mask)进行编程,一旦制造完成,其内容不能被改变。
图2 Rom Bist 结构图
芯片收到ROM测试命令后,接收外部输入16位数据Date[15:0]作为CRC校验的标准值。TE_RomBist信号被置为1,ROMbist开始工作,Done信号置为0,Fail信号置为1,产生ROM的地址、片选信号和读写使能信号,读取ROM内容进行CRC校验运算,CRC寄存器初始值为16hFFFF,ROM中所有数据校验运算完毕后,使用运算结果crc_low和crc_high,与标准值进行对比,把Done信号置为1,表示测试结束,对比成功,Fail置为0,通过ROM测试,对比不成功,Fail信号置为1,测试失败。
5.结论
论文通过对CRC校验算法的研究,完了串行CRC校验到并行CRC校验的转化,使用Verilog HDL硬件描述语言完成了算法的实现,得到了CRC校验算法的逻辑表达式,可以在一个时钟周期完成8bit CRC并行运算。并给出了一种RomBist电路的方案,实现了基于CRC校验算法的RomBist设计。
参考文献
[1]徐金荣.基于BIST的嵌入式存储器可测性设计研究[D].北京交通大学硕士学位论文,2008:12-25.
[2]姚俊.基于BIST的嵌入式存储器可测性设计算法研究[D].哈尔滨工程大学硕士学位论文,2007:13-21
[3]李文琦.高性能MemoryBIST设计实例[D].上海交通大学硕士学位论文,2007:3-5.
[4]朱榮华.一种CRC 并行计算原理及实现方法[J].电子学报,1999,27(4):143-145.
[5]李永忠.通用并行CRC 计算原理及其硬件实现方法[J].西北民族学院学报:自然科学版,2002,23(1):33-37.
[6]黄维超,刘桥,黄初华.基于Verilog的CRC并行实现[J].微计算机信息,2009,25(10):112-113.
[7]夏宁闻.Verilog数字系统设计教程(第二版)[M].北京:北京航空航大人学出版社,2008:26-49.