源EDA與Sky130 PDK實(shí)戰(zhàn):從RTL到流片全流程避坑指南)
1. 從零到流片開(kāi)源EDA與Sky130 PDK的實(shí)戰(zhàn)避坑指南1.1 為什么我要走這條路三年前如果有人跟我說(shuō)用一套完全開(kāi)源的工具鏈加上一個(gè)開(kāi)源工藝設(shè)計(jì)套件能把一顆芯片從RTL一路推到流片我大概率會(huì)覺(jué)得他在開(kāi)玩笑。那時(shí)候商業(yè)EDA的License費(fèi)用動(dòng)輒幾十萬(wàn)美金一年一次MPW多項(xiàng)目晶圓的流片機(jī)會(huì)更是貴得離譜個(gè)人開(kāi)發(fā)者和小團(tuán)隊(duì)根本玩不起。但這兩年情況變了開(kāi)源EDA工具鏈的成熟度上來(lái)了Sky130 PDK也穩(wěn)定了再加上OpenMPW這類(lèi)項(xiàng)目給了普通人免費(fèi)流片的機(jī)會(huì)整個(gè)門(mén)檻一下子降到了“你只要有臺(tái)像樣的電腦、愿意花時(shí)間學(xué)”的程度。這篇文章我想聊的就是這條路上的真實(shí)體驗(yàn)。不是那種“Hello World”級(jí)別的跑通demo而是從環(huán)境搭建、RTL綜合、布局布線、時(shí)序收斂、DRC/LVS驗(yàn)證一直到提交流片文件的全流程把我在這個(gè)過(guò)程中踩過(guò)的坑、繞過(guò)的彎、總結(jié)出來(lái)的經(jīng)驗(yàn)一次性講清楚。適合誰(shuí)看如果你是電子工程或者計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生想親手做一顆真正的芯片但苦于沒(méi)有資源如果你是嵌入式工程師想從寫(xiě)固件往上再走一層理解硬件底層或者你只是對(duì)芯片設(shè)計(jì)好奇想找個(gè)低成本的方式入門(mén)——那這篇內(nèi)容應(yīng)該能幫你省下不少時(shí)間。核心工具鏈我用的是OpenROAD做布局布線Yosys做綜合Magic和KLayout做版圖驗(yàn)證PDK就是Sky130。整個(gè)流程跑下來(lái)從零到提交GDS大約需要兩到三周的業(yè)余時(shí)間前提是你得知道哪些地方容易卡住。1.2 整體流程長(zhǎng)什么樣先給一個(gè)全局視角免得后面講細(xì)節(jié)的時(shí)候你迷失在工具參數(shù)里。一顆數(shù)字芯片從代碼到流片大致要經(jīng)過(guò)這么幾個(gè)階段RTL設(shè)計(jì)用Verilog或者SystemVerilog寫(xiě)功能邏輯這一步跟FPGA開(kāi)發(fā)很像但約束條件完全不同。功能仿真用Verilator或者Icarus Verilog跑testbench確保邏輯正確。邏輯綜合Yosys把RTL翻譯成門(mén)級(jí)網(wǎng)表映射到Sky130的標(biāo)準(zhǔn)單元庫(kù)上。布局布線OpenROAD接管做floorplan、placement、CTS、routing最后輸出DEF和GDS。物理驗(yàn)證Magic和KLayout跑DRC設(shè)計(jì)規(guī)則檢查和LVS版圖與原理圖一致性檢查。流片提交把最終GDS打包按照OpenMPW或者其它shuttle的要求提交。每一步都有它自己的坑而且很多坑是文檔里不會(huì)寫(xiě)的。下面我按階段拆開(kāi)講。2. 環(huán)境搭建別在這一步就放棄2.1 工具鏈安裝的三種方式裝開(kāi)源EDA工具鏈這件事說(shuō)簡(jiǎn)單也簡(jiǎn)單說(shuō)麻煩也麻煩。目前主流有三種路子第一種是直接用OpenLane的Docker鏡像。這是最省心的方式OpenLane把Yosys、OpenROAD、Magic、KLayout、Netgen這些工具全打包好了你只需要裝個(gè)Docker拉個(gè)鏡像就能跑。缺點(diǎn)是鏡像體積大好幾個(gè)GB而且如果你想單獨(dú)調(diào)某個(gè)工具的版本會(huì)比較麻煩。第二種是用conda或者pip逐個(gè)安裝。比如Yosys可以通過(guò)conda-forge裝OpenROAD有預(yù)編譯的二進(jìn)制包Magic和KLayout也都有各自的安裝渠道。這種方式靈活但版本兼容性需要你自己把控。我試過(guò)用conda裝Yosys然后手動(dòng)編譯OpenROAD結(jié)果因?yàn)橐蕾?lài)庫(kù)版本對(duì)不上折騰了一整天。第三種是從源碼編譯。適合想深度定制或者研究工具內(nèi)部實(shí)現(xiàn)的人但對(duì)新手極度不友好。我第一次嘗試編譯OpenROAD的時(shí)候光是處理依賴(lài)就花了大半天最后還因?yàn)槟硞€(gè)庫(kù)的版本問(wèn)題編譯失敗。我的建議如果你是第一次走這個(gè)流程直接用OpenLane的Docker鏡像。等整個(gè)流程跑通了再考慮逐個(gè)替換工具做定制化。2.2 Sky130 PDK的獲取與配置Sky130 PDK是SkyWater公司開(kāi)源的一個(gè)130nm工藝節(jié)點(diǎn)包含了標(biāo)準(zhǔn)單元庫(kù)、IO庫(kù)、SRAM編譯器、以及各種工藝文件。獲取方式主要有兩個(gè)一個(gè)是Google和SkyWater合作的Sky130 PDK倉(cāng)庫(kù)另一個(gè)是通過(guò)OpenLane自帶的PDK安裝腳本。PDK里面你最需要關(guān)注的是這幾個(gè)東西組件用途關(guān)鍵文件標(biāo)準(zhǔn)單元庫(kù)綜合和布局布線的基礎(chǔ)sky130_fd_sc_hd 系列工藝文件DRC/LVS規(guī)則sky130A.tech (Magic)時(shí)序庫(kù)靜態(tài)時(shí)序分析.lib 文件物理庫(kù)布局布線用.lef 文件配置PDK的時(shí)候最容易出問(wèn)題的是環(huán)境變量。OpenLane需要知道PDK的根目錄在哪通常通過(guò)PDK_ROOT和PDK兩個(gè)變量來(lái)指定。如果你手動(dòng)安裝PDK一定要確保目錄結(jié)構(gòu)跟OpenLane預(yù)期的一致否則它會(huì)找不到庫(kù)文件然后報(bào)一堆莫名其妙的錯(cuò)誤。我踩過(guò)的一個(gè)坑是PDK版本和OpenLane版本不匹配。OpenLane的某些版本對(duì)PDK的目錄結(jié)構(gòu)有特定要求如果你用的是舊版PDK配新版OpenLane可能會(huì)在讀取LEF文件的時(shí)候報(bào)錯(cuò)。解決辦法是看OpenLane的文檔確認(rèn)它推薦的PDK版本然后嚴(yán)格按那個(gè)版本來(lái)。2.3 硬件資源的最低要求開(kāi)源EDA工具鏈對(duì)機(jī)器性能的要求其實(shí)不低。綜合和布局布線都是計(jì)算密集型任務(wù)尤其是布局布線階段OpenROAD會(huì)吃滿CPU并且占用大量?jī)?nèi)存。我的實(shí)測(cè)數(shù)據(jù)一個(gè)中等復(fù)雜度的設(shè)計(jì)大約幾千個(gè)標(biāo)準(zhǔn)單元在8核16線程的機(jī)器上跑完整個(gè)OpenLane流程大約需要30到60分鐘。內(nèi)存方面16GB是底線32GB會(huì)比較從容。如果你只有8GB內(nèi)存大概率會(huì)在routing階段因?yàn)镺OM內(nèi)存不足而失敗。磁盤(pán)空間也要留夠PDK加上工具鏈加上中間文件輕松超過(guò)20GB。建議至少留50GB的可用空間。3. RTL設(shè)計(jì)與綜合從代碼到門(mén)級(jí)網(wǎng)表3.1 寫(xiě)RTL時(shí)就要考慮的事很多人寫(xiě)RTL的時(shí)候只關(guān)注功能正確等到綜合和布局布線的時(shí)候才發(fā)現(xiàn)一堆問(wèn)題。開(kāi)源工具鏈對(duì)RTL的“容忍度”比商業(yè)工具低有些寫(xiě)法在商業(yè)綜合器里能過(guò)在Yosys里就會(huì)出問(wèn)題。幾個(gè)必須注意的點(diǎn)避免使用不可綜合的SystemVerilog特性。Yosys對(duì)SystemVerilog的支持在不斷完善但仍然有一些高級(jí)特性不支持比如某些類(lèi)型的interface、復(fù)雜的斷言、動(dòng)態(tài)數(shù)組等。我建議RTL階段就用Verilog-2001或者SystemVerilog的一個(gè)保守子集別一上來(lái)就用花哨的語(yǔ)法。時(shí)鐘域處理要干凈。開(kāi)源流程對(duì)多時(shí)鐘域的支持是有的但配置起來(lái)比較麻煩。如果你的設(shè)計(jì)有多個(gè)時(shí)鐘建議先做時(shí)鐘域交叉CDC的同步處理然后在約束文件里明確指定每個(gè)時(shí)鐘的頻率和關(guān)系。復(fù)位策略要統(tǒng)一。同步復(fù)位還是異步復(fù)位在綜合和時(shí)序分析時(shí)會(huì)有不同的處理方式。Sky130的標(biāo)準(zhǔn)單元庫(kù)里有帶異步復(fù)位端的觸發(fā)器如果你用異步復(fù)位綜合器會(huì)直接映射到這些單元上。但如果你的復(fù)位信號(hào)處理不當(dāng)可能會(huì)在布局布線后出現(xiàn)復(fù)位樹(shù)時(shí)序問(wèn)題。3.2 Yosys綜合腳本的編寫(xiě)要點(diǎn)Yosys的綜合流程大致是讀入RTL → 層次化處理 → 工藝映射 → 優(yōu)化 → 輸出網(wǎng)表。每一步都有對(duì)應(yīng)的命令你可以寫(xiě)一個(gè).ys腳本來(lái)自動(dòng)化。一個(gè)典型的綜合腳本長(zhǎng)這樣# 讀取RTL read_verilog top.v read_verilog sub_module.v # 指定頂層模塊 hierarchy -top top # 工藝無(wú)關(guān)優(yōu)化 proc; opt; fsm; opt; memory; opt # 映射到Sky130標(biāo)準(zhǔn)單元 techmap abc -liberty $PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib # 輸出網(wǎng)表 write_verilog -noattr top_synth.v這里有幾個(gè)容易出問(wèn)題的地方abc命令的-liberty參數(shù)必須指向正確的.lib文件。Sky130的標(biāo)準(zhǔn)單元庫(kù)有多個(gè)版本hd、hdll、hs等對(duì)應(yīng)不同的面積和速度權(quán)衡。hd是高密度庫(kù)單元面積小但驅(qū)動(dòng)能力弱hs是高速庫(kù)面積大但速度快。選哪個(gè)取決于你的設(shè)計(jì)目標(biāo)。綜合后的網(wǎng)表要檢查一下有沒(méi)有未映射的單元。有時(shí)候Yosys會(huì)遇到無(wú)法映射的邏輯會(huì)保留成通用門(mén)或者直接報(bào)錯(cuò)。你可以用stat命令查看綜合后的統(tǒng)計(jì)信息確認(rèn)所有邏輯都映射到了Sky130的單元上。3.3 時(shí)序約束文件的寫(xiě)法時(shí)序約束是綜合和布局布線的“指揮棒”。在開(kāi)源流程里約束文件通常是SDC格式包含時(shí)鐘定義、輸入輸出延遲、虛假路徑等。一個(gè)最基本的SDC文件create_clock -name clk -period 10 [get_ports clk] set_input_delay -clock clk 2 [all_inputs] set_output_delay -clock clk 2 [all_outputs] set_load 0.1 [all_outputs]create_clock的-period參數(shù)決定了你的目標(biāo)頻率。10ns對(duì)應(yīng)100MHz對(duì)于Sky130這個(gè)130nm工藝來(lái)說(shuō)100MHz是一個(gè)比較保守但容易達(dá)到的目標(biāo)。如果你想跑更高的頻率比如200MHz5ns周期就需要更仔細(xì)地優(yōu)化邏輯深度和布局。實(shí)操心得第一次跑的時(shí)候把時(shí)鐘周期設(shè)得寬松一點(diǎn)比如20ns先確保整個(gè)流程能跑通。等流程通了再逐步收緊約束看能跑到多少頻率。這樣比一上來(lái)就設(shè)一個(gè)激進(jìn)的約束然后卡在時(shí)序收斂上要好得多。4. 布局布線OpenROAD實(shí)戰(zhàn)4.1 Floorplan階段的關(guān)鍵決策Floorplan是布局布線的第一步?jīng)Q定了芯片的物理形狀和標(biāo)準(zhǔn)單元的擺放區(qū)域。OpenROAD的floorplan主要需要你指定兩個(gè)東西die的面積和core的面積。die是整個(gè)芯片的邊界包括IO pad和電源環(huán)。core是實(shí)際擺放標(biāo)準(zhǔn)單元的區(qū)域在die內(nèi)部。core的面積直接決定了布局的密度——面積太小會(huì)導(dǎo)致布線擁塞面積太大則浪費(fèi)硅片面積。怎么估算core面積一個(gè)經(jīng)驗(yàn)公式是core面積 ≈ 標(biāo)準(zhǔn)單元總面積 / 目標(biāo)利用率。目標(biāo)利用率一般在0.5到0.7之間。比如你的標(biāo)準(zhǔn)單元總面積是10000平方微米目標(biāo)利用率0.6那core面積大約需要16700平方微米。OpenROAD的floorplan命令initialize_floorplan -die_area 0 0 200 200 \ -core_area 10 10 190 190 \ -site $::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/techlef/sky130_fd_sc_hd__nom.tlef這里的-site參數(shù)指定了標(biāo)準(zhǔn)單元的site定義必須跟PDK里的tech LEF文件對(duì)應(yīng)。4.2 Placement與CTS的注意事項(xiàng)Placement分兩步全局布局global placement和詳細(xì)布局detailed placement。全局布局決定每個(gè)單元的大致位置詳細(xì)布局做精細(xì)調(diào)整。OpenROAD的全局布局命令是global_placement詳細(xì)布局是detailed_placement。跑完placement之后建議用check_placement檢查一下有沒(méi)有重疊或者越界的單元。CTS時(shí)鐘樹(shù)綜合是布局布線里比較關(guān)鍵的一步。時(shí)鐘信號(hào)需要被均勻地分配到所有觸發(fā)器時(shí)鐘偏差skew要盡可能小。OpenROAD的clock_tree_synthesis命令會(huì)自動(dòng)構(gòu)建時(shí)鐘樹(shù)你可以通過(guò)參數(shù)控制緩沖器的類(lèi)型和數(shù)量。我遇到的一個(gè)坑是CTS之后沒(méi)有重新跑時(shí)序分析直接進(jìn)入routing結(jié)果routing完成后發(fā)現(xiàn)時(shí)序違例嚴(yán)重。正確的做法是CTS之后跑一次STA靜態(tài)時(shí)序分析確認(rèn)時(shí)鐘樹(shù)的質(zhì)量如果有問(wèn)題就調(diào)整CTS參數(shù)重新跑。4.3 Routing階段的常見(jiàn)問(wèn)題Routing分全局路由global routing和詳細(xì)路由detailed routing。全局路由規(guī)劃大致的走線路徑詳細(xì)路由確定具體的金屬層和通孔位置。Routing階段最常見(jiàn)的問(wèn)題是擁塞congestion。當(dāng)某個(gè)區(qū)域的走線需求超過(guò)了可用的布線資源時(shí)就會(huì)出現(xiàn)擁塞導(dǎo)致routing失敗或者產(chǎn)生大量DRC違例。解決擁塞的幾個(gè)思路調(diào)整floorplan增大core面積降低布局密度。調(diào)整placement用-density參數(shù)控制布局密度或者手動(dòng)添加placement blockage。調(diào)整routing參數(shù)OpenROAD的detailed_route命令有多個(gè)參數(shù)可以調(diào)整比如-droute_end_iter控制迭代次數(shù)-verbose輸出詳細(xì)信息。我實(shí)測(cè)下來(lái)Sky130的金屬層資源相對(duì)緊張尤其是對(duì)于復(fù)雜度較高的設(shè)計(jì)。如果你的設(shè)計(jì)標(biāo)準(zhǔn)單元數(shù)量超過(guò)5000個(gè)建議把core面積留得寬裕一些否則routing階段會(huì)非常痛苦。5. 物理驗(yàn)證DRC與LVS5.1 DRC檢查與修復(fù)DRCDesign Rule Check是檢查版圖是否符合工藝制造規(guī)則的過(guò)程。Sky130的DRC規(guī)則有幾百條涉及金屬間距、寬度、通孔尺寸、阱間距等等。用Magic跑DRCmagic -d sky130A -rcfile $PDK_ROOT/sky130A/libs.tech/magic/sky130A.magicrc進(jìn)入Magic后加載GDS文件然后執(zhí)行drc check和drc why查看違例詳情。DRC違例的修復(fù)有時(shí)候很直接比如手動(dòng)調(diào)整某條金屬線的寬度有時(shí)候很麻煩比如需要重新跑routing。常見(jiàn)的DRC違例類(lèi)型包括違例類(lèi)型原因修復(fù)方式金屬間距不足routing太密調(diào)整routing參數(shù)或增大間距通孔尺寸不對(duì)使用了錯(cuò)誤的通孔類(lèi)型檢查PDK的通孔定義阱間距不足標(biāo)準(zhǔn)單元擺放太近調(diào)整placement密度天線效應(yīng)長(zhǎng)金屬線連接到柵極插入天線二極管注意DRC修復(fù)是一個(gè)迭代過(guò)程。修完一輪之后要重新跑DRC因?yàn)槟愕男薷目赡軙?huì)引入新的違例。建議每次修改后都完整跑一遍DRC不要攢著一起修。5.2 LVS驗(yàn)證的流程LVSLayout Versus Schematic是檢查版圖提取出的網(wǎng)表跟原始原理圖網(wǎng)表是否一致。這一步能發(fā)現(xiàn)短路、斷路、錯(cuò)誤連接等問(wèn)題。LVS的流程通常是從GDS提取版圖網(wǎng)表 → 跟綜合后的網(wǎng)表對(duì)比 → 報(bào)告差異。用Netgen做LVSnetgen -batch lvs layout.spice top schematic.spice top \ $PDK_ROOT/sky130A/libs.tech/netgen/sky130A_setup.tclLVS通過(guò)的關(guān)鍵是確保版圖提取的網(wǎng)表跟原理圖網(wǎng)表在拓?fù)渖弦恢?。有時(shí)候DRC通過(guò)了但LVS不通過(guò)通常是因?yàn)槟承┻B接在版圖上存在但在原理圖上沒(méi)有或者反過(guò)來(lái)。我遇到過(guò)一個(gè)典型問(wèn)題電源和地的連接在版圖上是通過(guò)電源環(huán)和電源條實(shí)現(xiàn)的但原理圖網(wǎng)表里可能沒(méi)有顯式地包含這些連接。這種情況下需要在LVS設(shè)置里正確處理電源網(wǎng)絡(luò)的映射。5.3 天線效應(yīng)檢查天線效應(yīng)是制造過(guò)程中的一種失效機(jī)制長(zhǎng)的金屬線在等離子刻蝕過(guò)程中會(huì)積累電荷如果這條金屬線連接到晶體管的柵極積累的電荷可能會(huì)擊穿柵氧化層。Sky130的DRC規(guī)則里包含天線效應(yīng)的檢查。修復(fù)方法通常是在長(zhǎng)金屬線和柵極之間插入一個(gè)天線二極管給積累的電荷提供一條泄放路徑。OpenROAD在routing階段可以自動(dòng)插入天線二極管你需要確保在配置里啟用了這個(gè)功能。如果routing完成后DRC報(bào)告天線違例可以手動(dòng)在違例位置插入二極管然后重新跑DRC。6. 流片提交最后的臨門(mén)一腳6.1 OpenMPW的提交要求OpenMPWOpen Multi-Project Wafer是Google和SkyWater合作的一個(gè)項(xiàng)目定期組織免費(fèi)流片。提交需要準(zhǔn)備的東西包括最終的GDS文件版圖截圖和設(shè)計(jì)說(shuō)明引腳定義和封裝要求驗(yàn)證報(bào)告DRC clean、LVS clean提交前一定要仔細(xì)檢查GDS文件的內(nèi)容。我見(jiàn)過(guò)有人提交的GDS里包含了測(cè)試結(jié)構(gòu)或者未連接的單元結(jié)果流片出來(lái)的芯片功能不對(duì)。建議用KLayout打開(kāi)GDS逐層檢查確認(rèn)沒(méi)有多余的東西。6.2 提交前的最終檢查清單在點(diǎn)擊提交按鈕之前我建議按這個(gè)清單過(guò)一遍DRC cleanMagic和KLayout都跑一遍確保沒(méi)有違例。LVS cleanNetgen確認(rèn)版圖跟網(wǎng)表一致。時(shí)序收斂STA報(bào)告沒(méi)有setup和hold違例。電源網(wǎng)絡(luò)完整確認(rèn)所有單元都連接到了電源和地。IO pad正確如果有IO pad確認(rèn)pad的位置和連接正確。GDS層次結(jié)構(gòu)確認(rèn)頂層單元名稱(chēng)正確沒(méi)有多余的層次。文件格式確認(rèn)GDS版本跟shuttle要求的一致。6.3 流片后的測(cè)試準(zhǔn)備芯片流片回來(lái)之后你需要準(zhǔn)備測(cè)試方案。OpenMPW的芯片通常是QFN或者DIP封裝引腳數(shù)有限。你需要提前設(shè)計(jì)好PCB測(cè)試板準(zhǔn)備好電源、時(shí)鐘源和信號(hào)采集設(shè)備。測(cè)試的時(shí)候先從電源開(kāi)始確認(rèn)芯片的電源引腳沒(méi)有短路然后上電測(cè)量靜態(tài)電流。如果電流異常大可能是內(nèi)部有短路。靜態(tài)電流正常后再給時(shí)鐘信號(hào)觀察輸出引腳的行為。我個(gè)人經(jīng)驗(yàn)是第一次流片最好設(shè)計(jì)一個(gè)簡(jiǎn)單的測(cè)試電路比如一個(gè)計(jì)數(shù)器或者移位寄存器功能簡(jiǎn)單、容易驗(yàn)證。等第一次成功了再?lài)L試更復(fù)雜的設(shè)計(jì)。7. 常見(jiàn)問(wèn)題速查與避坑總結(jié)7.1 工具報(bào)錯(cuò)速查表報(bào)錯(cuò)信息可能原因解決方法Cannot find liberty filePDK路徑配置錯(cuò)誤檢查PDK_ROOT環(huán)境變量Routing congestion布局密度過(guò)高增大core面積或降低利用率Timing violation邏輯深度太大或約束太緊優(yōu)化RTL或放寬時(shí)鐘周期DRC violation: metal spacing金屬間距不足調(diào)整routing參數(shù)重新跑LVS mismatch版圖與網(wǎng)表不一致檢查電源連接和未連接單元Out of memory設(shè)計(jì)太大或機(jī)器內(nèi)存不足增加內(nèi)存或分塊處理7.2 那些文檔里不會(huì)寫(xiě)的經(jīng)驗(yàn)第一版本管理很重要。開(kāi)源工具鏈的版本更新很快不同版本之間的行為可能有差異。建議用Git管理你的設(shè)計(jì)文件和腳本每次跑通一個(gè)版本就打個(gè)tag。這樣出了問(wèn)題可以回退到已知可用的狀態(tài)。第二增量跑流程。不要每次都從頭跑整個(gè)流程。OpenROAD支持從中間步驟恢復(fù)比如你改了placement參數(shù)可以只重跑placement之后的部分。這樣能節(jié)省大量時(shí)間。第三多看日志。OpenROAD和Yosys的日志信息很豐富很多問(wèn)題在日志里都有提示。比如routing階段的擁塞報(bào)告會(huì)告訴你哪個(gè)區(qū)域擁塞最嚴(yán)重時(shí)序報(bào)告會(huì)告訴你哪條路徑違例最多。學(xué)會(huì)看日志能幫你快速定位問(wèn)題。第四社區(qū)是最好的老師。OpenROAD、OpenLane、Sky130都有活躍的社區(qū)論壇和聊天群。遇到問(wèn)題先搜一下大概率有人已經(jīng)遇到過(guò)了。如果搜不到提問(wèn)的時(shí)候附上完整的日志和配置文件這樣別人才能幫你分析。第五別怕失敗。我第一次跑完整流程的時(shí)候DRC違例有上千個(gè)時(shí)序違例幾十條整個(gè)人都懵了。但一個(gè)一個(gè)修下來(lái)最后也搞定了。開(kāi)源流程的成熟度已經(jīng)足夠支撐實(shí)際流片關(guān)鍵是你愿不愿意花時(shí)間跟它磨。7.3 性能優(yōu)化的幾個(gè)方向如果你想讓設(shè)計(jì)跑得更快或者面積更小可以從這幾個(gè)方向入手邏輯優(yōu)化在RTL階段減少邏輯深度用流水線換頻率。綜合策略嘗試不同的綜合選項(xiàng)比如abc的-script參數(shù)可以指定優(yōu)化腳本。布局策略調(diào)整placement的密度和擁塞控制參數(shù)。時(shí)鐘樹(shù)優(yōu)化調(diào)整CTS的緩沖器類(lèi)型和數(shù)量減小skew。電源網(wǎng)絡(luò)優(yōu)化合理規(guī)劃電源條的數(shù)量和寬度減小IR drop。這些優(yōu)化都需要反復(fù)迭代和對(duì)比建議每次只改一個(gè)變量觀察效果。8. 寫(xiě)在最后走完這一整套流程我最大的感受是開(kāi)源EDA和Sky130 PDK已經(jīng)不再是“玩具”了。它們確實(shí)能支撐真實(shí)的芯片設(shè)計(jì)雖然在某些方面還不如商業(yè)工具成熟但對(duì)于學(xué)習(xí)、研究和中小規(guī)模的設(shè)計(jì)來(lái)說(shuō)完全夠用。如果你正在考慮走這條路我的建議是先跑通一個(gè)最簡(jiǎn)單的設(shè)計(jì)比如一個(gè)8位計(jì)數(shù)器把整個(gè)流程走一遍理解每個(gè)階段在做什么。然后再逐步增加設(shè)計(jì)的復(fù)雜度同時(shí)深入學(xué)習(xí)每個(gè)階段的優(yōu)化技巧。不要一上來(lái)就做一個(gè)復(fù)雜的SoC那樣很容易在某個(gè)環(huán)節(jié)卡住然后失去信心。另外OpenMPW的申請(qǐng)是有時(shí)間窗口的提前關(guān)注相關(guān)的公告規(guī)劃好你的設(shè)計(jì)周期。從開(kāi)始設(shè)計(jì)到提交留出至少一個(gè)月的時(shí)間因?yàn)檎{(diào)試和驗(yàn)證往往會(huì)超出預(yù)期。最后說(shuō)一個(gè)實(shí)際體會(huì)開(kāi)源工具鏈的社區(qū)非常友好很多問(wèn)題在社區(qū)里都能找到答案。我在這條路上遇到的絕大多數(shù)困難都是通過(guò)查文檔、看日志、問(wèn)社區(qū)解決的。所以別一個(gè)人悶頭搞多跟社區(qū)交流效率會(huì)高很多。