ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MBIST集成实战:从ATPG建模到三类HDL生成与诊断调优

MBIST集成实战:从ATPG建模到三类HDL生成与诊断调优 简介本资源是一份面向数字电路验证工程师、ASIC设计人员及高校VLSI方向学习者的Mentor MBIST技术深度学习总结文档聚焦于内置自测试BIST在嵌入式存储器如SRAM/ROM故障检测中的工程实践。内容系统梳理了MBIST添加的必要性、存储器类型特性、典型架构TPG/CUT/RA/DM四模块、适用场景、优缺点对比、常见故障类型永久性/暂时性/逻辑/物理、核心算法LFSR/PRNG/BIST、Mbistarchitect工具链使用、ATPG语法要点、BIST变量机制并附有ROM/SRAM库格式、内容文件规范及自动化脚本Makefile管理等实用附录。资源为1个319KB的Word文档.docx结构完整、条目清晰含12个主章节与6个技术附录便于按需查阅与工程复用。目前已有1435人学习下载适合需要快速掌握Mentor MBIST集成流程、测试激励生成与诊断分析方法的中高级硬件验证从业者。1. MBIST 不是“加个模块就完事”它决定你芯片出厂前最后一道逻辑防线的厚度很多数字前端工程师第一次接触 MBIST是在 tape-out 前两周被 DFT 工程师拉进会议“这个 SRAM 必须加 MBIST否则测试覆盖率不达标。”——但真正动手时才发现MBIST 不是插件式功能而是一套嵌入在 memory 周边、与 clock domain/scan chain/reset 策略强耦合的硬逻辑子系统。它不只影响面积通常增加 1.5%~3.5%更直接决定量产芯片能否通过 ATE 的实速测试at-speed test比如一个标称 800MHz 的 SoC若 MBIST 控制器无法在 800MHz 下完成 MarchC 全地址遍历读写校验那这块 memory 就永远无法被信任。本文聚焦 Mentor Graphics 的 mbistarchitect 工具链从 memory 模型定义、ATPG 语法建模、BIST 结构定制到脚本化生成全流程还原一个真实项目中可落地的 MBIST 集成路径。适合已掌握基本 DFT 概念、正面临 memory BIST 集成任务的 ASIC 设计工程师与 DFT 工程师。2. MBIST 结构不是黑盒从 TPG/RA/DM 到 Mentor 实现中的三类 HDL 输出MBIST 的经典四层结构Test Pattern Generator / Circuit Under Test / Response Analyzer / Diagnostic Module在 Mentor mbistarchitect 中并非抽象概念而是映射为明确的硬件模块划分与信号接口协议。理解这三层 HDL 输出的职责边界是避免后续集成时出现时序违例或诊断失败的关键前提。2.1 *_bist.v核心算法引擎March 算法的 RTL 实现载体*_bist.v是 MBIST 的心脏它不包含 memory 本身而是围绕 memory 外围构建的控制逻辑。以 MarchC 算法为例该文件内含一个状态机state machine严格按 14 步序列执行初始化→全写 0→读 0 并写 1→读 1 并写 0→循环三次→最终读 0。关键点在于所有读写操作都由内部计数器驱动而非外部 CPU 或 ATE 指令。例如在*_bist.v中你会看到类似以下的 Verilog 片段// MarchC 第 3 步读出当前值应为 0然后写入 1 always (posedge clk) begin if (rst_n 1b0) begin state IDLE; end else if (enable_bist) begin case (state) IDLE: begin if (start_bist) state STEP1; // 启动后进入第一步 end STEP1: begin // write 0s addr_cnt 0; data_out {DATA_WIDTH{1b0}}; wr_en 1b1; rd_en 1b0; if (addr_cnt MEM_DEPTH-1) state STEP2; end STEP2: begin // read 0s, write 1s rd_en 1b1; wr_en 1b1; data_out {DATA_WIDTH{1b1}}; if (rd_data ! {DATA_WIDTH{1b0}}) error_flag 1b1; // 读出非 0 即报错 if (addr_cnt MEM_DEPTH-1) state STEP3; end // ... 后续步骤省略 endcase end end提示*_bist.v中的clk必须与 memory 的工作时钟同源且满足建立保持时间wr_en/rd_en等控制信号需通过 MUX 与系统正常读写路径隔离这是防止 BIST 运行时干扰 functional mode 的基础。2.2 *_bist_con.v连接器模块解决 memory 接口协议适配问题*_bist_con.v是 MBIST 与 memory 之间的“翻译官”。它不参与算法只做信号桥接与时序对齐。例如一个同步 SRAM 的.atpg文件定义了chip_enable CEN low意味着 CEN 在低电平时有效而*_bist_con.v就负责将_bist.v输出的cen_bist高有效反相后接入 memory 的CEN引脚。更重要的是它处理多周期操作.atpg中read_cycle定义了两个wait对应 memory 的两个 clock cycle 延迟tAA tOHA*_bist_con.v内部会插入两级寄存器对Q数据进行采样确保*_bist.v中的expect Q move能在正确周期捕获稳定数据。2.2.1 地址/数据总线复用逻辑当多个 memory 共享同一组 BIST 控制器时常见于 SoC 中多个小 SRAM*_bist_con.v还承担地址/数据总线的分时复用。其典型结构如下// 地址总线选择BIST 模式下使用 bist_addrfunctional 模式下使用 sys_addr assign addr_to_mem (bist_mode) ? bist_addr : sys_addr; // 数据输出选择BIST 写入时驱动 data_out读取时三态释放 assign data_to_mem (bist_mode wr_en_bist) ? data_out : {DATA_WIDTH{1bz}}; // 读数据采样仅在 bist_mode 且 rd_en_bist 有效时锁存 always (posedge clk) begin if (bist_mode rd_en_bist) begin q_sampled q_from_mem; end end注意*_bist_con.v的综合约束必须明确指定set_false_path -from [get_pins *_bist_con/bist_mode] -to [get_ports {addr_to_mem data_to_mem}]否则 STA 工具会误判 BIST 路径为关键路径。2.3 *_tb.v不只是验证更是诊断能力的沙盒环境*_tb.v是唯一能完整暴露 MBIST 诊断能力的模块。它不仅模拟 memory 行为如$readmemh(rom_content.txt, mem)更关键的是注入可控故障。例如要验证“转换错误stuck-at transition”可在 testbench 中强制修改某地址单元的翻转行为// 注入 0→1 转换失败地址 0x100 单元写 0 后读仍为 0但写 1 后读仍为 0即 stuck-at-0 initial begin #100; mem[256] 32h0000_0000; // 初始化为 0 #10; mem[256] 32h0000_0000; // 写 0正常 #10; // 故意破坏写 1 但不更新 mem[256] // 此时 MarchC 的第 3 步read 0s, write 1s中读出仍为 0但写入未生效 // 后续第 4 步read 1s将读出 0触发 error_flag end运行此 testbench 后*_bist.v中的error_flag会被置位同时*_bist_con.v会输出fail_addr和fail_data若启用了诊断功能。这才是 MBIST 区别于普通 scan 测试的核心价值定位到具体失效地址而非仅报告“memory fail”。3. ATPG 语法不是配置文件它是 memory 行为的时序契约ATPGAutomatic Test Pattern Generation语法在 Mentor mbistarchitect 中并非简单的参数列表而是 memory 读写时序的精确建模语言。一个错误的.atpg文件会导致生成的*_bist.v在实速测试中因时序不匹配而漏检故障。必须逐字段理解其物理含义。3.1bist_definition中的时序信号定义high/low决定驱动极性.atpg文件中clock CLK high表明 memory 的采样边沿为 CLK 上升沿chip_enable CEN low表明 CEN 为低电平有效。这直接影响*_bist_con.v的逻辑设计信号名.atpg定义*_bist_con.v中处理方式物理意义CLKhigh直接连接至 memory 的 CLK 输入所有操作在上升沿采样CENlowassign cen_to_mem ~cen_bist;CEN0 时 memory 响应WENlowassign wen_to_mem ~wen_bist;WEN0 时允许写入OENdont_touch highassign oen_to_mem 1b1;OEN 始终拉高禁用三态提示dont_touch表示该信号在 BIST 模式下保持恒定不参与测试序列。若误设为assert会导致*_bist.v生成不必要的控制逻辑增加面积与功耗。3.2read_cycle/write_cycle用change/assert/wait描述真实波形ATPG 语法的本质是事件驱动的波形描述。change A; assert CEN; wait; wait; expect Q move;这一行代码对应 memory datasheet 中的 tAAAddress Access Time和 tOHAOutput Hold Time参数。其展开波形如下以 2-cycle read 为例CLK: ▲ ▲ ▲ | | | A: 0x0 → 0x1 → 0x1 // change A 在第一个 CLK 上升沿后更新 CEN: ▼ // assert CEN 在第一个 CLK 上升沿后拉低因 CEN low Q: ▲ // expect Q move 在第二个 CLK 上升沿后采样tAA tOHA ≈ 2 cycles3.2.1wait的本质是“下一个测试时钟周期”wait不是延时语句而是推进测试时钟的指令。每个wait对应一个clk周期。因此read_cycle中的两个wait意味着第一个wait等待CEN有效后的地址建立时间tAS第二个wait等待数据稳定并满足保持时间tOHA若 memory 的 tAA 实际为 3ns而测试时钟为 1GHz周期 1ns则.atpg中必须写wait; wait; wait;三个周期否则*_bist.v生成的状态机将在数据未稳定时读取导致误报。3.3address_size与data_size决定 BIST 控制器的位宽资源这两个参数直接映射到*_bist.v中的寄存器宽度address_size 9→reg [8:0] addr_cnt;支持 512 个地址data_size 32→reg [31:0] data_out;32-bit 数据总线若实际 memory 为 1024x64则.atpg中必须设address_size 10; data_size 64;。否则*_bist.v会因位宽不匹配导致综合失败或功能错误。这是新手最常忽略的硬性约束。4. Mbistarchitect 脚本化流程从.atpg到可集成 RTL 的自动化闭环手动点击 GUI 生成 MBIST 在项目初期可行但面对数十个 memory 实例时必然崩溃。Mentor mbistarchitect 支持完整的命令行脚本化.scr结合 Makefile 可实现一键生成、日志归档、版本管控。以下是生产环境验证过的最小可行脚本集。4.1 核心脚本rom_bist.scr参数化配置的黄金模板附录 D 中的rom_bist.scr是可复用的骨架但需根据项目需求调整关键变量。以下为增强版增加了错误检查与压缩选项# rom_bist.scr —— ROM MBIST 生成脚本 reset state # 加载 memory model 库 load lib ./atpg/rom.atpg add memory models rom -filename ./atpg/rom.asciiset # 配置 BIST 算法MarchC 覆盖耦合错误适合 ROM setup mbist algorithms MarchC # 启用压缩减少响应分析电路面积对 ROM 有效 setup observation scheme -compress setup mbist compressor -localcomparator # 设置控制器名称与输出路径 set design name controller -module rom_bist set file naming -bist_model ./rom_bist/rtl/rom_bist.v set file naming -connected_model ./rom_bist/rtl/rom_bist_con.v set file naming -testbench ./rom_bist/rtl/rom_bist_tb.v set file naming -script ./rom_bist/script/rom_bist.scr set file naming -ctdl ./rom_bist/script/rom_bist.ctdl set file naming -wgl ./rom_bist/script/rom_bist.wgl # 关键设置时钟约束确保实速测试可行 set clock constraint -name rom_clk -period 1.25 -duty_cycle 50 -phase 0 # 执行生成 run # 保存所有输出-replace 覆盖旧文件-verilog 生成 RTL save bist -verilog -script -replace exit -discard注意set clock constraint必须与芯片顶层时钟树约束一致。若rom_clk在 Synopsys DC 中定义为create_clock -name rom_clk -period 1.25 [get_ports rom_clk]此处必须完全匹配否则 STA 报告不可信。4.2 Makefile 驱动统一管理多 memory 的 BIST 生成附录 F 的 Makefile 是工程化基石。增强版加入依赖检查与日志分析# Makefile —— MBIST 生成调度中心 .PHONY: all rom_bist sram8k_bist clean all: rom_bist sram8k_bist rom_bist: mkdir -p rom_bist/{script,rtl,log} mbistarchitect -bistgen -dofile rom_bist.do -logfile ./rom_bist/log/rom_bist.log -replace -nogui echo ROM BIST generated. Check log for errors: grep -i error\|fail ./rom_bist/log/rom_bist.log || echo No errors found. sram8k_bist: mkdir -p sram8k_bist/{script,rtl,log} mbistarchitect -bistgen -dofile sram8k_bist.do -logfile ./sram8k_bist/log/sram8k_bist.log -replace -nogui echo SRAM8KB BIST generated. Check log for errors: grep -i error\|fail ./sram8k_bist/log/sram8k_bist.log || echo No errors found. clean: rm -rf rom_bist sram8k_bist # 自动化依赖当 .atpg 文件更新时重新生成 rom_bist.do: ./atpg/rom.atpg sram8k_bist.do: ./atpg/sram8kb.atpg运行make rom_bist后mbistarchitect以-nogui模式后台执行日志自动存入./rom_bist/log/。真正的工程效率提升在于无需打开 GUI所有 memory 的 BIST 生成可并行触发且错误日志集中 grep 可快速定位模型定义问题。5. MBIST 诊断深度调优从fail_addr到邻居错误neighbor fault的精准定位MBIST 的终极价值不在“是否 fail”而在“哪里 fail”。Mentor mbistarchitect 默认生成的fail_addr仅指向单个失效地址但实际硅片缺陷常表现为“邻居错误”neighbor fault——即一个 cell 的翻转影响相邻 cell 的保持能力。要捕获此类缺陷必须突破默认 March 算法的覆盖盲区。5.1 邻居错误的本质与测试挑战邻居错误分为两类Coupling Fault耦合错误Cell A 的写入操作导致 Cell B 的值改变如写 A1 导致 B1Pattern-Sensitive Fault模式敏感错误仅在特定地址/数据组合下出现如0x100写0xFFFF_FFFF时0x101读出错误标准 MarchC 算法通过全地址扫描固定数据模式0/1可覆盖大部分耦合错误但对模式敏感错误无能为力。此时需启用Column March算法——它按列column而非行row遍历地址强制相邻 bit 位在不同 cycle 中被独立访问。5.2 启用 Column March 的实操步骤在sram8k_bist.scr中修改算法配置# 替换原 setup mbist algorithms MarchC setup mbist algorithms ColumnMarch # 启用列地址生成器必需 setup mbist column_address_generator -enable # 增加诊断深度记录失败时的前后地址 setup mbist diagnostic -level 2 # level 1: fail_addr; level 2: fail_addr neighbor_addr生成的*_bist.v将包含额外逻辑当检测到错误时不仅锁存当前addr_cnt还保存addr_cnt-1和addr_cnt1的值。在 testbench 中可验证// 注入邻居错误写地址 0x100 为 0xFFFFFFFF导致地址 0x101 的 bit[0] stuck-at-0 initial begin #100; mem[256] 32hFFFFFFFF; // 写 0x100 mem[257] 32h0000_0000; // 初始化 0x101 #10; // 触发 ColumnMarch先访问列 0所有地址 bit[0]0再列 1... // 当访问 0x100bit[0]0时其写操作污染 0x101bit[0]1的保持能力 // 后续读 0x101 将返回 0x0000_0000错误fail_addr 257, neighbor_addr 256 end5.3 诊断结果解析从fail_addr到物理失效定位生成的 testbench 运行后*_bist_tb.v会输出类似日志BIST FAIL at address 0x101 (dec 257) Neighbor address: 0x100 (dec 256) Expected data: 0xFFFFFFFF Actual data: 0x00000000 Failure type: Coupling Fault (write A affects B)此信息可直接输入到物理验证工具如 Cadence PVS中结合 layout 查看0x100与0x101在版图上的物理距离。若二者间距小于工艺规则要求的最小 spacing如 0.18um 工艺下 0.2um即可锁定为制造缺陷而非设计问题。提示Column March 的测试时间比 MarchC 增长约 30%需权衡测试时间与良率提升。建议仅对高风险 memory如 cache tag array启用。本文还有配套的精品资源点击获取
返回列表