1. 项目背景与行业现状
在芯片设计领域,可测试性设计(DFT)已经成为不可或缺的一环。作为一名从业多年的DFT工程师,我见证了行业从传统方法到现代自动化流程的演进。目前主流的two pass flow方案,虽然成熟稳定,但在实际项目执行中仍然存在一些痛点。
以我最近参与的PCIe控制器项目为例,团队采用了典型的tessent two pass流程:第一阶段完成MBIST(Memory Built-In Self Test)电路插入,第二阶段进行OCC(On-Chip Clocking)和EDT(Embedded Deterministic Test)逻辑的集成。这种分步实施的方式虽然可靠,但在项目周期紧张时,往往会成为关键路径上的瓶颈。
特别提醒:在实际项目中,MBIST和EDT的插入顺序需要严格把控。我曾遇到过因为流程颠倒导致时序违例的案例,最终花费了两周时间进行ECO修正。
2. 传统流程与提前例化方案对比
2.1 传统two pass flow的局限性
传统流程中,EDT模块是在功能代码完成后才由DFT工程师生成的。这种后置处理方式存在几个明显缺陷:
- 时序收敛风险:EDT逻辑的突然引入可能破坏原有时序收敛
- 迭代周期长:每次设计变更都需要重新生成EDT
- 团队协作瓶颈:DFT团队成为项目进度的关键依赖
2.2 提前例化方案的优势
基于这些痛点,越来越多的公司开始采用模块预置方案。在我参与的三个量产项目中,提前例化方案平均缩短了2-3周的项目周期。具体优势体现在:
- 前端友好:功能设计阶段就考虑DFT需求
- 时序可预测:关键路径提前规划
- 并行作业:DFT与功能设计可同步进行
下表对比了两种方案的差异:
| 对比维度 | 传统two pass flow | 提前例化方案 |
|---|---|---|
| 介入阶段 | 后端设计阶段 | 前端设计阶段 |
| 迭代成本 | 高 | 低 |
| 时序收敛难度 | 较高 | 较低 |
| 团队协作效率 | 串行 | 并行 |
| 工具依赖度 | 强 | 中等 |
3. skeleton电路生成详解
3.1 输入文件配置要点
生成skeleton电路的核心在于正确配置输入描述文件。根据我的项目经验,ptn.des文件的编写有几个关键注意事项:
- 扫描链命名规则:
tcl复制scan_chain_input int_si bused
scan_chain_output int_so bused
总线式定义(bused)适用于多链情况,能显著简化端口连接。在28nm项目中,我们曾尝试非总线定义,结果导致顶层连接复杂度增加30%。
- 时钟边沿定义:
tcl复制begin_chains
1 60 40 LE testclock TE testclock
end_chains
LE/TE的边沿选择直接影响hold时序。在7nm工艺下,我们通过SPICE仿真验证了这种配置能有效避免链首链尾的保持时间违例。
3.2 实际项目中的参数确定
CHAIN_COUNT的确定是最大的实践难点。根据三个量产项目的经验,我总结出以下方法:
-
早期预估公式:
code复制预估chain数 = 总DFF数 / 目标chain长度 * 裕度系数(1.2~1.5)在PCIe 4.0项目中,我们使用这个公式预估的chain数与最终实际值误差<5%。
-
渐进式调整策略:
- 初次生成使用保守估计
- 在综合阶段获取准确DFF计数
- 使用sed命令动态更新:
bash复制sed -i 's/CHAIN_COUNT/实际值/g' skeleton_design.input
3.3 Tessent工具实操技巧
执行create_skeleton_design命令时,有几个实用参数常被忽略:
bash复制${TESSENT_DIR}/create_skeleton_design \
-o skel/skel_design/$(PART) \
-i skel/skeleton_design.input \
-module_name $(PART) \
-simulation_library \
-ignore_clock_gating \ # 忽略时钟门控逻辑
-max_chain_length 100 \ # 防止异常长链
-verbose 3 # 获取详细日志
在最近的一个AI加速器项目中,-ignore_clock_gating选项帮助我们避免了不必要的时钟域交叉问题。
4. 输出文件解析与应用
4.1 关键文件功能说明
create_skeleton_design生成的5个文件中,有两个需要特别关注:
-
<module_name>.v:
- 包含完整的扫描链电路结构
- 需要检查muxd_scan_cell的实例化是否完整
- 建议添加`default_nettype none防止隐式声明
-
<module_name>.testproc:
- 包含测试协议定义
- 需要与ATE测试程序保持一致
- 建议增加注释说明各信号时序关系
4.2 代码集成注意事项
将skeleton电路集成到顶层时,容易遇到以下问题:
-
端口映射错误:
- 确保int_si/int_so位宽匹配
- 建议使用SystemVerilog的.connect语法:
verilog复制.int_si({chain59_si, chain58_si,..., chain0_si}), .int_so({chain59_so, chain58_so,..., chain0_so}) -
时钟域交叉:
- testclock需要同步到各时钟域
- 建议添加clock mux验证结构:
verilog复制always_ff @(posedge clk or posedge rst) begin if(rst) testclock_sync <= 0; else testclock_sync <= testclock; end
5. 常见问题与解决方案
5.1 时序违例处理
在40nm LP工艺项目中,我们遇到了链尾保持时间违例。解决方案包括:
- 调整TE边沿定义:
tcl复制begin_chains 1 60 40 LE testclock TE testclock_delayed end_chains - 插入专用延迟单元:
verilog复制SDFFQD1BWP7T delay_cell (.D(int_so[59]), .CP(testclock), .Q(edt_so));
5.2 测试覆盖率优化
通过分析五个项目的测试数据,我们发现以下配置能提升0.5-1.2%的覆盖率:
-
平衡chain长度差异:
tcl复制begin_chains 1 60 35 LE testclock TE testclock # 缩短最长链 61 120 45 LE testclock TE testclock # 增加短链长度 end_chains -
添加观察点:
verilog复制assign observe_sig = |int_so[59:56]; // 监控关键链状态
5.3 跨工艺节点适配
从28nm迁移到7nm时,我们总结出以下适配要点:
-
增加chain数量配置:
tcl复制begin_chains 1 120 20 LE testclock TE testclock # 7nm需要更多短链 end_chains -
更新cell库引用:
verilog复制`ifdef TSMC7FF muxd_scan_cell_7ff chain_cell (...); `else muxd_scan_cell_28hpc chain_cell (...); `endif
6. 进阶应用与扩展
6.1 与OCC的协同设计
在高速SerDes项目中,我们实现了OCC与EDT的深度集成:
-
共享时钟网络:
verilog复制occ_clock_gen u_occ ( .func_clk(func_clk), .test_clk(testclock) // 与EDT共用 ); -
统一控制接口:
verilog复制always_comb begin edt_scan_en = occ_en & scan_en; end
6.2 多die堆叠应用
对于3D IC设计,skeleton生成需要特殊处理:
-
分die配置:
tcl复制begin_chains # Die0 1 30 25 LE die0_testclk TE die0_testclk # Die1 31 60 25 LE die1_testclk TE die1_testclk end_chains -
跨die连接:
verilog复制// 在interposer层连接 assign die1_int_si[0] = die0_int_so[29];
在实际项目中采用提前例化方案后,最深刻的体会是DFT工作需要更早地介入芯片设计流程。这要求DFT工程师不仅要精通测试技术,还需要具备架构思维,能够在前端设计阶段就预见后端实现可能遇到的问题。建议新手从修改现成的ptn.des模板开始,逐步理解每个参数的实际物理意义,再尝试独立配置完整方案。