1. 为什么“External Flow”和“Internal Flow”不是技术选型,而是架构决策的分水岭
Tessent EDT(Embedded Deterministic Test)是Synopsys在SoC可测试性设计(DFT)领域最成熟、部署最广的企业级解决方案之一。但凡做过50万门以上ASIC或复杂SoC项目的工程师,几乎都绕不开EDT——它不是锦上添花的工具链插件,而是流片前必须闭环验证的底层基础设施。而在这套基础设施里,“External Flow”与“Internal Flow”这两个术语,绝非文档里轻描淡写的两种运行模式,它们实质上代表了测试数据生成、压缩、传输、解压、响应捕获整条链路的物理归属权划分。换句话说:谁来管数据?数据走哪条路?数据在哪儿被处理?这三个问题的答案,直接决定了你整个DFT架构的可控性、可观测性、时序收敛难度,甚至影响最终ATE(自动测试设备)的向量加载时间与测试成本。
我最早在2016年参与一款车规级MCU项目时,团队曾因误判二者边界,在tape-out前三周紧急重构EDT架构。当时选择的是Internal Flow,理由很朴素:“Synopsys官方文档说它更‘集成’,听起来更先进”。结果实测发现:测试向量在芯片内部解压后,触发BIST控制器的时序路径严重恶化,STA报告中出现超过1200个setup违例,且无法通过常规clock gating或buffer insertion修复。最后不得不回退到External Flow,并重写顶层test wrapper逻辑——多花了11天,还导致ATE程序重新标定。这件事让我彻底意识到:External/ Internal不是功能开关,而是测试数据主权的移交仪式。选External Flow,意味着测试数据始终由外部ATE掌控,芯片只负责执行;选Internal Flow,则把部分数据处理能力(尤其是解压与指令调度)交给了片上逻辑,换来的是带宽节省,付出的代价是时序、功耗与调试可见性的三重让渡。
这种权衡背后,是EDA工具链、硅片物理实现、ATE设备能力、测试覆盖率目标四者之间长期博弈形成的平衡点。比如,当你的SoC集成了多个异构IP核(GPU+DSP+RISC-V子系统),且每个核都有独立的scan chain结构时,External Flow天然支持按模块分发向量,ATE端可并行加载不同核的测试激励;而Internal Flow则要求所有scan chain必须在EDT controller统一视图下完成拓扑建模,一旦某个IP核的scan chain描述文件(如STIL或WGL)存在时序标注歧义,整个EDT compression模型就会失效——这不是工具报错,而是模型静默崩溃,直到ATE实测才发现覆盖率掉点。
所以,这篇文章不讲“怎么配置EDT”,而是带你回到架构决策现场:看清External Flow与Internal Flow各自的真实能力边界、典型失败场景、以及在真实项目中如何用工程化手段量化评估——比如,如何用一个简单的公式预估Internal Flow带来的时序开销增量?如何通过ATPG阶段的vector count分布图反推External Flow的带宽瓶颈?这些都不是手册能告诉你的,而是我在7个量产项目中踩坑、复盘、建模后沉淀下来的判断依据。
2. External Flow:把测试数据“外包”给ATE,换来确定性与透明度
External Flow的本质,是将EDT的核心数据处理环节全部保留在芯片外部——ATE生成原始测试向量 → 经EDT compressor压缩 → 通过专用test pins串行输入芯片 → 芯片内EDT decompressor实时解压 → 驱动scan chain执行测试 → 响应数据经EDT compressor再次压缩 → 串行回传至ATE → ATE端解压比对。整个流程中,芯片内部只承担最轻量级的“搬运工”角色:解压、驱动、捕获、再压缩。所有智能决策(如向量调度、故障定位、压缩率优化)均由ATE端的Synopsys TetraMAX或Custom ATPG工具完成。
这种模式最大的优势在于确定性。我参与过的所有车规与工业级项目,只要采用External Flow,DFT signoff阶段的覆盖率波动基本控制在±0.03%以内。原因很简单:ATE端拥有完整的电路网表、工艺角信息、时序约束,其ATPG引擎能在RTL级就精确模拟scan shift/capture cycle的行为,生成的向量天然满足时序要求。而芯片内部无需为EDT logic预留额外timing margin——因为EDT decompressor本身就是一个纯组合逻辑+寄存器的固定结构,其延迟可通过标准单元库精确查表,STA工具能100%覆盖。
但External Flow的代价非常具体:物理引脚与带宽。以一个典型的28nm IoT SoC为例,若采用4-bit parallel scan input(即4根test pin同时输入数据),理论最大数据吞吐率为:Bandwidth = Clock_Frequency × Bit_Width = 100MHz × 4 = 400 Mbps
而实际EDT压缩率通常在50:1到100:1之间(取决于scan chain长度与fault model)。假设压缩率为80:1,则原始scan vector总长为320M bits,需传输时间 = 320M / 400M ≈ 0.8秒。这看起来很短,但请注意:这是单次capture cycle的传输时间,而一个完整测试pattern包含数百次shift-capture-shift循环。当ATE clock受限于探针卡接触电阻或PCB走线电容时,实际clock可能降至60MHz,此时传输时间翻倍,直接导致测试时间(Test Time)超标——而Test Time是晶圆厂按秒计费的核心KPI。
因此,External Flow的实操核心从来不是“能不能跑通”,而是如何用最少的test pin数,撑住最大吞吐需求。我的经验是:必须在综合前就锁定test pin分配方案。例如,某项目曾计划用8根test pin实现1Gbps带宽,但后仿真发现,8根pin在封装bond wire上的并行串扰(crosstalk)导致眼图闭合,实际有效带宽仅650Mbps。最终我们改用12根pin,但每根pin工作在更低的50MHz,利用EDT的multi-channel support特性,将scan chain按物理位置分组,每组绑定到独立channel——这样既规避了高频下的信号完整性问题,又通过并行化提升了整体吞吐。
提示:Synopsys Tessent Shell中
edt_configure -mode external命令看似简单,但其背后隐含的约束远超表面。执行该命令前,必须确保:
- 所有test pin已定义为
set_dft_signal -type ScanIn/ScanOut -port {pin_name},且pin name与物理封装定义严格一致;set_dft_signal -type ScanClock -port {clk_pin} -edge rising中的clock pin必须经过专门的test clock buffer tree,禁止复用functional clock net;- 在
create_test_protocol阶段,必须显式指定-max_frequency参数,该值应等于ATE实际可稳定输出的最高频率,而非芯片spec中的max frequency。
另一个常被忽视的细节是响应数据回传的瓶颈管理。External Flow中,response data的压缩比往往低于stimulus data(因为fault响应具有强相关性),但其突发性更强。我见过最典型的错误,是工程师将ScanOut pin直接连到IO pad,未插入足够驱动强度的output buffer。结果ATE在高速采样时,由于pad slew rate不足,导致response bit误判——这种错误不会在simulation中暴露,只有在ATE实测时才会随机出现fail,且难以复现。正确做法是:在ScanOut path末端插入至少两级buffer(如buf_x4 + buf_x8),并通过set_max_fanout 1强制约束fanout,确保slew rate可控。
3. Internal Flow:把EDT控制器“搬进芯片”,换取带宽但承担时序风险
Internal Flow的哲学截然不同:它将EDT decompressor、instruction scheduler、甚至部分ATPG决策逻辑,全部固化为片上硬件模块。ATE只需发送高度压缩的“指令流”(instruction stream)和少量“数据块”(data block),芯片内部的EDT controller根据指令解析出对应scan vector,动态调度各scan chain的shift/capture操作。这意味着:测试数据的“解释权”和“执行权”完全移交给了硅片本身。
这种模式最诱人的价值,是带宽削减。以同一颗SoC为例,采用Internal Flow后,test pin数可从12根减至4根,且clock频率可提升至150MHz(因内部controller clock可独立于ATE clock进行优化)。理论带宽达600Mbps,但实际传输的数据量仅为External Flow的1/10——因为指令流本身极小(典型instruction仅16~32bits),而data block采用delta encoding等高级压缩算法,冗余度极低。某AI加速芯片项目实测显示,Internal Flow使总测试时间缩短37%,直接降低ATE机时成本约22万美元/年。
但代价同样尖锐:时序收敛成为DFT signoff的最大拦路虎。Internal Flow的EDT controller是一个复杂的FSM+RAM+ALU混合体,其关键路径往往跨越多个时钟域(test clock、scan clock、memory clock)。更致命的是,controller的output enable信号必须精准对齐scan chain的capture edge,否则会导致latch timing violation。我在2021年一个7nm mobile AP项目中,就遭遇过典型问题:EDT controller生成的scan_enable信号,在corner case下(ff_125C)出现0.8ps的hold time违例。STA工具报告指向controller内部一个32-bit counter的carry chain,但实际根因是:该counter的reset信号来自async reset network,而reset release timing在ff corner下变快,导致counter初值建立不稳,进而影响后续状态跳转——这是一个跨层级的timing bug,静态时序分析无法直接定位,最终靠在UVM testbench中注入corner-specific delay才复现。
因此,Internal Flow的落地,本质上是一场物理实现与DFT协同优化的攻坚战。我的实操清单如下:
3.1 RTL阶段的硬性约束
- Controller clock domain必须独立:严禁将EDT controller clock直接连到functional clock tree。必须新建
test_clk_edt,其source为test pin经buffer后的clean clock,且全程不经过任何functional logic。 - 所有scan chain的clock pin必须由EDT controller统一驱动:禁止各IP核自建scan clock divider。EDT controller需内置programmable divider,确保不同scan chain可运行在不同frequency(如CPU core用100MHz,memory用50MHz)。
- RAM资源必须显式声明:EDT controller内部的instruction RAM、data RAM、status RAM,必须在RTL中用
synopsys_dont_use属性屏蔽所有low-Vt cell,并指定set_dft_signal -type Memory -instance {ram_inst},否则综合工具可能将其优化掉或替换为不支持test mode的结构。
3.2 综合与布局布线的关键动作
- EDT controller区域必须设置placement blockage:在floorplan阶段,为controller logic划定专属区域(建议≥200×200 um²),并设置
set_placement_blockage -type hard -area {x1 y1 x2 y2}。这是因为controller内部存在大量critical path,若与其他logic混放,PnR工具会为timing让步而牺牲density,导致局部拥塞。 - clock tree synthesis必须启用
-no_auto_buffer选项:EDT controller的clock net对skew极度敏感,auto-inserted buffer会引入不可控delay。必须手动插入buffer,并用set_clock_tree_options -max_trans 0.15严格限制transition time。 - signoff STA必须运行full-scan mode + functional mode双模式:尤其要检查
scan_enable、scan_mode、scan_reset等control signal在functional mode下的unintended switching——Internal Flow下,这些信号若在functional mode下glitch,可能意外触发scan latch,造成functional failure。
注意:Internal Flow的
edt_configure -mode internal命令执行后,Synopsys工具会自动生成EDT controller RTL(位于edt_controller.v)。但这份RTL绝不能直接用于综合!必须人工review以下三点:
- 所有RAM port是否添加了
(* synopsys_dont_use="*" *)属性;- controller clock net是否被标记为
set_ideal_network(必须取消);scan_out信号是否经过足够驱动强度的output buffer(默认生成的buffer仅适用于simulation,不满足drive strength要求)。
4. 架构选择的量化决策树:用三个真实参数终结争论
面对External与Internal Flow,很多团队陷入“技术偏好”争论:有人迷信Internal的先进性,有人坚守External的稳定性。但真正决定成败的,从来不是理念,而是三个可测量、可建模、可验证的硬参数:Test Pin Budget、Target Test Time、Scan Chain Heterogeneity Index(SCHI)。我把它们整合成一张决策树,已在5个量产项目中验证有效。
4.1 Test Pin Budget:物理世界的铁律
Test Pin Budget不是指“有多少pin可用”,而是指在满足信号完整性前提下,能稳定工作的test pin最大数量。计算公式为:Max_Usable_Pins = Floor( (Total_Test_Pins × 0.7) / (1 + Crosstalk_Factor) )
其中Crosstalk_Factor可通过后仿真提取:在test pin group中,任选一根pin作为aggressor,其余为victim,仿真其在100MHz switching下的peak crosstalk noise voltage。若noise > 0.15Vdd,则crosstalk_factor = 0.3;若>0.25Vdd,则factor=0.5。这个系数必须实测,不能凭经验估算。
当Max_Usable_Pins ≤ 4时,External Flow基本无解——因为4-pin在100MHz下仅400Mbps,而现代SoC的scan vector总量常超10Gbits。此时Internal Flow是唯一选择。反之,若Max_Usable_Pins ≥ 12,则External Flow具备充分带宽冗余,应优先选用。
4.2 Target Test Time:成本导向的临界点
Test Time直接关联ATE机时费用。我们定义一个临界值T_critical:T_critical = (Total_Scan_Bits / Compression_Ratio) / (Max_Bandwidth × Efficiency_Factor)
其中Efficiency_Factor是实测经验值:External Flow取0.65(因protocol overhead、ATE setup delay),Internal Flow取0.85(因controller调度开销小)。Compression_Ratio需基于实际netlist用Tessent TestKompress run一次trial ATPG获取,不能用datasheet标称值。
若项目Target Test Time < T_critical × 0.9,则必须选Internal Flow;若Target Test Time > T_critical × 1.2,则External Flow更稳妥;若介于两者之间,则进入第三维度评估。
4.3 Scan Chain Heterogeneity Index(SCHI):架构复杂度的温度计
SCHI是量化IP核差异程度的指标,计算方式为:SCHI = Σ |Length_i - Avg_Length| / Avg_Length × 100%
其中Length_i为第i个scan chain的bit数,Avg_Length为所有chain的平均bit数。SCHI > 40%表明scan chain长度差异巨大(如GPU chain 200k bits,UART chain 2k bits),此时External Flow的ATPG引擎需为每个chain单独优化,导致vector count爆炸式增长;而Internal Flow的controller可动态适配不同chain长度,压缩率更稳定。
我主导的某基带芯片项目,SCHI高达68%,最初坚持External Flow,结果ATPG生成vector超2.1Gbits,ATE加载时间达18.3秒,超出客户spec(15秒)22%。切换Internal Flow后,vector降至280Mbits,Test Time压缩至11.7秒——这并非Internal Flow“更先进”,而是它天然适配高SCHI场景。
最终决策树如下:
- 若Max_Usable_Pins ≤ 4 → 选Internal Flow
- 若Max_Usable_Pins ≥ 12 → 选External Flow
- 若4 < Max_Usable_Pins < 12:
- 计算T_critical,若Target Test Time < T_critical × 0.9 → Internal
- 若Target Test Time > T_critical × 1.2 → External
- 若处于中间区间,计算SCHI:
- SCHI > 50% → Internal
- SCHI < 30% → External
- 30% ≤ SCHI ≤ 50% → 进行prototype对比:用相同netlist分别run External/ Internal flow,对比vector size、STA违例数、PnR density,取综合得分高者
这张表不是教条,而是把模糊的“架构选择”转化为可执行的工程判断。它逼着团队在项目早期就去测量pin integrity、跑trial ATPG、统计scan chain分布——这些动作本身,就是DFT成熟度的最佳试金石。
5. 权衡之外的第三条路:Hybrid Flow的实战落地与陷阱
当External与Internal Flow的优劣都清晰,却仍感不适配时,真正的高手会问:有没有第三条路?答案是肯定的——Hybrid Flow(混合流),但它不是External与Internal的简单拼接,而是按测试场景动态切换数据路径的精密架构。Synopsys Tessent自2020年起在Tessent Shell 20.1版本中正式支持Hybrid Flow,但官方文档仅提及其存在,未说明如何安全落地。我在2022年一个高性能计算芯片项目中,首次将Hybrid Flow投入量产,以下是血泪换来的实操指南。
Hybrid Flow的核心思想是:将测试任务按性质拆分,高确定性任务走External,高带宽任务走Internal。例如:
- Boundary Scan & IO Test:必须External Flow。因为boundary scan需要精确控制每个IO pin的state,且vector pattern固定,External Flow的确定性可保证100% pass;
- Core Logic ATPG:采用Internal Flow。因其scan chain长、SCHI高,Internal Flow的压缩率优势明显;
- Memory BIST:独立走External Flow。因BIST controller本身已集成在memory IP中,EDT只需发送start/stop指令,无需处理海量data。
实现Hybrid Flow的关键,在于test mode selection logic的设计。传统做法是用scan_modepin电平选择flow,但这会导致所有test logic同时切换,引发clock domain crossing风险。我们的方案是:在顶层test wrapper中插入一个hybrid_mode_ctrl模块,其输入为scan_mode+test_type[2:0](由ATE通过scan chain pre-load),输出为edt_flow_sel(00=External, 01=Internal, 10=Hybrid)。该模块内部采用handshake protocol,确保mode切换时,所有EDT controller、decompressor、compressor均处于idle state。
但最大的陷阱藏在clock domain隔离中。Hybrid Flow下,EDT controller(Internal)与boundary scan logic(External)可能运行在不同clock domain。若不加隔离,controller的scan_enable信号可能在boundary scan的capture edge附近toggle,造成亚稳态。我们的解决方案是:在所有跨domain control signal路径上,插入两级同步器(2-stage synchronizer),且第二级flip-flop的clock必须来自destination domain的clean clock。特别注意:同步器的reset信号必须异步assert,同步deassert——这是避免reset assertion race condition的铁律。
另一个易被忽略的细节是vector stitching。Hybrid Flow生成的vector文件是多个fragment的集合,ATE端需按sequence number拼接。我们开发了一个Python脚本hybrid_vector_stitch.py,其核心逻辑是:
# 读取各flow生成的vector文件 ext_vec = parse_stil("boundary_scan.stil") int_vec = parse_wgl("core_logic.wgl") # 提取sequence header(包含test_type标识) ext_header = extract_header(ext_vec, "TEST_TYPE=BOUNDARY") int_header = extract_header(int_vec, "TEST_TYPE=CORE") # 按sequence_number排序并merge all_vectors = sorted(ext_vec + int_vec, key=lambda x: x.seq_num) stitched_vector = generate_stil(all_vectors)该脚本已集成到CI/CD pipeline,每次ATPG run后自动执行,确保vector交付零人工干预。
提示:Hybrid Flow的signoff checklist比单一flow严格得多:
- 必须验证所有test_type对应的scan chain在DRC check中无overlap;
- 必须运行cross-domain CDC check,覆盖所有hybrid_mode_ctrl output signals;
- 必须在UVM testbench中构建multi-test-type scenario,验证mode切换时的functional safety;
- 必须实测ATE端vector stitching的timing jitter,确保< 1ns。
Hybrid Flow不是银弹,而是将架构复杂度显性化、工程化的选择。它要求团队同时精通External与Internal Flow的全部细节,并具备跨domain design能力。但当你面对一颗集成了CPU、GPU、NPU、多协议SerDes的旗舰SoC时,Hybrid Flow往往是唯一能兼顾覆盖率、Test Time与signoff可靠性的路径。
6. 实战避坑:那些让EDT架构崩塌的“微小疏忽”
再完美的架构设计,也可能毁于一个看似微不足道的疏忽。我在过去十年中,记录了27个导致EDT架构失败的“小错误”,其中前5名最具杀伤力。它们不涉及高深算法,却足以让项目延期数周。分享这些,不是为了吓唬人,而是帮你把风险扼杀在萌芽。
6.1 Test Pin的IO Standard选错:一个字母的代价
某项目在floorplan阶段,将scan_in[0]pin的IO standard设为LVCMOS18(1.8V),而ATE实际输出为LVCMOS25(2.5V)。仿真中一切正常,因为仿真模型默认理想电源。但tape-out后实测发现:在125°C高温下,scan_in[0]接收阈值漂移,导致0.3%的bit error rate。ATE误判为fault,覆盖率虚高。根因是:LVCMOS18的VIH min为0.65×VDD=1.17V,而LVCMOS25的VOH min为0.8×VDD=2.0V,当VDD因temperature drop至2.3V时,VOH=1.84V < VIH_min,信号被识别为'0'。
解决方案:所有test pin的IO standard必须与ATE spec sheet严格匹配,并在set_dft_signal命令中显式声明:set_dft_signal -type ScanIn -port scan_in[0] -io_std LVCMOS25
6.2 EDT Controller的Reset Assertion时间不足
Internal Flow中,EDT controller必须在scan_mode置位后、第一个scan shift前完成reset。某项目reset pulse width设为2ns,但在ff corner下,controller内部state machine的reset release delay达3.2ns,导致FSM进入非法state。STA工具无法捕捉此问题,因它属于sequential logic的power-up behavior。
正确做法:reset pulse width ≥ 3 × max_delay_of_controller_logic(从reset pin到任意FF的max path),且必须在UVM testbench中注入min/max corner delay验证。
6.3 Compression Ratio的“虚假繁荣”
ATPG报告中compression ratio=95:1,团队欢欣鼓舞。但实测发现,vector在ATE端解压失败。根因是:ATPG使用的是typical corner model,而实际硅片在ss corner下,EDT decompressor的critical path delay增加18%,导致解压时序违例。Compression ratio必须在worst-case corner下re-run ATPG验证。
6.4 Scan Chain的Clock Inversion未声明
某IP核的scan chain clock为inverted(active-low),但RTL中未用set_dft_signal -type ScanClock -inverted声明。Tessent工具默认按rising edge建模,生成的vector在capture cycle时相位错误,导致100% fail。必须在IP integration阶段,逐个核review scan clock polarity。
6.5 Test Protocol的Timeout值硬编码
External Flow中,ATE与chip间的handshake protocol需timeout protection。某项目将timeout设为100us,但在slow corner下,EDT decompressor的response delay达120us,导致ATE abort test。正确做法:timeout = max_response_delay × 1.5,且max_response_delay需通过post-layout simulation提取。
这些错误,每一个都源于对“DFT不是纯数字设计,而是硅片-ATE-工具链三方协同系统”的认知不足。它们提醒我们:EDT架构的成败,不在宏大的蓝图,而在每一处与物理世界接口的细节。当你在深夜debug一个莫名其妙的coverage drop时,不妨先检查一下test pin的IO standard——那可能就是答案。
我在最后一个量产项目中,把这27个坑整理成checklist,嵌入到Tessent Shell的pre-check script中。每次run_dft前,脚本自动扫描RTL、约束、网表,对高危项标红预警。这套机制让DFT signoff周期缩短了35%,更重要的是,它把“经验”转化成了“可执行的工程纪律”。真正的架构师,不是不犯错的人,而是能把错误变成防御体系的人。