
驗證工程師群里這兩天最熱鬧的話題不是哪家新出了仿真器而是OpenAI把一個模型直接塞進了芯片設(shè)計工具。消息剛出的時候有人說這是EDA的ChatGPT時刻也有人說這又是營銷話術(shù)。作為一個在數(shù)字前端驗證行當里泡了快十年的老工程師我的第一反應(yīng)不是興奮而是好奇它到底塞在哪個環(huán)節(jié)是幫忙寫testbench還是能幫我關(guān)掉那個卡了三個月的功能覆蓋率帶著這個疑問我把手頭的幾個項目翻出來試了一圈也扒了不少公開的技術(shù)分享。這篇東西不打算復述新聞就想老老實實聊聊所謂50倍驗證收斂哪些是真的能拿到的哪些只是理想狀態(tài)以及真要落地的時候你會踩到哪些坑。1. 為什么驗證收斂是芯片項目的“吞時怪獸”1.1 驗證收斂到底在收斂什么“驗證”這個詞在芯片項目里其實很寬泛。我們常說的驗證收斂通常指兩件事覆蓋率收斂和bug率收斂。覆蓋率收斂是功能覆蓋率、代碼覆蓋率這些指標隨著仿真回歸逐漸逼近目標的過程bug率收斂是發(fā)現(xiàn)的缺陷數(shù)量隨迭代逐漸下降的過程。兩者疊加才叫“驗證完成”。我見過很多項目前60%的覆蓋率幾乎白送隨便跑跑隨機用例就上去了。真正折磨人的是后面那20%某些邊界條件、某些異常時序組合隨機約束怎么撒網(wǎng)都碰不到。這時候驗證工程師就開始“手工挖礦”盯波形、翻代碼、改約束、再跑回歸一跑就是幾百上千個種子。時間就在這循環(huán)里溜走了。有人可能會問為什么不能把所有輸入都窮舉一遍答案很簡單狀態(tài)空間太大。一個稍微復雜的AXI互聯(lián)模塊組合爆炸起來連仿真器帶存儲都扛不住。所以驗證本質(zhì)上是一場“用有限資源逼近無限空間”的博弈。收斂就是賭你找到了足夠多的關(guān)鍵路徑讓團隊有信心說“bug基本被清干凈了”。這個“賭”字很關(guān)鍵。傳統(tǒng)約束隨機驗證的賭注押在隨機種子和人工經(jīng)驗上而OpenAI這次的做法本質(zhì)是想把“人工經(jīng)驗”這部分也自動化一部分讓模型參與到“猜測哪里有bug、哪里沒測到”的推理鏈里。1.2 傳統(tǒng)方案為什么越往后越慢傳統(tǒng)約束隨機驗證有一個很尷尬的規(guī)律越接近收斂新增有效測試的邊際成本越高。你把種子數(shù)從100加到1000覆蓋率可能只漲零點幾個百分點你把回歸時間從一晚延長到三天可能仍然touch不到某個deep state。因為隨機序列對于“罕見但關(guān)鍵”的狀態(tài)組合效率是很低的。更麻煩的是分析瓶頸不在仿真器在人。仿真器跑一天能出幾百萬行日志可工程師能盯完幾萬行就不錯了。很多時候不是仿真不夠快而是“人讀日志、定位根因、修改激勵”這個閉環(huán)太慢。OpenAI這波操作恰恰想從這條閉環(huán)下手。它不是在跟仿真器賽跑而是在跟工程師的“分析時間”賽跑。我舉一個真實體感的例子。早些年我負責一個PCIe控制器驗證有一項覆蓋率指標卡在87%整整三周。每天做的事極其重復跑回歸、看覆蓋率報告、猜哪個場景沒測到、寫定向sequence、再跑。模型介入之后它把三個月內(nèi)所有回歸日志做了一次聚類直接指出“有一個斷言從未被觸發(fā)因為某個配置寄存器的組合只出現(xiàn)了兩次而其中一次還被初始化邏輯提前攔掉了”。這個結(jié)論我后來驗證是對的。但找到這一步我原來大概還要兩三天它幾分鐘就排到了。2. OpenAI把模型塞進EDA先搞清楚塞在哪2.1 三條插入路徑日志、測試臺、覆蓋率從目前公開的信息和使用體驗看模型并沒有被做成一個“會寫Verilog的機器人”直接接管設(shè)計。它更像是被塞進了三個具體環(huán)節(jié)第一日志分析。仿真回歸跑完會產(chǎn)生大量failure log、warning和覆蓋率報告。模型可以自動把日志歸類給出每個失敗用例的疑似根因。第二測試臺生成?;赨VM的驗證環(huán)境里sequence、constraint、monitor的寫法有很強的模式化。模型可以根據(jù)覆蓋率數(shù)據(jù)和RTL結(jié)構(gòu)生成新的sequence或修改constraint。第三覆蓋率歸因。模型把功能覆蓋率模型里的“未覆蓋點”和代碼里的if/else分支、狀態(tài)機跳轉(zhuǎn)條件對應(yīng)起來告訴你“你缺少的是一個能讓ready信號拉低到第7拍才恢復的激勵”。這三點其實都踩在驗證工程師每天最耗時的動作上。模型的價值不是替代仿真而是幫你把“看不懂的”變成“看得懂的”把“想不出的”變成“可以試的”。換句話說傳統(tǒng)EDA工具解決的是“怎么跑得更快”模型解決的是“下一步該跑什么”這兩個問題本來就不在同一維度。2.2 關(guān)鍵不是模型跑得多快而是迭代變少我聽到很多人糾結(jié)“50倍”這個數(shù)字覺得太夸張。其實要分清口徑。如果看單個仿真任務(wù)的運行時間模型幾乎不會帶來加速有時反而更慢因為它要額外花時間推理。但如果看“從某個覆蓋率卡住到收斂”的整體耗時50倍完全可能。舉個粗糙的例子。某個模塊的功能覆蓋率卡在92%傳統(tǒng)做法是資深工程師花兩周做定向用例過程中可能要嘗試二三十種激勵方案。用模型輔助后模型批量分析未覆蓋點生成20個候選sequence工程師快速篩選后跑回歸可能兩三天就搞定。兩周對兩三天確實是好幾倍的差距項目夠大、卡得夠久的話疊出來的倍數(shù)會更夸張。所以數(shù)字本身不重要重要的是它縮短的是“人的決策鏈路”。當然這有一個前提模型得能穩(wěn)定接入你的驗證數(shù)據(jù)流。如果每次都要人工把日志復制到網(wǎng)頁對話框里再粘回來那省下的時間又被傳輸過程吃回去了。真正有用的形態(tài)是模型和現(xiàn)有回歸平臺、覆蓋率數(shù)據(jù)庫之間有API級別的打通。3. 50倍驗證收斂背后的技術(shù)支點3.1 一個具體案例AXI總線協(xié)議覆蓋率從84%到99%這樣說還是有點抽象我拿一個常見的AXI總線驗證場景拆解。假設(shè)你已經(jīng)有了一個跑得通的UVM環(huán)境功能覆蓋率卡在84%。未覆蓋的function point里有這么一條“outstanding transaction 4且read data channel的反壓時間超過100拍”。普通約束隨機為什么難碰到因為要同時滿足“master發(fā)多個未完成事務(wù)”和“slave長時間反壓”兩個條件概率乘積很低。人工做法是把slave的ready信號在某個時間窗口內(nèi)強制拉低再配合定向sequence。這個過程有經(jīng)驗的工程師半天能想明白新手可能要一周。模型的做法是先讀UVM環(huán)境里的現(xiàn)有sequence和constraint再讀RTL里read channel的狀態(tài)機最后結(jié)合覆蓋率報告直接生成一個新的sequence框架里面寫清楚“第二個burst發(fā)完后準備好信號置低110拍”。這個sequence當然不可能一次通過但它把新手一周的摸索壓縮到一兩個小時。真正的瓶頸從“看懂代碼”轉(zhuǎn)移到“驗證模型建議是否合理”而后者本來就是你驗證工程師該干的事。我在實際試用中還發(fā)現(xiàn)模型對狀態(tài)機跳轉(zhuǎn)條件的敏感度很高。它會主動指出“當前狀態(tài)機只有在current_qIDLE且nxt_req有效時才會進入BACKPRESSURE但你的覆蓋率模型里沒有單獨cover這個跳轉(zhuǎn)”這類提醒對完善覆蓋率模型本身也有幫助。3.2 檢索增強讓模型“看得懂”驗證計劃這里必須提一下RAG檢索增強生成這是模型能“裝懂”的關(guān)鍵。大語言模型的訓練數(shù)據(jù)里不太可能有你家芯片的RTL代碼和驗證計劃所以直接把整個代碼庫喂給模型是不現(xiàn)實的。實際工程實現(xiàn)通常是把驗證計劃、功能覆蓋率模型、RTL關(guān)鍵模塊的接口信息、歷史bug庫切分成小塊建立索引。當工程師提出“為什么這個覆蓋率點沒被命中”系統(tǒng)不是把整個設(shè)計塞給模型而是先檢索出相關(guān)的接口定義、約束片段和歷史相似問題再讓模型基于這些片段推理。這種做法既省token也明顯降低了幻覺。我見過最靠譜的落地版本就是把RAG和日志分析串起來先自動切日志再檢索相關(guān)測試用例最后生成根因假設(shè)。整體很像給模型配了一副“老工程師的眼鏡”。檢索這塊容易被人低估。數(shù)據(jù)切分的粒度、索引字段的選擇、歷史bug庫的清洗直接決定模型回答的準頭。比如如果你把斷言文件和RTL文件混在一個索引塊里模型就可能把斷言里的信號名當成RTL信號來推理。實際項目里按文件類型分索引、按模塊分命名空間是兩條基礎(chǔ)經(jīng)驗。4. 手把手把模型接進驗證環(huán)境4.1 第一步先把“會說人話的日志分析師”跑起來如果你所在的公司還沒法立刻上成套平臺我建議從小切口開始。第一步不要想著讓模型直接改constraint而是先把仿真日志丟給模型讓它當你的日志分析助手。這樣風險最小也最容易評估效果。具體做法不復雜把一份失敗的仿真日志截取出來配合對應(yīng)的test name和覆蓋率報告組成一段prompt。我在試用時大概會用這種格式“你是一名資深芯片驗證工程師。下面是UVM仿真日志片段請幫我找出(1)斷言失敗的根因(2)可能出錯的module(3)下一步建議。只輸出結(jié)論不要復述日志?!比缓笳{(diào)用OpenAI的API把日志的末尾幾千個token放進去。實際用起來你會發(fā)現(xiàn)模型對UVM常見報錯、斷言失敗、超時這類問題的判斷相當靠譜尤其是“疑似死鎖”“某些信號未初始化”這類模式它比新人眼睛掃得快多了。這個環(huán)節(jié)不需要多高的技術(shù)門檻兩三天就能搭起來。需要提醒一句別把整份上萬行的日志一股腦塞進去。模型不是讀得越多越準超長日志會讓它“注意力分散”反而容易漏掉關(guān)鍵行。我的做法是先用腳本把日志里的uvm_error、uvm_fatal、assertion fail這些關(guān)鍵詞行抽出來再讓模型基于這些精華片段分析。4.2 第二步讓模型提出可執(zhí)行的約束修改建議第一步跑順之后可以上“約束建議”環(huán)節(jié)。這一步的核心是給模型足夠上下文當前覆蓋率報告、目標未覆蓋點、現(xiàn)有sequence代碼。注意別一上來就讓它直接改UVM文件而是讓它輸出一份“建議修改內(nèi)容”。我通常會讓模型以補丁形式輸出類似// 建議新增約束當 burst_len 4 時ready信號至少延遲100拍 constraint c_slave_backpressure { if (burst_len 4) { ready_delay inside {[100:120]}; } }拿到建議后先人工review再放進分支環(huán)境里跑一個小回歸。這個流程的關(guān)鍵是“模型提議、人類拍板、回歸驗證”。我見過最穩(wěn)的做法是把模型建議封裝成Jenkins的一個構(gòu)建參數(shù)工程師一鍵觸發(fā)帶建議的回歸跑完自動生成對比報告如果沒有讓覆蓋率下降才合并進主干。這里有個容易踩的坑模型輸出的是SystemVerilog但UVM的constraint有時會和sequence里的uvm_do_with互相沖突。所以模型建議的constraint最好先過一遍lint或者用純隨機種子試跑不要直接拿去替代原有約束。我在最初試用時就吃過“模型建議的約束覆蓋了原有優(yōu)先級導致某個定向用例再也跑不出來”的虧。4.3 第三步人機協(xié)作的收斂看板到這一步你已經(jīng)有了不少歷史數(shù)據(jù)模型建議被采納了多少、每條建議對覆蓋率的影響、花了多少輪才命中某個難點。把這些數(shù)據(jù)匯總成一個“人機協(xié)作收斂看板”會非常有用??窗迳峡梢苑秩龣诖治鲰椖P驼诤Y的日志、待評審項模型給出的約束建議、已收斂項經(jīng)驗證有效的改動。我試下來的體感是當看板上的“待分析項”越來越少說明模型對當前環(huán)境的理解在變好而“已收斂項”里的案例以后可以作為檢索庫喂給下一輪模型。這個飛輪一旦轉(zhuǎn)起來收斂速度才會真正穩(wěn)定提升。看板本身不復雜用現(xiàn)成的Jira或者一個簡單的Web表都可以關(guān)鍵是讓模型的結(jié)果和人工決策記錄在同一個視圖里。否則你就會陷入另一種混亂模型建議散落在聊天記錄里人工review狀態(tài)根本沒法追蹤。5. 落地必踩的坑與對策5.1 模型亂改約束導致回歸爆炸這是最常見的坑我?guī)缀蹩梢詳喽總€試點團隊都會遇到。模型為了命中某個覆蓋率點給出的約束建議可能非常激進比如把某個信號的有效范圍壓得特別窄。這個建議可能確實能命中目標點但同時會讓其他十來個測試用例的覆蓋率下降甚至直接掛掉。對策很簡單隔離驗證。模型建議永遠只進分支環(huán)境合并主干之前必須先跑全量回歸并且用覆蓋率變化作為門禁。別嫌麻煩這跟代碼評審一樣是質(zhì)量底線。我們內(nèi)部還加了一條規(guī)則凡是模型建議的約束必須附帶“針對哪個uncovered point”的說明沒有說明的自動拒絕。5.2 上下文越長錯誤越隱蔽模型在長上下文里容易“迷失”。你給它一份完整的設(shè)計規(guī)范文檔它可能回答得頭頭是道但真正定位問題時反而忽略了日志末尾的一句關(guān)鍵現(xiàn)象。我在試用中碰到過更離譜的它根據(jù)一段截斷的日志斷言某個信號從未被驅(qū)動但實際上只是那一段日志恰好沒打印。對策是分層輸入。先讓腳本做日志摘要把最關(guān)鍵的斷言、錯誤、時間戳抽出來再讓模型基于摘要分析如果模型需要看完整波形不要直接給VCD而是給出信號列表和層級關(guān)系。另外在prompt里明確指定“只能基于我提供的信息回答不要假設(shè)日志之外的內(nèi)容”能明顯減少這類“腦補”錯誤。5.3 覆蓋率提升的“幸存者偏差”模型給出的建議碰巧提升了覆蓋率不代表它真的理解了你的設(shè)計。有一次模型建議我把某寄存器復位值改掉說這樣能更容易命中某個邊界。試跑之后覆蓋率確實漲了但review時發(fā)現(xiàn)這個改動其實讓一個assertion失效了覆蓋率漲上去的原因是斷言不再報警。所以看覆蓋率數(shù)值漲不漲只是第一步還得看驗證有效性有沒有下降。建議每次采納模型建議后順手檢查相關(guān)assertion的觸發(fā)次數(shù)和報錯分布。如果斷言觸發(fā)率明顯降低要警惕是不是模型把“壞路徑”給堵上了而不是幫你測到了新路徑。現(xiàn)象排查思路建議一改約束其他測試掛檢查是否未隔離用分支回歸門禁模型漏看某條時序檢查上下文是否被截斷分段喂入關(guān)鍵信息前置覆蓋率提升但不可復現(xiàn)檢查隨機種子多次回歸統(tǒng)計模型重復給出相同建議提示詞缺少負面案例加入失敗嘗試記錄6. 說點真實感受工程師該警惕什么6.1 角色會變但不會被取代有人問我會不會被AI替代。我的答案是不會但那些只會“跑腳本、看日志、改約束”的工作內(nèi)容確實會被大幅壓縮。以前一個驗證工程師同時盯三個模塊就手忙腳亂現(xiàn)在配合模型盯五六個模塊的收斂狀態(tài)是可能的。但前提是你得知道模型什么時候靠譜、什么時候在胡說。這其實把驗證工程師的門檻從一個維度換到了另一個維度。以前要求你“代碼熟、調(diào)試快”現(xiàn)在可能更要求你“能定義問題、能設(shè)計驗證策略、能判斷模型的輸出質(zhì)量”。硬核的SystemVerilog和UVM功底仍然是基礎(chǔ)但光有這些已經(jīng)不夠了。6.2 最先受益的是“會提問”的人我觀察到一個很有意思的現(xiàn)象同樣是接入這套工具不同工程師的效率提升差異非常大。有人把模型當成高級搜索引擎問“這個日志報了什么錯”得到的只是一個更啰嗦的日志摘要有人會問“為什么這個burst沒有進入反壓狀態(tài)是不是因為前一筆transaction還沒返回”這樣的問題模型能直接給出根因假設(shè)。區(qū)別就在提問的精度。模型對模糊問題的回答往往也是模糊的對精確問題的回答才能真正指向行動。我自己試下來的經(jīng)驗是每次提問前先花三十秒把目標寫清楚我卡在哪個覆蓋率點我懷疑是哪條路徑我需要模型幫我驗證哪個假設(shè)。這樣得到的建議采納率至少翻一倍。最后再分享一個小技巧讓模型每次回答都必須附上“置信度”和“依據(jù)”。這能逼它更謹慎也能讓你快速判斷哪些答案值得深挖。當你發(fā)現(xiàn)模型連續(xù)幾次給出同一個錯誤建議時不是它笨是你喂的上下文里缺了某條關(guān)鍵信息回去補索引或者換一種方式切日志往往就通了。這大概是這個工具最有意思的地方你在訓練它它也在訓練你而驗證收斂的效率就在這種互相磨合里慢慢漲上去。