Tessent MBIST Flow 实战全解析

一、先反过来想:不做 MBIST 会怎样?

做了这么多年 DFT,我发现一个规律------很多人一上来就问"MBIST 怎么做",却从来没想过"为什么要做 MBIST"。这次咱们换个姿势,跟着芒格老爷子的反向思维,先问:如果不做 MBIST,会发生什么?

图1传统外部测试 vs MBIST 内建自测 三大痛点对比

答案很清晰,三个字:

  • 测试成本爆炸:现代 SoC 的 Memory 占比早已超过芯片面积的 60%,用 ATE 从外部逐一灌 Pattern,不是按小时计,是按天计费的。
  • 在线测试做不了:车规 ASIL-D、医疗 IEC 62304,都要求芯片在运行时持续自检。外部 ATE 根本够不着上电跑起来的芯片。
  • IP 跨项目复用成了摆设:含 Memory 的第三方 IP,因为每块 Memory 都得重新拉专属测试信号,换个项目又得重来一遍,把"IP 复用"的好处白白抵消掉。

结论:做 MBIST,本质上是在用面积换时间、换安全、换工程效率。这笔账,是值的。

二、搞懂两个概念,Tessent 就通了一半

很多人第一次接触 Tessent 工具,被两个词搞晕了:Context 和 Mode。这两个词在 Manual 里随处可见,但文档解释得云山雾绕。我给你打个比方:

|-------------------------------------------|
| 洗衣机类比:Context vs Mode |
| Context = 洗衣机的「洗涤模式选择」------ 是棉麻模式还是快速洗? |
| (对应 Tessent:RTL Flow 还是 Netlist Flow?) |
| Mode = 一次洗衣周期的「三个执行阶段」------ 注水 / 洗涤 / 脱水 |
| |
| set_context dft -rtl => 选择「RTL 模式」的洗衣机 |
| Setup Mode => 注水阶段(环境配置) |
| Analysis Mode => 洗涤阶段(DRC + 电路分析) |
| Insertion Mode => 脱水阶段(插入 MBIST 逻辑) |

换句话说:Context 决定工具干什么,Mode 决定工具当前处于哪一步。把大象装冰箱,同样分三步:

图2 Tessent Shell 工作三阶段(类比:大象装冰箱)

2.1 Tessent Wrapper 的"洋葱结构"------新手最容易踩的坑

Tessent 对 DFT 设置有一套嵌套 Wrapper 机制,就像洋葱,一层套一层。每次用 set_config_value 或 set_attribute_value 配置属性时,必须精确声明你在哪一层。否则命令执行了,但其实打在了外层,完全没用。

图3 Tessent DFT 设置:像剥洋葱一样逐层声明

|-------------------------------------------------------------------|
| 避坑指南 #1:Wrapper 路径不对,命令等于白写 |
| 1. TAP 相关配置要定位到 /IjtagNetwork/HostScanInterface(tap)/Tap(main) 层级 |
| 2. Memory 接口配置要定位到 /MemoryController/.../MemoryInterface 层级 |
| 3. 用 report_config_data 命令及时检查,别等到 DRC 报错才发现配错层了 |
| 4. 初学者建议:先理解大 Wrapper 结构,细节参数边跑边查 Manual(Page 445) |

三、Standard MBIST Flow 实操步骤,一步一步来

所有 EDA 工具的 Flow,本质上只有三件事:吃文件 → 工具设置+运行 → 吐结果文件。Tessent MBIST 也不例外,我们就按这个框架拆解。

Step 1 | 吃文件阶段(Setup Mode 前半段)

|-----------------------------------|-----------------|------------------------------------------------|
| 命令 | 读入内容 | 注意事项 |
| set_context dft -rtl | 声明 RTL Flow 模式 | 必须第一条执行,决定后续工具行为 |
| set_tsdb_output_directory | 指定中间/输出文件目录 | 不设置默认 tsdb_outdir,建议显式声明 |
| read_verilog | 读入 RTL 源文件 | RTL Flow 无需读 Standard Cell lib |
| read_core_description (lvlib/tcd) | 读入 Memory Model | Memory Compiler 生成,包含算法/端口/时序描述 |
| set_current_design | 指定 Top Module | 触发工具对 Design 解析,识别 Memory Instance + Black Box |

Step 2 | 配置与分析阶段(Setup Mode 后半段 + Analysis Mode)

2.1 声明 Design Level --- 告诉工具你在哪个层次

在执行 check_design_rules 之前,必须先声明当前 Design 所处的 Hierarchy 层次。不同 Level 决定了 Tessent 会插入哪类测试硬件:

|------------------|--------------|-------------------------------------|
| Design Level | 典型场景 | 是否插入 TAP Boundary 逻辑 |
| chip | 最顶层集成,包含 TAP | 是,插入完整 TAP 控制逻辑 |
| physical_block | 子模块级别 | 否,只插入 Memory Controller + Interface |

2.2 set_dft_specification_requirements --- MBIST 选项开关

