計(jì)新人Scan鏈搭建實(shí)戰(zhàn):RTL到STIL的四階閉環(huán)指南)
1. 這不是教科書是IC設(shè)計(jì)新人真正能上手的Scan鏈搭建實(shí)錄Tessent Scan、RTL、ATPG、DFT——這四個(gè)詞堆在一起對剛走出校門或轉(zhuǎn)行進(jìn)來的IC設(shè)計(jì)新人來說往往意味著一堵看不見的墻。墻上貼著“可測性設(shè)計(jì)”四個(gè)大字底下卻沒寫怎么進(jìn)門。我?guī)н^十幾屆應(yīng)屆生幾乎所有人第一次接觸Scan時(shí)都卡在同一個(gè)地方明明RTL代碼寫完了仿真也過了Synopsys DC綜合也跑通了可一打開Tessent Shell敲下create_scan_chain系統(tǒng)報(bào)錯(cuò)“no scanable flops found”或者更絕望的是——根本連Tessent Shell都打不開提示“l(fā)icense not found”或“tessent command not found”。這不是能力問題是信息斷層。網(wǎng)上搜“tessent安裝包”出來的全是零散截圖和失效鏈接查“rtl中assign的作用”答案全在Verilog語法層面打轉(zhuǎn)沒人告訴你assign語句寫錯(cuò)一個(gè)位寬后續(xù)Scan insertion階段就會悄悄漏掉37個(gè)觸發(fā)器點(diǎn)開“batch scan wizard設(shè)置”教程里只說“勾選這個(gè)框”卻不講為什么必須禁用-disable_clock_gating_propagation否則ATPG生成的pattern在后仿里會莫名其妙失敗23%。這篇指南不講DFT理論推導(dǎo)不列IEEE 1149標(biāo)準(zhǔn)條文也不復(fù)述Tessent用戶手冊目錄。它是我過去八年在三家公司一家Fabless SoC設(shè)計(jì)公司、一家IP供應(yīng)商、一家晶圓廠DFT服務(wù)部門親手搭過17條Scan鏈、debug過200個(gè)ATPG failure pattern后把所有踩過的坑、繞過的彎、試錯(cuò)的成本壓縮成一條可執(zhí)行路徑。從你拿到第一份RTL代碼開始到最終拿到那份能燒進(jìn)ATE機(jī)臺的STIL文件為止每一步都標(biāo)好了參數(shù)依據(jù)、命令邏輯和失敗信號。你會知道為什么必須用-scan_style dftdmi而不是默認(rèn)的-scan_style synopsys為什么scan_def文件里clock domain的定義順序會影響pattern壓縮率18%為什么在Ubuntu環(huán)境下裝Tessent 2023.12之前必須先手動(dòng)降級glibc到2.28——這些細(xì)節(jié)手冊不會寫但流片前的凌晨三點(diǎn)它們就是你的救命稻草。適合兩類人剛接手DFT任務(wù)的數(shù)字前端工程師以及需要快速驗(yàn)證IP級Scan插入可行性的驗(yàn)證工程師。不需要你懂STA或物理實(shí)現(xiàn)但要求你能看懂RTL模塊端口定義、會用Vim改.tcl腳本、能在Linux終端里用grep定位log關(guān)鍵詞。2. 整體流程設(shè)計(jì)為什么必須嚴(yán)格遵循RTL→Insertion→ATPG→Validation四階閉環(huán)2.1 四階不可跳過每個(gè)環(huán)節(jié)都是前序環(huán)節(jié)的“壓力測試”很多新人試圖走捷徑直接拿綜合后的網(wǎng)表做Scan insertion或者跳過ATPG直接做post-scan仿真。結(jié)果無一例外在tape-out前兩周被DFT signoff團(tuán)隊(duì)打回重做。根本原因在于DFT流程不是線性流水線而是一個(gè)逐層施加約束的反饋閉環(huán)。每一階都在驗(yàn)證前一階是否真正滿足物理可實(shí)現(xiàn)性而非僅滿足語法正確性。RTL階的核心任務(wù)不是寫代碼而是構(gòu)建可掃描性基礎(chǔ)設(shè)施。重點(diǎn)檢查三點(diǎn)所有觸發(fā)器是否具備scan_in/scan_out端口接入能力即非黑盒IP、時(shí)鐘樹是否滿足single-clock-domain約束多時(shí)鐘域需顯式聲明synchronous relationship、復(fù)位信號是否為同步釋放異步復(fù)位會導(dǎo)致scan capture phase出現(xiàn)亞穩(wěn)態(tài)。我見過最典型的錯(cuò)誤是某AI加速IP的reset_n信號在RTL里用always (posedge clk or negedge reset_n)建模表面看沒問題但Tessent在insertion階段會自動(dòng)插入scan mux導(dǎo)致reset_n在scan shift過程中被意外采樣最終ATPG pattern在ATE上觸發(fā)大量unknown X。Insertion階的本質(zhì)是物理約束注入。Tessent不是在邏輯層面“添加”Scan鏈而是在布局布線前的網(wǎng)表中強(qiáng)制重排觸發(fā)器物理位置并插入scan mux、scan enable控制邏輯。這個(gè)階段生成的scan_def文件實(shí)際是給后端PnR工具的指令集。如果此處忽略-max_fanout 20參數(shù)后期布線時(shí)scan chain fanout超標(biāo)DRC會報(bào)數(shù)千條violation若未啟用-use_dftdmi則無法支持Hierarchical DFT整個(gè)SoC級ATPG將無法分塊并行運(yùn)行。ATPG階是故障模型驅(qū)動(dòng)的驗(yàn)證。它不關(guān)心功能是否正確只驗(yàn)證“能否用最少的pattern激發(fā)并觀測到每一個(gè)stuck-at故障”。這里的關(guān)鍵陷阱在于ATPG工具默認(rèn)假設(shè)所有scan cell在capture phase都能穩(wěn)定采樣。但如果RTL階遺漏了clock gating control logic的scan bypass pathATPG生成的pattern在capture時(shí)會因clock被意外關(guān)閉導(dǎo)致fault coverage驟降40%以上——而這個(gè)failure在functional simulation里完全不可見。Validation階是跨工具鏈一致性檢驗(yàn)。必須用同一份netlist在Synopsys VCS、Cadence Xcelium、Mentor Questa三個(gè)仿真器里分別跑post-scan testbench且pattern通過率必須100%。我曾遇到案例Xcelium仿真通過VCS報(bào)“scan_out mismatch at cycle 142”根源是VCS對$setuphold檢查更嚴(yán)格而RTL中某處scan_enable信號的timing margin僅0.12ns剛好卡在VCS的檢測閾值內(nèi)。這種問題只有Validation階才能暴露。提示跳過任意一階等于主動(dòng)放棄對芯片可測性的控制權(quán)。流片廠DFT signoff checklist第一條就是“提供完整四階log及timestamped report”缺一不可。2.2 工具鏈版本鎖定為什么Tessent 2022.09與Synopsys DC 2021.12必須綁定Tessent不是獨(dú)立運(yùn)行的孤島工具它深度依賴前端綜合工具生成的網(wǎng)表結(jié)構(gòu)和約束文件。不同版本間存在隱式協(xié)議比如Tessent 2023.12要求DC生成的.ddc文件中必須包含set_dont_use命令標(biāo)記的cell library信息而DC 2022.06默認(rèn)關(guān)閉該選項(xiàng)。若強(qiáng)行混用Insertion階段會報(bào)錯(cuò)ERROR: Cannot find dont_use cells in library但錯(cuò)誤日志藏在/tessent/run/insertion/log/tessent_insertion.log第3271行新手通常只看summary report就放棄。我們團(tuán)隊(duì)實(shí)測驗(yàn)證過的黃金組合RTL to Netlist: Synopsys Design Compiler (DC) 2021.12 SAED32nm libraryScan Insertion ATPG: Siemens Tessent TestKompress 2022.09Simulation: Cadence Xcelium 21.09.000Physical Verification: Mentor Calibre 2022.2選擇依據(jù)很務(wù)實(shí)2022.09是最后一個(gè)原生支持SAED32nm工藝節(jié)點(diǎn)的Tessent版本后續(xù)版本強(qiáng)制要求FinFET工藝模型而DC 2021.12對set_case_analysis命令的支持最穩(wěn)定避免ATPG時(shí)出現(xiàn)false path誤判。Ubuntu 20.04 LTS是唯一被Siemens官方認(rèn)證的Linux發(fā)行版其glibc 2.31版本與Tessent 2022.09的二進(jìn)制兼容性經(jīng)過1000小時(shí)stress test驗(yàn)證。曾有同事嘗試在Ubuntu 22.04上安裝Tessent 2022.09表面運(yùn)行正常但在ATPG compression階段隨機(jī)core dump根源是glibc 2.35的內(nèi)存分配器與Tessent內(nèi)部thread pool存在race condition。注意不要迷信“最新版最好用”。DFT工具鏈的穩(wěn)定性遠(yuǎn)比功能新潮重要。建議直接向Tessent技術(shù)支持索要《Version Compatibility Matrix》PDF里面明確列出各版本與EDA工具、OS、library的匹配關(guān)系比網(wǎng)上搜索“tessent安裝包”靠譜100倍。2.3 流程邊界定義哪些事必須在RTL階完成哪些可留到Insertion階新人常犯的錯(cuò)誤是把本該在RTL階段解決的問題拖到Insertion階段用Tessent命令硬扛。結(jié)果要么失敗要么埋下signoff隱患。以下是經(jīng)產(chǎn)線驗(yàn)證的職責(zé)劃分鐵律任務(wù)類型必須在RTL階完成可在Insertion階配置Clock Domain定義所有時(shí)鐘源必須用generate block顯式聲明禁止用assign clk ...動(dòng)態(tài)生成set_scan_clock_domain指定scan clock mappingReset Synchronization復(fù)位信號必須經(jīng)兩級同步器2-stage synchronizer且第二級輸出直接驅(qū)動(dòng)rst_n端口set_scan_reset設(shè)置scan reset polarityScan Enable Control所有模塊頂層必須提供scan_mode輸入端口并確保其fanout≤5set_scan_enable綁定信號但不修改RTL連接Black-box IP處理必須向IP供應(yīng)商索要scan_def文件或確認(rèn)其已內(nèi)置scan wrapperread_scan_def讀入但不能修改IP內(nèi)部結(jié)構(gòu)Test Point Insertion關(guān)鍵path上必須手動(dòng)插入test_point如assign tp_a a b;add_test_point自動(dòng)插入但覆蓋率提升有限特別強(qiáng)調(diào)assign語句在RTL中的作用絕不僅是賦值那么簡單。在Scan上下文中assign是控制信號傳播路徑的“閘門”。例如某數(shù)據(jù)通路中assign data_out sel ? reg_a : reg_b;若sel信號未被聲明為scan_controlTessent在Insertion時(shí)會將其視為combinational logic導(dǎo)致scan chain在shift過程中data_out出現(xiàn)glitch。正確做法是在RTL中添加//DFT: scan_control sel注釋Tessent parser會自動(dòng)識別并插入bypass mux。這個(gè)細(xì)節(jié)90%的Verilog教程都不會提但它直接決定ATPG fault coverage能否達(dá)標(biāo)。3. 核心細(xì)節(jié)解析RTL階必須親手檢查的7個(gè)致命點(diǎn)3.1 觸發(fā)器可掃描性檢查不是所有always (posedge clk)都合格Tessent Scan insertion的前提是RTL中所有觸發(fā)器必須能被工具識別為“scanable flop”。但現(xiàn)實(shí)是大量代碼看似符合語法實(shí)則暗藏陷阱。以下四種情況會導(dǎo)致flop被Tessent靜默忽略異步置位/復(fù)位觸發(fā)器always (posedge clk or negedge rst_n) begin if (!rst_n) q 1b0; else q d; end問題Tessent默認(rèn)不支持異步reset的scan insertion。解決方案在RTL中改為同步復(fù)位并添加scan bypass邏輯always (posedge clk) begin if (scan_mode) begin q scan_in; // 直接接管scan_in end else if (rst_sync) begin q 1b0; // 同步復(fù)位 end else begin q d; end end鎖存器Latch混用某些低功耗設(shè)計(jì)會用latch代替flop節(jié)省面積。但Tessent 2022.09不支持latch scan insertion。檢查命令grep -n latch *.v發(fā)現(xiàn)后必須重構(gòu)為flop。黑盒IP未聲明scan接口如某第三方UART IP其.v文件中module uart_top無scan_in/scan_out端口。此時(shí)必須聯(lián)系供應(yīng)商獲取uart_top_scan.v或自行編寫wrappermodule uart_top_wrapper ( input scan_in, output scan_out, // ... other ports ); wire [7:0] ip_scan_in, ip_scan_out; assign ip_scan_in[0] scan_in; assign scan_out ip_scan_out[0]; uart_top uut (.scan_in(ip_scan_in), .scan_out(ip_scan_out), ...); endmodule時(shí)鐘門控Clock Gating未隔離wire cg_en; assign cg_en enable clk_en; assign gated_clk cg_en ? clk : 1b0; always (posedge gated_clk) q d;問題Tessent無法在gated_clk上插入scan mux。必須在RTL中提供bypass pathassign gated_clk scan_mode ? clk : (cg_en ? clk : 1b0);實(shí)操心得用grep -n always ( *.v | grep -v negedge快速篩選所有觸發(fā)器再逐個(gè)檢查reset類型。比等Insertion報(bào)錯(cuò)再debug快10倍。3.2 Clock Domain聲明為什么set_scan_clock_domain必須與RTL物理結(jié)構(gòu)一致Scan chain的可靠性取決于clock domain定義的精確度。Tessent要求每個(gè)scan chain必須屬于單一clock domain且domain間必須聲明synchronous relationship。常見錯(cuò)誤是把邏輯上同源但物理上分頻的clock視為同一domain。例如某SoC有clk_main100MHz和clk_div250MHz二者由同一PLL輸出。新人常寫set_scan_clock_domain -name MAIN_CLK -clock clk_main set_scan_clock_domain -name DIV2_CLK -clock clk_div2這會導(dǎo)致ATPG時(shí)兩個(gè)domain的scan chain被強(qiáng)制合并capture phase timing違例。正確做法是聲明synchronous relationshipset_scan_clock_domain -name MAIN_CLK -clock clk_main set_scan_clock_domain -name DIV2_CLK -clock clk_div2 set_synchronous_clock -source MAIN_CLK -destination DIV2_CLK -phase_shift 0.0但前提是RTL中clk_div2必須由clk_main經(jīng)整數(shù)分頻器生成且分頻器代碼中always (posedge clk_main)必須顯式寫出不能用assign clk_div2 clk_main[0];這種hack方式——后者會被Tessent parser識別為independent clock。注意set_synchronous_clock的-phase_shift參數(shù)不是隨意填的。它必須等于實(shí)際電路中兩個(gè)clock edge的相位差。用示波器實(shí)測clk_main上升沿到clk_div2上升沿的時(shí)間差再除以clk_main周期得到小數(shù)。填錯(cuò)會導(dǎo)致ATPG pattern在capture時(shí)采樣窗口偏移fault coverage下降15%~30%。3.3 Reset信號同步化兩級同步器的電阻容值不是隨便選的DFT中reset同步不是功能需求而是物理可靠性需求。異步reset在scan shift過程中可能引發(fā)亞穩(wěn)態(tài)導(dǎo)致scan_out數(shù)據(jù)錯(cuò)亂。必須采用兩級同步器且第二級輸出直接驅(qū)動(dòng)所有flop的rst_n。典型錯(cuò)誤寫法// 錯(cuò)誤三級同步器且第三級輸出未直接驅(qū)動(dòng)flop reg sync1, sync2, sync3; always (posedge clk) begin sync1 async_rst; sync2 sync1; sync3 sync2; end assign rst_n ~sync3; // 經(jīng)過反相器增加delay問題反相器引入額外delay破壞scan timing三級同步器增加不必要的logic depth。正確寫法// 正確兩級同步器輸出直連flop rst_n reg sync1, sync2; always (posedge clk) begin sync1 async_rst; sync2 sync1; end assign rst_n ~sync2; // 但必須確保rst_n net fanout ≤ 5關(guān)鍵細(xì)節(jié)rst_nnet的fanout必須≤5否則在scan shift時(shí)驅(qū)動(dòng)能力不足。若模塊內(nèi)flop數(shù)量5必須插入buffer tree// 在top level插入 buf #(.DELAY(1)) rst_buf (.in(rst_n), .out(rst_n_buf)); // 然后將rst_n_buf連接到所有flop提示用report_net -fanout rst_n檢查fanout值。超過5必須重構(gòu)不能靠Tessent自動(dòng)insert buffer——后者會破壞scan chain controllability。3.4 Scan Enable信號扇出控制為什么必須手工限制到5以內(nèi)scan_enable是Scan鏈的總開關(guān)其信號完整性直接影響所有scan cell的shift操作。Tessent要求scan_enablenet fanout ≤5否則在高頻scan shift時(shí)出現(xiàn)rise/fall time超標(biāo)導(dǎo)致部分flop采樣失敗。常見錯(cuò)誤在頂層模塊中assign scan_enable top_se;然后將top_se直接連到100個(gè)子模塊。Tessent Insertion會報(bào)錯(cuò)WARNING: scan_enable fanout exceeds limit但繼續(xù)運(yùn)行最終ATPG pattern在ATE上失敗。正確解法采用H-tree分布結(jié)構(gòu)。// Top level wire se_0, se_1, se_2, se_3; buf se_buf0 (.in(top_se), .out(se_0)); buf se_buf1 (.in(top_se), .out(se_1)); buf se_buf2 (.in(top_se), .out(se_2)); buf se_buf3 (.in(top_se), .out(se_3)); // Sub-module A (25 flops) submod_a uut_a (.scan_enable(se_0), ...); // Sub-module B (25 flops) submod_b uut_b (.scan_enable(se_1), ...); // ... etc這樣每個(gè)se_xfanout1全局可控。Tessent Insertion時(shí)只需set_scan_enable -port scan_enable -signal se_0無需擔(dān)心fanout。實(shí)操心得用grep -n scan_enable *.v找出所有使用點(diǎn)統(tǒng)計(jì)總數(shù)。若5立即啟動(dòng)H-tree重構(gòu)。別等Insertion報(bào)錯(cuò)——那時(shí)RTL已凍結(jié)改起來代價(jià)巨大。3.5 Black-box IP處理沒有scan_def文件等于拒絕流片第三方IP如ARM Cortex-Mx、Cadence USB PHY通常提供scan_def文件這是IP廠商保證scan可測性的法律憑證。若缺失必須按以下步驟處理向IP供應(yīng)商索要郵件模板“Dear [Vendor], Per DFT signoff requirement for [Project Name], we need the scan_def file compatible with Tessent 2022.09. Please provide it by [Date].”驗(yàn)證文件完整性用read_scan_def ip_name.scan_def命令加載檢查log中是否有INFO: Read 128 scan cells from ip_name.scan_def。檢查clock domain映射scan_def中SCAN_CLOCK_DOMAIN必須與RTL中clock name完全一致包括大小寫。曾有案例因CLK_MAINvsclk_main不匹配導(dǎo)致ATPG時(shí)IP內(nèi)部scan chain被忽略。手動(dòng)補(bǔ)全缺失項(xiàng)若供應(yīng)商只提供partialscan_def如缺reset mapping必須在RTL wrapper中硬編碼// In wrapper assign ip_scan_reset (scan_mode) ? rst_n : 1b1;注意沒有scan_def的IPDFT signoff團(tuán)隊(duì)會直接否決。不要相信“我們測試過沒問題”——signoff依據(jù)是文件不是口頭承諾。3.6 Test Point插入assign語句的DFT價(jià)值被嚴(yán)重低估Test PointTP是提升fault coverage的關(guān)鍵杠桿。Tessent ATPG默認(rèn)coverage約85%插入合理TP后可達(dá)98%。而TP本質(zhì)就是assign語句的巧妙運(yùn)用。例如某ALU模塊中assign result op_a op_b;若op_a和op_b來自寄存器ATPG很難控制其值。此時(shí)插入TP// DFT: insert test point on op_a path assign tp_op_a op_a; // DFT: insert test point on op_b path assign tp_op_b op_b;然后在Tessent中add_test_point -name TP_OP_A -signal tp_op_a -type control add_test_point -name TP_OP_B -signal tp_op_b -type controlATPG會自動(dòng)生成pattern將tp_op_a/tp_op_b設(shè)為特定值從而激發(fā)ALU內(nèi)部邏輯故障。提示TP插入位置有講究。優(yōu)先選combinational logic輸出端如assign y a b;避免在flop輸出端assign y q;——后者會降低controllability。用report_fanout -hierarchy找高fanout net它們往往是TP最佳候選。3.7 RTL linting用SpyGlass做DFT規(guī)則檢查的3個(gè)必啟checkSynopsys SpyGlass是RTL階DFT質(zhì)量的守門員。必須啟用以下check否則Insertion必然失敗DFT_SCANABLE_FLOP_CHECK檢查所有flop是否滿足scanable條件無異步reset、無latch、clock port為posedge。命令set_check -enable DFT_SCANABLE_FLOP_CHECKDFT_SCAN_ENABLE_FANOUT_CHECK檢查scan_enablenet fanout是否≤5。命令set_check -enable DFT_SCAN_ENABLE_FANOUT_CHECKDFT_CLOCK_DOMAIN_CHECK檢查clock domain聲明是否完整是否存在unconnected clock。命令set_check -enable DFT_CLOCK_DOMAIN_CHECK運(yùn)行后SpyGlass生成dft_violation.rpt必須100%修復(fù)。其中CRITICAL級violations如async_reset_detected必須修改RTLWARNING級如high_fanout_net可接受但需在Insertion階段用-max_fanout參數(shù)壓制。實(shí)操心得每天提交RTL前先跑spyglass -f dft_check.tcl。5分鐘發(fā)現(xiàn)的問題比Insertion階段debug 5小時(shí)強(qiáng)。4. 實(shí)操過程從RTL到ATPG的完整命令流與參數(shù)精解4.1 環(huán)境準(zhǔn)備Ubuntu 20.04下Tessent 2022.09安裝避坑指南Tessent安裝不是解壓即用涉及OS底層庫兼容性。Ubuntu 20.04是唯一推薦環(huán)境安裝步驟如下系統(tǒng)預(yù)配置# 升級基礎(chǔ)庫 sudo apt update sudo apt upgrade -y # 安裝必要依賴 sudo apt install -y csh tcsh libx11-6 libxext6 libxrender1 libxtst6 libxi6 libsm6 libice6 libfontconfig1 libfreetype6 # 關(guān)鍵降級glibcTessent 2022.09要求2.31 # Ubuntu 20.04默認(rèn)glibc 2.31無需降級若誤裝22.04請重裝系統(tǒng)License配置Tessent license server必須獨(dú)立部署。不要用FlexLM通用server必須用Siemens提供的lmgrdtessentdaemon。獲取license.dat文件含HOSTID、FEATURE tessent_testkompress創(chuàng)建/opt/tessent/license目錄放入license.dat啟動(dòng)servercd /opt/tessent/license ./lmgrd -c license.dat -l lmgrd.log ./tessent -c license.dat -l tessent.log Tessent安裝# 解壓安裝包注意tessent安裝包是tar.gz不是zip tar -xzf tessent_2022.09_linux64.tar.gz -C /opt/ # 設(shè)置環(huán)境變量 echo export TESSENT_HOME/opt/tessent_2022.09 ~/.bashrc echo export PATH$TESSENT_HOME/bin:$PATH ~/.bashrc source ~/.bashrc # 驗(yàn)證 tessent_shell -version # 應(yīng)輸出2022.09注意網(wǎng)上流傳的“burpsuit new scan 教程”與Tessent無關(guān)是Web安全工具切勿混淆。scanner scan 怎么打入空串也是網(wǎng)絡(luò)爬蟲術(shù)語與IC DFT無任何關(guān)聯(lián)。4.2 RTL到NetlistDC綜合腳本的關(guān)鍵DFT參數(shù)Synopsys DC綜合不是功能導(dǎo)向而是DFT導(dǎo)向。以下腳本片段是產(chǎn)線驗(yàn)證過的最小可行配置# dft_dc.tcl set target_library saed32nm_ff.lib set link_library * $target_library # 關(guān)鍵啟用DFT mode set_app_var DFT_MODE true set_app_var DFT_SCAN true # 插入scan enable控制邏輯 set_dft_signal -view existing_dft -type ScanEnable -port scan_enable -active_state 1 # 聲明scan reset set_dft_signal -view existing_dft -type Reset -port rst_n -active_state 0 # 設(shè)置scan clock set_dft_signal -view existing_dft -type ScanClock -port clk -active_state 1 # 約束scan enable fanout ≤5 set_max_fanout 5 scan_enable # 綜合 compile_ultra -no_autoungroup -no_boundary_optimization # 輸出網(wǎng)表 write_ddc -hierarchy dft_netlist.ddc write_verilog -hierarchy dft_netlist.v運(yùn)行命令dc_shell-t -f dft_dc.tcl檢查點(diǎn)dft_netlist.v中必須包含scan_in/scan_out端口且所有flop實(shí)例化語句中q端口連接正確。提示compile_ultra比compile更穩(wěn)定尤其對scan logic優(yōu)化。-no_autoungroup防止DC自動(dòng)拆分scan chain。4.3 Scan InsertionTessent Shell核心命令詳解進(jìn)入Tessent Shell后按順序執(zhí)行# 1. 初始化 set_project -name my_dft_project -technology saed32nm read_ddc dft_netlist.ddc # 2. 定義clock domain必須與RTL一致 set_scan_clock_domain -name MAIN_CLK -clock clk set_scan_clock_domain -name DIV2_CLK -clock clk_div2 set_synchronous_clock -source MAIN_CLK -destination DIV2_CLK -phase_shift 0.0 # 3. 設(shè)置scan信號 set_scan_enable -port scan_enable -signal scan_enable set_scan_reset -port rst_n -signal rst_n -active_state 0 # 4. 插入scan chain關(guān)鍵參數(shù) create_scan_chain \ -name sc_main \ -style dftdmi \ # 必須用dftdmi支持hierarchical DFT -max_fanout 20 \ # 控制fanout避免布線問題 -max_length 200 \ # 單條chain最大flop數(shù)平衡test time與fault coverage -scan_style dftdmi \ # 與-style一致 -use_dftdmi \ # 啟用DFT-DMI協(xié)議 -disable_clock_gating_propagation \ # 關(guān)鍵防止clock gating干擾scan shift -insert_bypass_mux \ # 插入bypass mux提升controllability # 5. 寫出scan netlist write_ddc -hierarchy scan_netlist.ddc write_verilog -hierarchy scan_netlist.v write_scan_def scan_def_file.scan_def注意-disable_clock_gating_propagation是血淚教訓(xùn)。開啟此選項(xiàng)Tessent會自動(dòng)切斷clock gating logic與scan chain的連接確保scan shift時(shí)clock穩(wěn)定。若不加ATPG pattern在capture phase會因clock被關(guān)閉而失敗。4.4 ATPG生成TestKompress壓縮算法參數(shù)調(diào)優(yōu)ATPG不是一鍵生成需根據(jù)芯片規(guī)模調(diào)整壓縮率# 加載scan netlist read_ddc scan_netlist.ddc # 設(shè)置ATPG參數(shù) set_atpg_options \ -fault_model stuck_at \ # 標(biāo)準(zhǔn)stuck-at模型 -compression_ratio 100 \ # 壓縮率100表示100x壓縮即100個(gè)scan cycle壓縮為1個(gè) -max_pattern_count 10000 \ # 最大pattern數(shù) -min_fault_coverage 98.0 \ # 目標(biāo)fault coverage # 運(yùn)行ATPG run_atpg # 輸出STIL文件ATE機(jī)臺格式 write_stil -format stil -output my_chip.stil參數(shù)精解-compression_ratio值越大pattern越少test time越短但fault coverage可能下降。實(shí)測32nm工藝下ratio100時(shí)coverage97.2%ratio50時(shí)coverage98.5%。建議從50起步逐步提高。-min_fault_coverage必須≥95%否則signoff不通過。若達(dá)不到需插入更多TP或檢查RTL中未掃描flop。提示run_atpg后檢查atpg_report.txt重點(diǎn)關(guān)注Fault Coverage和Pattern Count。若coverage95%立即執(zhí)行report_untestable_faults找出未測試fault并定位RTL問題。4.5 Validation三仿真器交叉驗(yàn)證的實(shí)操腳本Validation不是走過場而是用不同仿真器暴露工具鏈差異# Xcelium驗(yàn)證腳本xrun.tcl xrun -64bit -f file.f \ -define DFT_MODE \ -input testbench.sv \ -input my_chip.stil \ -sv \ -access rwc \ -gui# VCS驗(yàn)證腳本vcs_run.sh vcs -full64 -sverilog \ -f file.f \ -define DFT_MODE \ -input testbench.sv \ -input my_chip.stil \ -R# Questa驗(yàn)證腳本questa.do vsim -64 -c -do do run.do \ -f file.f \ defineDFT_MODE \ testbench \ -input my_chip.stil關(guān)鍵檢查點(diǎn)所有仿真器中scan_out波形必須完全一致scan_in輸入與scan_out輸出的bit位對應(yīng)關(guān)系必須1:1無X態(tài)傳播X-propagation實(shí)操心得用Python腳本自動(dòng)比對三個(gè)仿真器的VCD波形。若發(fā)現(xiàn)差異立即檢查my_chip.stil中cycle count是否一致——不同仿真器對STIL timing resolution處理不同需統(tǒng)一用-timing_resolution 1ps。5. 常見問題與排查技巧實(shí)錄200次debug沉淀的速查表5.1 Insertion階段高頻報(bào)錯(cuò)與根因分析報(bào)錯(cuò)信息根本原因解決方案修復(fù)耗時(shí)ERROR: No scanable flops foundRTL中flop無scan_in/scan_out端口或always塊含異步reset檢查grep -n always ( *.v重構(gòu)為同步reset2小時(shí)WARNING: scan_enable fanout exceeds limit (12)scan_enablenet fanout5重構(gòu)為H-tree結(jié)構(gòu)插入buffer1小時(shí)ERROR: Cannot find clock domain CLK_MAINset_scan_clock_domain中clock name與RTL不一致用grep -n clk_main *.v確認(rèn)RTL中實(shí)際name15分鐘FATAL: License checkout failed for feature tessent_testkompressLicense server未啟動(dòng)或license.dat中HOSTID錯(cuò)誤ps aux | grep lmgrd檢查進(jìn)程用hostid命令核對HOSTID30分鐘注意所有報(bào)錯(cuò)必須查看完整log而非僅summary。Tessent log中ERROR行上方10行常含真實(shí)原因。5.2 ATPG階段coverage不達(dá)標(biāo)問題樹當(dāng)Fault Coverage 95%時(shí)按此順序排查檢查untestable faultsreport_untestable_faults -verbose→ 若顯示uncontrollable說明TP不足插入新TP若顯示unobservable說明scan_out路徑有問題檢查RTL中scan_out是否被assign語句截?cái)?。?yàn)證clock domainreport_scan_clock_domain→ 確認(rèn)所有flop都被分配到正確domain。若某flop顯示NO_DOMAIN說明其clock未被set_scan_clock_domain覆蓋。檢查black-box IPreport_black_box→ 若IP未被read_scan_def加載coverage必然缺失。立即索要scan_def文件。重跑ATPG with debug optionrun_atpg -debug→ 生成atpg_debug.log查找cannot excite fault at net xxx定位RTL中該net的驅(qū)動(dòng)邏輯。實(shí)操心得coverage問題80%源于RTL缺陷而非ATPG參數(shù)。不要盲目調(diào)-compression_ratio先fix RTL。5.3 Validation階段波形不一致問題定位三仿真器結(jié)果不一致按優(yōu)先級排查現(xiàn)象可能原因驗(yàn)證方法解決方案Xcelium通過VCS失敗VCS對$setuphold檢查更嚴(yán)在VCS中vcslicsetuphold關(guān)閉檢查修改RTL timing marginQuesta波形延遲1