Tessent MemoryBIST Basic Flow
- DFT Flow Using Tessent Shell
- Design Loading
- Specify and Verify DFT Requirements
- Create DFT Specification
- Process DFT Specification
- Extract ICL
- Create Patterns Specification
- Process Patterns Specification
- Run and Check Test Bench Simulations
- Test Logic Synthesis
- Run and Check Test Bench Simulations with a Gate Level Netlist
使用 Tessent Shell 插入 Tessent MemoryBIST 的基本方法和一些常用情景下的示例。
如果是对 repairable memories 进行 mbist,会有一些额外的步骤。
在 sub-block、physical block 或者 chip level 进行 MBIST 插入的流程和主要步骤基本一致。
DFT Flow Using Tessent Shell
下图给出了对一个设计进行 MBIST 插入的 high-level flow,每一个步骤中都有很多具体的内容。
【这里的两个分支对应的是 RTL flow 和 Netlist Flow。如果是 RTL flow 就所有的设计一起综合,如果是 Netlist flow 就是只综合新插入的 DFT 电路,然后将其合并到设计中。】
Prerequisites
在对设计插入 MBIST 之前,需要准备好如下内容:
- RTL 或 gate-level netlist
- MBIST libraries
- 如果设计中包含标准单元,还需要 Tessent cell library 或者 ATPG library
- 对于没有 RTL 或者 library models 的 IP blocks,使用
read_verilog
命令的-interface_only
选项加载 simulation model。【改选项可以使工具忽略 filename 参数中指定的所有 modules 内部结构,只提取 module 的端口定义和参数】
Design Flow Dofile Example
一个简单流程的 dofile 如下所示。
Design Loading
Loading Design 是使用 Tesesnt Shell 进行 Tessent MemoryBIST 插入的第一步,具体包括设置正确的 context、读取库文件、读取设计和 elaborating 设计。
Set the Context
在 Tessent Shell 中,设置 context 意味着两件事:
- 第一,必须将 context 设置为 dft,这样才能创建 MBIST 硬件
- 第二,必须指定读入的设计类型是否为 RTL。如果是 RTL,使用
-rtl
;如果是门级 verilog netlist,使用-no_rtl
选项。
使用 -no_rtl
模式的时候,在 DFT 插入结束之后,输出的是一个拼接的网表(concatenated netlist)。
在 -rtl
模式中,输入的设计文件的结构会被保留,只有修改后的设计文件(dft_interted_designs)和新生成的 test IP (instruments)被 writte out 。
如果已经插入过 memory BIST 的 block 要被集成到更高 level 的设计中,必须使用 open_tsdb
命令打开 child block(the memory BIST inserted sub_block or physical_block)的 TSDB。
如果子模块和父模块的使用了相同的 TSDB,那么是可以复用的,不需要 explicitly open 默认的 TSDB,因为 TSDB 输出文件夹中的内容对工具来说是直接可用的。(具体内容可以看 set_tsdb_output_directory
命令是如何控制 TSDB 输出文件的名称和位置。)
Examples
set_context dft -rtl
set_context dft -no_rtl
open_tsdb ../core_tsdb_outdir
Read the Libraries
在对只有 RTL 的设计插入 MBIST 时,只读取 MBIST liblrary (TCD files)就可以的。但是 RTL design 中通常会有一些 pad cells 和 clock control 的库单元,需要一些外的的 library。
如果 Tessent cell libraries 中不包含 pad 的信息,可以使用 read_cell_library
命令读取 LV pad library ,对 Tessent cell libraries 进行补充,使其带有 pad 信息。
在 Tessent Shell 中,Memory BIST 库被看作是 Tessent core descriptions (TCDs),并且以 TCDs 被加载和引用。LV flow 的 MBIST
模型是可以直接和 Tessent Shell 兼容,可以作为 TCDs 被加载和引用。
【LV flow 应该是以前的 MBIST flow,现在不用了】
Examples
# read in Tessent cell library file for the pad IO macros.
read_cell_libraray ../library/adk_complete.tcelllib
# explicitly read in memory BIST models
read_core_descriptiosn ../library/128x64_RAM.memlib
# use set_design_sources to reference memory BIST libraries
# Using the tcd_memory type for the -format option indicates to the tool to expect a memory library file to be read in.
set_design_sources -format tcd_memory -y ../library/memlibs -extensions memlib
【在实际的项目中,库文件的后缀名可能会没有这么标准,重要的是明白不同 insertion flow 中所需要的库的类型,及其基本格式。】
Flow Variation for Repairable Memories
Tessent MemoryBIST 的 memory library 输入文件必须要包含特定的 wrappers ,从而能够生成和插入修复逻辑。
RedundancyAnalysis wrapper 是生成用于提供 memory 修复解决方案的 BIRA 逻辑所必须的。
RedundancyAnalysis wrapper 中的 PinMap sub-wrapper 用于将修复方案传输的 memory 中。
Read the Design
在 Tessent Shell 中,设定 context 并加载库文件之后,使用 read_verilog
命令读入设计。
Memory placement(DEF,Design Exchange Format files)、power domain data(UPF(Unified Power Format) 和 CPF(Common Power Format files)) 也可以在该步骤中进行加载。这些数据会影响 MBIST 的规划,主要是 memory partition 和 MBIST 控制器的分配。
Examples
# read in one netlist that can be either RTL or gate level
read_verilog ../netlist/cpu_top.v
# specify a file and a directory library in which to search for Verilog modules.
# -v is file_path -y is dir_path
set_design_sources -format verilog -v ../design/top.v -y ../design -extentions v gv
# read in DEF and UPF
read_upf ../data/design/power/blockA.upf
read_def ../data/design/layout/blockA.def
如果多次使用 set_design_sources
命令,工具只会使用最后一条命令中设定的内容。
Elaborate the Design
设计加载之后,使用 set_current_design
命令对设计进行 elaborate 。
该命令是指定 the root of the design,后续所有的操作都作用于 current design。
如果设计中有模块缺失,design elaboration 会识别出来。
对于 MBIST 插入而言,如果 modules 中不包含 memories 或者 memories 扇入上的时钟树单元,那么该 module 可以没有定义。可以使用 add_black_box -module
命令对其进行说明。
Examples
# use the set_current_design command
set_current_design blockA
Report the Design Data
可以使用一些命令检查加载的设计和库文件。
一些常用的示例如下所述。
Examples
示例1:
示例2:
下述示例报告了 Tessent Shell 当前加载的 memory model 以及其他的 test core descriptions。-levels 1
是只显示 core 的名称和类型,如果不指定,会显示 model 的所有的内容。
示例3:
下述示例报告了 design elaboration 过程中找到的 memory instances。
该命令除了显示 memory instance 的路径之外,还给出了一些其他属性信息。这些属性可以通过加载额外的数据间接修改(如 UPF 文件会说明 power domain island),或者使用 set_memory_instance_options
命令直接修改。
Specify and Verify DFT Requirements
使用 Tessent Shell 插入 memoryBIST 的第二步是具体说明(specify) DFT 需求、添加约束和使用 DRC 验证 DFT 需求是否正确。
Set DFT Specification Requirements
首先是告诉 Tessent 工具你要做的事情是 mbist,具体包括两方面:
- 使用
set_design_level
告诉工具要在哪一个 level 进行 mbist 的插入; - 使用
set_dft_specification_requirements
命令告诉工具要进行 mbsit 插入,并指定 DFT specification 的一些需求。这样可以使用用于 MBIST 的特定 DRC,并且告诉create_dft_specification
命令包含 MemoryBist wrapper。
Examples
告诉工具在 chip-level 进行 mbist 插入:
set_design_level chip
set_dft_specification_requirements -memory_test on
Notes
set_dft_specification_requirements
有两个作用:
- 指定
check_design_rules
命令执行时检查需求(就是说明按照那些规则进行 DRC?)(在上述示例中就是执行 memory test 的设计规则检查) - 指定
create_dft_specification
命令执行的时候, DftSpecification 中需要 include 的 instrument types。【这里就是告诉插入 Mbist 相关的 wrapper】
Dft Specification 描述了 process_dft_specification
命令需要的使用的信息。( process_dft_specification
命令会创建一系列的 instrument,并将其插入到电路中)
Dft Specification 中的 MemoryBist wrapper 就是指定创建一个 memory BIST controllers,然后可以选择是否将其插入到电路中。
Flow Variation for Repairable Memories
当设计中包含可修复的 memory 的时候,使用 set_dft_specification_requirements
是需要考虑一些额外的东西。
(待补充…)
Add Properties and Constraints
添加或者改变一些影响 DFT specification 创建的属性或约束,具体如下示例所示。
Examples1
为了在 chip level 插入 memory BIST,四个 TAP pins(TDI、TCK、TMS 和 TDO)在 chip-level 是可用的,并且要连接到 pad IO macros。
可选引脚 TRST 可以作为 power-up detector 的一个输出引脚。
如果 TAP pins 的名称为 tck、tdi、tms、tdo 和 trst(标准名称),工具将 TAP Contorller 的引脚连接到顶层对应的 IO 上。
如果不是标准名称,就需要对其进行执行,具体示例如下所示:
Notes
set_attribute_value
命令的基本用法:
object_spec 是对象(一个或者多个),attribute_name是对象的某个属性,attribute_value是设定的属性值。
所以,示例1中的命令的意思就是,将 tck_p 这个对象的 function 属性的值设置为 tck。
这里的示例的意思就是,如果设计中执行 TAP 中的 tck 功能端口的名字不是 tck(这里就是 tck_p),这个时候,就要使用这条命令,告诉工具这个端口虽然名字不是 tck,但是它的功能就是 tck。
Examples2
The following example adds additional attributes for connecting essential fuse box connections at the chip level that are not inferred from the fuse box model. ( 修改 Dft Specification 中的内容 )
Examples3
可以使用 Defaults Specification wrapper 修改一些工具内部的默认属性,从而满足特定的需求。
Defaults Specification wrappers 的默认设置机制也是层次化的,可以设定 company、group、user-level 等不同层级的默认配置。【这里就是这个默认配置对谁生效,所有人还是仅某个用户】
下述示例就是创建一个 company memory BIST DefaultsSpecification。
生成一个包含 mbist 所有默认选项的文件:
company.tessent_defaults 文件中的部分内容如下所示:
然后使用该文件创建一个 company memory BIST DefaultsSpecification。
所创建的 DefaultsSpecification 可以在 .tessent_startup 文件中自动读取,也可以使用 read_config_data
命令直接读取。
Define Clocks
使用 add_clock
命令定义时钟。
在对设计进行 elaborating 的时候,Tessent Shell 会自动从 memory 的 clock 引脚 trace 到 clock source。
Examples1
如下示例所示,对于个简单的时钟路径(指的是从原始设计时钟到 memory 的路径上只有 wires 和 buffers),只需要定义时钟周期和参考时钟源的引脚。因为从待测 memory 到 clock source pin 的时钟路径是工具自动 trace 的。(复杂的时钟路可能有多个分支,这个时候就需要具体指定。)
【add_clock
的功能是 declares a pin or a port as a clock。】
上述命令就是将 MBIST 模块的 CLK 输入端口给定一个周期为 12ns 的时钟,-label
选项是便于使用 get_clock
等命令访问到该时钟。(这里定义的这个时钟在实际测试中是怎么给到的?)
(这里是直接添加了一个异步时钟,-reference
选项会添加生成时钟,生成时钟才有参考时钟吧。)
Examples2
下述示例定义了一个来自 PLL 的内部时钟源,用以驱动 memories。
第一个 add_clocks
命令的时钟源是 PLL 的参考;第二个 add_clocks
命令定义的内部时钟驱动 memories
DRC 会 trace 这些 reference pin 到它的 source,这里就是 clk_ref 端口。
(这个 case 好像有点问题,大概知道怎么个情况,后面直接看 add_clocks
这个命令的说明。)
Run DRC
执行 DRC 确保所有的约束都是正确的。DRC 通过之后(clean),Tessent 就会从 SETUP 进入到 ANALYSIS。
如果设计的 memory clock path 上包含 clock gating cells,需要使用 add_dft_clock_enables
命令;如果包含必须控制的 MUX,需要使用 add_dft_control_points
命令;如果想要在 memory clock path 上添加 MUX,需要使用 add_dft_clock_mux
命令。
如果设计中出现任何 clock DRC 违例(如时钟定义错误等),必须在进行下一步流程之修复掉。
Flow Variation for Repairable Memories
Create DFT Specification
使用 create_dft_specification
命令,基于前一个步骤中指定的 DFT requirements,创建一个默认的 DFT specification 。
report_config_data
命令可以报告所创建的 DFT specification。
有多种的方法可以对 DFT specification 进行修改或配置,从而满足特定的需求。
Invoke create_dft_specification
基于之前定义的 DFT specification 需求,creat_dft_specification
命令可以自动创建 DFT specification,并将其保存在内存中。使用 report_config_data
命令可以报告该 DFT specification 的内容。
DFT specification 包含如下内容:
- IjtagNetwork wrapper :描述设置 BIST 控制器所需的访问电路
- MemoryBist wrapper:描述 memory BIST 配置
IJTAG network 完全符合 1687 IEEE 标准。
Example
如下所示,将生成的 DFT specification 保存到变量 dft_spec 中,便于使用查看其内容。
Edit/Configure the DFT Specification According to Your Requirements
如果有一些特殊的需求,可以多所创建的 DFT specification 进行修改。
Method 1: Change design constraints and re-generate the DFT specification
在生成 DFT specification 之后,可以退回到 setup mode,然后修改一些 memory instance 相关的选项之后,重新生成 DFT specification。如下所示,该示例将 physical_cluster_size_ratio 从默认的 20% 更改为 40%。
Method 2: Use the GUI to edit the DFT specification
使用 display_specification
命令打开 GUI,它会显示已经指定的 DFT 需求。GUI 界面的编辑操作会更新到内存中的 DFT specification 中。
完成编辑之后,可以使用 report_config_data
命令显示所编辑过的内容,然后再使用 read_config_data
命令添加到 DFT specification。
Method 3: Modify the DFT specification in memory
使用 add_config_element
和 set_config_value
这两条命令也可以对 DFT specification 进行修改。
【具体修改方法参考:【Tessent IJATG Users Manual】【Ch5】IJTAG Network Insertion】
Validate the DFT Specification
在进行下一步之前,对 DFT specification 进行检查,确保没有错误。
该步骤是可选的,但是推荐执行。执行检查的命令为:
process_dft_specification -validate_only
Process DFT Specification
创建和插入 DFT specification 中定义的所有内容。
使用 process_dft_specification
命令生成并插入 DFT specification 中需要的所有 DFT hardware 到设计中。
对于 Tessent MemoryBIST,如果是在 chip-level 进行插入,会插入 TAP 控制器。
如果是在 physical 和 sub-block 层级插入MBIST,插入的是 IJTAG host scan interface。
Extract ICL
该步骤是验证使用 process_dft_specification
命令插入的 ICL 模块的连接关系是正确的。如果没有 DRC 违例,提取 top-level 的 ICL 描述。
extract_icl
命令还会创建一个用于 synthesis 的 SDC 文件。
Preparation for Pattern Generation
extract_icl
命令通过查找所有的模块及其对应的 ICL 模块准备当前设计(set_current_design
指定的 root of the design)的 pattern generation。
Create Patterns Specification 和 Process Patterns Specification 两个步骤需要使用当前设计的 ICL。
Example
下述示例展示了如何提取 the root of the design 的所有 ICL 模块。
Create Patterns Specification
Create Patterns Specification 步骤是生成一个默认的 patterns specification。
patterns specification 和 dft specification 的作用相似,是一个配置文件,它告诉 process_patterns_specification
命令创建什么样的测试。
默认的 patterns specification 同样也可以根据特定需求进行修改,然后生成想要的 patterns specification。
Automatically Created Patterns Specification
使用 create_patterns_specification
命令创建的默认的 patterns specification 只会保存在内存中。在执行 process_patterns_specification
命令并验证无误之后,才会将其写入到 TSDB 输出文件夹的中的 patterns 文件夹中。
如下示例所示,创建一个默认的 signoff patterns specification,然后将其保存在 pat_spec 变量中。使用该变量查看内存中 patterns specification 的内容。
Edit/Configure the Patterns Specification According to Your Requirements
(待补充…)
Process Patterns Specification
执行 process_patterns_specification
命令,根据 patterns specification 创建 patterns 和 test benches。
Run and Check Test Bench Simulations
memoryBIST 的最后步骤,通过仿真验证 mbist 插入的结果。
Run Simulations
使用 run_testbench_simulations
命令启动仿真器对 test benches 进行仿真。
test benches 是由 process_patterns_specification
命令生成,存放位置是 <tsdb_outdir>/patterns/.patterns_signoff。
run_testbench_simulations
也会有一些选项,如使用 -simulator
指定所使用的仿真器,使用 -store_simulation_waveforms on
选项保存仿真波形,用于后续的 debug。
Check Results
使用 check_testbench_simulations
命令检查仿真的状态。
(上述2个命令的具体参考Tessent Shell Reference Manual.)
Formal Verification
Tessent Shell 工具不能生成用于 Synopsys Formality 的脚本,但是可以通过设置约束手动创建一个用于 Formality 的脚本。
(形式验证参考 Tessent Shell User’s Manual 的附录。)
Test Logic Synthesis
RTL 和 gate-level design 的逻辑综合步骤是不一样的
在 memoryBIST 逻辑的综合过程中,综合工具可能给出的两种类型的 warnings 是可以忽略的,分别为:
- 无扇出的寄存器及驱动其输入的组合逻辑被移除。(Registers with no fanout are removed, along with the combinatorial logic driving the inputs.)
- 输入和输出总是相同的寄存器被合并。(Registers with inputs and outputs that are always identical are merged.)
RTL Design Flow Synthesis
集成 MBIST RTL 和 带有测试逻辑的 design RTL 的 RTL synthesis 是一个自动化流程,具体内容如下所示。
Using Generated SDC for MemoryBIST
extract_icl
和 extract_sdc
都可以生成用于 synthesis、layout 和 STA 的 SDC 文件。
【这里的 SDC 只对 MBIST 进行约束,因为上图中写的是 for MemoryBIST。此外,在其他的插入流程中,如 BScan 插入的时候,会针对边界扫描电路生成 SDC】
当 extract_icl
命令作用于带有 sub-blocks 的 physical block 时,SDC 会对 physical module 和 sub-blocks 进行约束。
所生成的 SDC 由多个 procedures 构成,这些 procedures 可以集成得到一个 design synthesis 脚本中。详细内容可以参考 Tessent Shell User’s Manual 中的 Timing Constraints SDC 章节。
Synthesizing the RTL Design with Test Logic
synthesis tool 自动对 DFT inserted 的 RTL design 进行综合。
write_design_import_script
命令可以生成一个脚本,综合工具使用该脚本可以加载 DFT inserted 的 RTL design。
更加详细的内容在 Tessent Shell User’s Manual 的 Synthesis Guidelines for RTL Designs with Tessent Inserted DFT 和 Tessent Shell Workflows 中。
Gate Level Design Flow Synthesis
gate level design flow 的综合是一个完全自动的流程,只需要执行 run_synthesis
命令综合测试逻辑然后将其集成到设计中。
Run Synthesis
run_synthesis
命令只会对 TSDB 中的测试逻辑的 RTL 进行综合。
在创建和插入 MBIST、bounday scan 或 IJTAG 逻辑时,所生成的 RTL 会在执行 process_dft_specification
命令时自动写入到 TSDB 中。
Concatenate Netlist Generation
run_synthesis
命令成功执行之后,总动创建并包含综合后的测试逻辑和修改后的设计模块的 concatenated netlist,并将其存放在 TSDB 的 dft_inserted_designs 文件夹中。
Run and Check Test Bench Simulations with a Gate Level Netlist
为了能够对带有 MBIST 的 disign 在 gate-level 进行 MemoryBIST 验证,需要重新生成 signoff patterns。主要步骤如下所示:
- 将 context 设置为 IJTAG patterns
- 指定(point to)用于 MBIST RTL 插入的 TSDB
- 读取 cell 和 memory 的库文件
- 读取门级网表
- 从 TSDB 中读取设计文件,包括 RTL
- Set current design and check design rules
- Create and process pattern specification
- Run and check test benches
Examples