一行命令,开启 Memory 测试的三个默认子选项:

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 开启 MBIST 主开关(下面三项默认随之打开,值为 auto) set_dft_specification_requirements -memory_test on # 自动随之开启的三项(无需手动设置,了解即可): # -memory_bist_logic auto -> 自动产生 BIST 控制逻辑 # -memory_interface_logic auto -> 自动产生每块 Memory 的 Interface 电路 # -memory_observation_logic auto -> 自动产生 Observation 链路 |

2.3 为 MBIST 工作模式添加输入约束

芯片要能进入 MBIST 工作模式,需要正确的输入控制信号。add_input_constraints 的本质是告诉工具:在测试模式下,哪些信号应该是高/低电平。

2.4 TAP 端口绑定(TOP 设计专用)

对于顶层设计,需要将 TAP 的物理端口(TDI/TDO/TMS/TCK/TRST)与 IJTAG 网络进行绑定。两种方式二选一:

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 方式一:直接绑定 TAP Parent Instance(推荐) set_config_value Parent_instance \ -in_wrapper [get_config_elements spec/IjtagNetwork/HostScanInterface(tap)/Tap(main)\] \\ xxx_top/xxx_top # 方式二:逐一绑定 TMS/TDI/TDO/TCK/TRST 端口 set_config_value tms \\ -in_wrapper \[get_config_elements spec/IjtagNetwork/HostScanInterface(tap)/interface] \ xxx_top/xxx_top/xxx_internal_tms # TDI、TDO、TCK、TRST 同理,逐一绑定 |

2.5 时钟声明------让 Memory 在对的频率下测试

Tessent Shell 会自动 Trace 从 Memory 的 Clock Pin 到 Clock Source 的路径(通常是 OCC 后的时钟)。但需要工程师显式声明哪个时钟喂哪块 Memory。

|-------------------------------------------------|
| 避坑指南 # 2 :Clock 声明不对是 MBIST 失败的高频原因 |
| Clock 必须从 OCC 后的点开始 Trace,不能直接指定 PLL 输出 |
| 多时钟域芯片:每个 Memory 域都要单独声明时钟 |
| Memory 时钟频率应与功能模式一致,避免 Pattern 在仿真中出现时序违例 |

2.6 check_design_rules --- DRC 检查(Analysis Mode 入口)

这一步是整个 Flow 最重要的分水岭。执行后,工具进入 Analysis Mode,内部自动完成:

  • 识别 Black Box → 对 RTL 分步综合 → 生成 Gate-level Netlist
  • 重建 Hierarchy 结构,运行 DRC Rule Check(D/C Rule)
  • Circuit Learning Analysis:对 Repair Memory 分组,Shared Bus 验证 cluster library

重要:DRC 有 Error 时工具直接停止,必须全部清零才能继续。Warning 可以先看情况,但不能忽视。

2.7 create_dft_specification + report_config_data

create_dft_specification 是一个汇总节点------它把前面吃进来的 Design 信息和所有 DFT Specification 声明汇总,形成「待插入的测试硬件清单」。report_config_data 让你把这份清单打印出来 review,发现问题及时改,别等到 Insertion 完才发现哪里配错了。

|-----------------------------------------------------|
| 实战小技巧:report_config_data 是你的救命稻草 |
| 在 create_dft_specification 后立即调用 report_config_data |
| 重点检查:每块 Memory 是否都有对应的 MemoryInterface? |
| 检查:Controller 分组是否符合设计意图?(是否按 UPF/DEF 正确划分了电源域) |
| 检查:TAP 端口绑定路径是否正确? |

Step 3 | 输出阶段(Insertion Mode)

3.1 process_dft_specification --- 真正插入 MBIST 逻辑

这是整个 Flow 最关键的一步。工具把 DftSpecification 里声明的所有测试硬件,真实地插入到 RTL 中,生成插桩后的 Netlist 和 ICL 文件。

3.2 extract_icl --- ICL 文件验证(必过关)

ICL 文件(Instrument Connectivity Language)在 process_dft_specification 过程中生成,但 extract_icl 命令会对其进行正确性 Verification。

extract_icl 必须 0 Error,才能进入 Pattern 生成阶段!有 Error 就 debug,没有商量余地。

3.3 Pattern 生成与仿真

Pattern 阶段分两步:先声明规格,再执行生成。

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 第一步:声明 Pattern 规格(选择算法、覆盖率要求等) create_pattern_specification # 第二步:产生 Pattern 文件(输出到 tsdb_outdir 目录) process_patterns_specification # 第三步:对插桩后的设计进行 Pattern 仿真验证 # 推荐用 VCS / ModelSim / Xcelium 进行 RTL 仿真 # 仿真时需要一定的 RTL 编码知识,推荐练手网站: # https://hdlbits.01xz.net/ (从硬件角度学习 Verilog) |

