Mbist 方法是目前大容量存储器测试的主流技术,该技术利用芯片内部专门设计的BIST 电路进行自动化测试,能够对嵌入式存储器这种具有复杂电路结构的嵌入式模块进行全面的测试。MBIST 电路将产生测试向量的电路模块以及检测测试结果的比较模块都置于芯片的内部,在测试完成后,将测试的结果通过芯片的测试引脚送出到芯片的外部。
MBIST 的核心思想是在芯片内部,存储器外部建立测试电路结构,实现对存储器的读写控制:写入测试向量,读出响应数据。MBIST 电路的基本结构一般包括测试向量产生电路、BIST 控制电路、响应分析电路三部分。
Tessent mbist flow流程图如下。
Mbist脚本模板如下。
#Design Loading
set_context dft -rtl
read_cell_library ../library/adk.tcelllib
set_design_sources -format verilog -y {../library/mem ../design/rtl} \
-extension v
set_design_sources -format tcd_memory -y ../library/mem -extension lib
read_verilog ../design/rtl/blockA.v
set_current_design blockA
#Specify and Verify DFT Requirements
set_design_level physical_block
set_dft_specification_requirements -memory_test on
add_clocks CLK -period 12ns -label clka
check_design_rules
#Create DFT Specification
set spec [create_dft_specification]
report_config_data $spec
#Process DFT Specification
process_dft_specification
#Extract ICL
extract_icl
#Create Patterns Specification
create_patterns_specification
#Process Patterns Specification
process_patterns_specification
#Run and Check Test Bench Simulations
run_testbench_simulations
check_testbench_simulations
#Test Logic Synthesis
run_synthesis
其中Design Loading这一步主要是读入设计和库文件。set_context命令可以设置mbist环境的上下文,包括两个部分,一是设置mbist硬件插入的环境;二是告诉dft工具读入的设计是RTL级的还是门级的,“-rtl”表示读入的设计是RTL级的,“-no_rtl”表示读入的设计是门级的。使用read_cell_library可以读取设计者被实例化的单元的库文件。Mbist library在Tessent工具中被叫做Tessent core descriptions(TCDs),该文件后缀一般为.memlib。
最近接触发现,mbist所采用的算法是在库文件中定义的。常用的确定性测试算法有MSCAN(Memory Scan)算法,跳步 (GALPAT) 和走步 (Walking 1/0)算法,Checkerboard 算法和March 类算法。March算法是一系列的算法,由于这类算法具有较高的故障覆盖率同时测试时间较短,使得其在存储器测试领域得到了广泛研究和应用。这类算法已经广泛应用于运用于对大容量SRAM 和DRAM 的测试,随着研究的深入,各种改进算法也相继出现。目前的March 算法主要有MATS,MATS+,March X、March C、March C-、March C+、March LR 等类型。
Extract ICL这个步骤作用是抽取ICL模型。随着SoC芯片逐渐复杂化,其DFT(Design for Test)架构也由单层向多层网络发展。IEEE 1687是DFT多层网络结构的通用标准,其核心内容包括Heirachical Architecture,模块连接语言ICL(Instrument Connectivity Language)和过程描述语言PDL(Procedural Description Language)。ICL是描述模块间连接的语言,它不包括设备内部具体操作的细节。因此可以概括地说,ICL是由Instruments 及其Connection描述组成的。ICL中的Instrument包含TAP、SIB、TDR及DFT IPs(EDT,OCC,MBIST…),它们是构成1687网络的关键节点,每一个Instrument都在Module中定义。ICL中的Connection是对Instrument的Keywords 、Attribute、Scan_Cell、Interface以及PortsToPorts连接等的描述。
Run and Check Test Bench Simulations就是生成仿真test bench文件并调用仿真工具进行仿真。Tessent内嵌支持的仿真工具是ModelSim、Verilog-XL、NC-Verilog 、VCS和incisive。
在仿真过程中遇到三个问题。
第一个问题始使用一个某仿真工具遇到编译问题,后来换了两个仿真工具,没有编译问题了。如下命令中-simulator的value可换为ModelSim、Verilog-XL、NC-Verilog 和incisive,似乎暂不支持xcelium工具。
run_testbench_simulations -simulator VCS。
第二个问题是mbist仿真遇到问题需要生成波形进行debug,可开启-store_simulation_waveforms option,Tessent生成的仿真环境则会生成波形。
run_testbench_simulations -store_simulation_waveforms on
第三个问题是上述方法生成波形较慢,所以自己搭建了一个xcelium仿真环境,生成波形速度较快。
观察波形发现MBISTPG_GO信号一开始就是X态。
结合mbist数据对比的原理进行分析。第一步,TMB中包含了FSM,由MBIST_EN控制开启,BIST_SETUP进行配置。FSM控制SIGNAL GEN信号,一个是送入到mem interface中的mux中非func的一端口,另一个是数据送入到COMP和经过RAM的数据进行对比;同时,SIGNAL_GEN会反馈信号控制FSM进行下一步操作。第二步,test数据送入到interface中,然后经过SRAM输出之后,送回到TMB中的COMP中进行和原始数据比较,如果数据比对正确,则MBIST_GO拉高,否则如果数据对比错误,则MBIST_GO变低。同时在比对初期,COMP会送出CMP_STAT信号。第三步,这个FMS控制相应的MEM比对完成,则输出MBIST_DONE信号。最后,TMB中的MBIST_GO和MBIST_DONE信号,是可以在仿真过程中进行观测的。从而用于 debug。
可以根据MBIST_GO和MBIST_DOWN的状态判断测试结果。DONE =1 & GO =1:test finished and pass;DONE =0 & GO =1 :test not complete but no errors until now, can be caused by using a slower clock than specified;DONE =1& GO =0:test finished but at least one mem test failed;DONE =0 & GO =0 :test not complete and at least one mem test failed。
该fail的仿真属于DONE =1& GO =0的情况,推测大概原因是数据没有读入到sram内部;检查发现sram的数据输出端(dout)和数据输入端(din)都是“X”态,验证了sram数据没有成功读入和写出的设想。
普通的Single-Port ram(sp ram)的常见端口如下。地线(GND):接地引脚,连接到电路的地点。供电线(Vcc):供电引脚,用于提供正常工作电压。输入/输出引脚(I/O):用于数据读取和写入操作的引脚。地址引脚(Address):用于指定要读取或写入的存储单元地址的引脚。使能引脚(CE):使能引脚,控制存储器的读取和写入操作。写使能引脚(WE):写使能引脚,控制存储器的写入操作。输出使能引脚(OE):输出使能引脚,控制存储器的输出操作。数据引脚(Data):用于传输数据的引脚。
检查发现,上述波形中多了一个reset端口,是Dual-Port RAM(双端口RAM)。双端口RAM 是在一个SRAM 存储器上具有两套完全独立的数据线、地址线和读写控制线,并允许两个独立的系统同时对该存储器进行随机性的访问。即共享式多端口存储器,读写可同时进行。双并且双口RAM分伪双端口RAM和真双端口RAM。
伪双口输入有一组数据线,两组地址线,两个时钟。两个输出端口共用有个输出端口。所以一个端口只读,另一个端口只写,但写入和读取的时钟可以不同,且位宽比可以不是1:1。即允许写A的同时读B,且速率可以不同。
真双口输入有两组地址线和两组数据线,两个时钟。输出有两个分别的数据线。所以双口RAM两个端口都分别带有读写端口,可以在没有干扰的情况下进行读写,彼此互不干扰。
双端口SRAM相比单端口SRAM增加了复杂性,主要体现在读写干扰问题上。双端口SRAM通过增加存取管实现了两个端口对存储单元的独立读写,但这降低了存储单元的稳定性。当两个端口进行同行存取时,会发生读写干扰问题,尽管目前尚未找到完美的解决方法,但复位操作对于确保系统的稳定性和可靠性仍然非常重要。
检查发现,sram的数据没有正确读入的原因是双端口RAM没有进行有效复位引起的。由于在mbist脚本中的如下设置,导致复位信号一直保持在高电平,使得双端口RAM没有进行有效的复位。
add_input_constraints reset -c1
方法一:在生成的test bench中手动控制复位信号进行有效复位,仿真PASS。
方法二:在mbist脚本中使用Register_static_dft_signal_names、Add_dft_signal reset1
和Add_dft_control_points三个命令组合实现对指定的SRAM的reset pin的复位控制,仿真也可PASS。