在 Innovus 中預(yù)定義了一坨 init_XXX 的變量,用戶(hù)需要將對(duì)應(yīng)輸入文件指定給對(duì)應(yīng)的變量,然后執(zhí)行 init_design 工具就會(huì)將所有文件依次讀入,對(duì)于 verilog netlist 老驢扒拉了幾個(gè) flow 關(guān)鍵的 init 變量有:
init_design_settop,?這個(gè)變量默認(rèn)值是 1,意思是要求客戶(hù)指定當(dāng)前設(shè)計(jì)的 top 名字給變量 init_top_cell; 如果將該變量設(shè)成 0,?則讓工具自己識(shí)別 top. 建議,用默認(rèn)值,用戶(hù)自己指定 top.
init_lef_file, 將 tech-lef +?other lefs 指定給這個(gè)變量,這里有個(gè)問(wèn)題,如果某個(gè) lef?file 在 init_design 之前沒(méi)加上,要增量讀入該怎么辦?在 Innovus common ui 中用命令: read_physical -add_lefs XX 可以增量讀入 lef.
init_mmmc_file, 指定 viewDefinition.tcl,?viewDefinition?中的 library_set 指定了所有要用的 library, rc_corner 指定了對(duì)應(yīng)的 QRC file, constraint_mode 指定了 SDC 文件。
init_verilog, 指定網(wǎng)表文件。
init_pwr_net,?指定?global power nets.
init_gnd_net,?指定?global ground?nets.
init_cpf_file,?如果是多電壓域設(shè)計(jì),用于指定 CPF 文件,如果 power intent?是用 1801 描述的,則不能用該變量指定 1801 文件,需要用命令 read_power_intent -1801 $1801_file 讀入,如果在 viewDefinition 中用到了 power domain 則應(yīng)該在 init_design 之前讀入,init_design 之后再執(zhí)行?commit_power_intent. read_power_intent?這個(gè)命令的使用方式跟 Genus 一致,在 Genus 中多了一步 apply_power_intent,?用于將設(shè)計(jì)跟 power domain 綁定,commit_power_intent 用于插入 low power cell.?
至此,所有輸入文件都指定完畢,執(zhí)行 init_design 就會(huì)將對(duì)應(yīng)文件讀入,init_design 讀取文件的順序還沒(méi)看,按照邏輯猜測(cè)一下讀入順序:library -> tech-lef -> lef -> QRC -> cpf -> netlist -> SDC.??
init_design_netlisttype, 用于指定 netlist 的 format 是 verilog 還是 OA, 老驢目前只學(xué)習(xí) verilog 部分,所有 OA 相關(guān)的都忽略掉。 init_ignore_pgpin_polarity_check, 用于指定一個(gè) leaf cell pin?name 的 list, 告訴工具在 globalNetConnect?或在 CPF 中 connect supply net?時(shí)忽略極性檢查 .?這貨好像對(duì) 1801 flow 沒(méi)用,正好這周一解了個(gè)相關(guān)的問(wèn)題,當(dāng)時(shí)遇到的問(wèn)題是 1801 flow, 在 commit_power_intent 時(shí)工具報(bào) Error:?IMPDB-1220 跟 WARN:?IMPDB-1278, 對(duì)于這種問(wèn)題在 Innovus?中先用命令 dbGet [dbGet top.nets.name PMD0_VDD -p].isPwr 來(lái)檢查工具將對(duì)應(yīng)的 supply net 認(rèn)成了什么。在老驢遇到的 case 中,是在 1801 中用 connect_supply_net 要將一個(gè) analog Ground 連到一個(gè) analog IP 上,但是在 1801 中只定義了 supply net 并沒(méi)有指定該 net 用于 Ground 所以工具將其認(rèn)成了 Power. 解的辦法是在 1801 中為其 create 一個(gè) supply set 并將其指定為 ground.
init_verilog_tolerate_port_mismatch, 這個(gè)變量默認(rèn)值是 0, 不能容忍 module 定義的 port 比實(shí)例化時(shí)的 port 少,如果將其設(shè)為 1 工具在解析 netlist 時(shí)如果發(fā)現(xiàn) module 的 port 比實(shí)例化時(shí)的 port 少,工具會(huì)在 module 上創(chuàng)建一個(gè) port, 老驢以為這個(gè)變量在設(shè)計(jì)臟的時(shí)候特別有用。 init_lef_check_mask_shifts,?用于檢查 tech-lef?和 MACRO sections?中?FIXEDMASK 跟 LAYERMASKSHIFT 是否沖突,該變量默認(rèn)值是 off 就是不檢查,如果設(shè)為 on?工具發(fā)現(xiàn)沖突會(huì)報(bào)錯(cuò)并停掉,如果設(shè)為 bypass 工具發(fā)現(xiàn)沖突只報(bào)錯(cuò)不停止,其實(shí)老驢還不知道 FIXEDMASK 跟 LAYERMASKSHIFT 在不同工藝中有多重要,先放到這里,萬(wàn)一以后發(fā)現(xiàn)重要呢,方便找。 init_import_mode, 用于指定 setImportMode 的 option, 如 set init_import_mode {-discardFloatingVNets true -keepEmptyModule true},此處留個(gè)問(wèn)題:是不是默認(rèn) innovus 會(huì)將 empty module 刪掉?如果是,那綜合 netlist 中有沒(méi)有 empty module 應(yīng)該都無(wú)所謂吧?如果是,為什么有的后端一定要求把 empty module 刪掉? init_design_uniquify, 控制 innovus 解析 netlist 時(shí)是否做 uniquify, 既然 innovus 要求 netlist 是 unique 的,那為毛不把該變量的默認(rèn)值設(shè)為 1?