|------------------------------------------------------------------|
| 关于 Pattern 仿真:DFT 工程师也要会写 Testbench |
| Pattern 仿真本质是对 MBIST 控制逻辑的功能验证 |
| 需要编写 Testbench 来模拟 TAP 控制序列(TDI/TDO 交互) |
| 推荐结合 Tessent IjtagController Simulation Model 一起跑,省去手写 TAP 驱动的麻烦 |

四、完整 Tessent MBIST Tcl 脚本(注释版)

把上面所有步骤串成一份完整可执行的 Tcl 脚本,关键参数全部加上注释:

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #============================================================ # Tessent Standard MBIST Flow - RTL Insertion Script # Author: DFT Engineer | Tool: Tessent Shell #============================================================ # === Step 1: Setup Mode - 环境配置 === # 声明工作模式:RTL-based MBIST 插入 Flow set_context dft -rtl # 指定所有中间/输出文件的存放目录(建议显式声明) set_tsdb_output_directory ./tsdb_outdir # 读入 Memory Model(Memory Compiler 输出的 lvlib/tcd 格式) # 注意:RTL Flow 不需要 read_cell_library! read_core_description ./mem_models/sram_256x32.lvlib read_core_description ./mem_models/rom_512x32.tcd # 读入 RTL 顶层文件 read_verilog ./rtl/xxx_top.v read_verilog ./rtl/submodule_a.v # 设置当前 Design 顶层(触发 Design 解析 + Memory Instance Match) set_current_design xxx_top # === Step 2: DFT Specification 配置 === # 声明当前 Hierarchy 层级(chip=含TAP顶层 / physical_block=子模块) set_design_level chip # 开启 MBIST 主开关 set_dft_specification_requirements -memory_test on # 添加功能模式的输入约束(使芯片进入 MBIST 工作模式) add_input_constraints xxx_top/scan_en -c0 # 正常工作时 scan_en = 0 add_input_constraints xxx_top/test_mode -c1 # 进入 MBIST 模式时 test_mode = 1 # TAP 端口绑定(TOP 设计必须配置) set xxx_spec [get_config_elements DftSpecification] set_config_value Parent_instance \ -in_wrapper [get_config_elements $xxx_spec/IjtagNetwork/HostScanInterface(tap)/Tap(main)] \ xxx_top/u_tap_ctrl # === Step 3: Analysis Mode - DRC 检查 === # 执行 DRC Rule Check(必须 0 Error 才能继续) # 内部自动完成:RTL综合 -> Hierarchy重建 -> DRC -> Circuit Learning check_design_rules # 汇总 DftSpecification(合并 Design 信息 + DFT 声明) create_dft_specification # 检查 DftSpecification 配置是否正确(强烈建议不要跳过) report_config_data # === Step 4: Insertion Mode - 插入逻辑 === # 真正插入 MBIST 相关硬件逻辑 process_dft_specification # ICL 文件 Verification(必须 0 Error) extract_icl # === Step 5: Pattern 生成 === # 声明 Pattern 规格 create_pattern_specification # 生成 Pattern 文件(存放至 tsdb_outdir) process_patterns_specification #============================================================ # Flow 结束:检查 tsdb_outdir 下的输出文件 # - xxx_top_tessent_wrapper.v (插桩后 RTL) # - xxx_top.icl (ICL 文件) # - patterns/ (Pattern 文件) #============================================================ |

五、总结:几条经验,帮你少走弯路

|--------|--------------------------------|---------------------------------------------------|
| 编号 | 经验 / 避坑点 | 说明 |
| 01 | DRC 必须 0 Error 才继续 | 有 Error 就停下来 debug,别侥幸跳过 |
| 02 | Wrapper 路径要精确到层级 | set_config_value 命令错层等于白写,用 report_config_data 验证 |
| 03 | extract_icl 是 Pattern 生成的门票 | ICL 有 Error,后续所有 Pattern 都是垃圾 |
| 04 | Memory Controller 用 DEF/UPF 划分 | 手工命令设置 Controller 容易出错,推荐 DEF/UPF 驱动 |

相关推荐
DarrenHChen_EDA24 天前
【Backend Flow工程实践 16】从 Scan Chain 到 Placement:测试结构为什么会影响后端布局?
eda·dft·apr·placement·scan chain·backend flow·可测性设计
科学创新前沿2 个月前
物理信息神经网络:从数据驱动到物理嵌入的科学计算新范式!
人工智能·深度学习·dft·pinn·流体力学·固体力学·断裂力学
旺旺脆兵兵5 个月前
EDT Bypass Mode的作用
dft
最爱干饭了5 个月前
NC verilog :force命令
dft·ncverilog
cy4130266 个月前
DFT时怎么考虑IR问题
dft·ir
cy4130266 个月前
怎么理解jtag/ssn tdi/tdo(input/output)要在一个clk内收时序
jtag·dft
cy4130266 个月前
SSN和ijtag在scan中的应用与区别
dft
材料科学研究7 个月前
量子计算与AI融合:材料科学新突破
人工智能·量子计算·dft·第一性原理
star1111119 个月前
VASP计算其他性质(备忘录)
dft·vasp