--- name: asic-env description: "Builds ASIC project flow files for 00_TESTBED / 01_RTL / 02_SYN / 03_GATE: file.f, makefile, 01_run, 02_run, 03_run. Asks 90nm vs 16nm for StdCell. Use when the user calls /asic-env, asks to set up the environment, generate file.f, makefile, or run scripts. Do not apply when only writing RTL or testbench." --- # asic-env 在專案根目錄建構 **sim / syn / gate** 環境。目錄固定為 **`00_TESTBED`**、**`01_RTL`**、**`02_SYN`**、**`03_GATE`**。使用者通常已建好前兩個;本 skill 補後兩個與所有 flow 檔。 不寫 RTL、不寫 PATTERN/TESTBED 內容。TB 骨架走 **`dv-format`**。 ## makefile `resource/makefile.tpl` 只是骨架,**不是硬規格**。工具固定: - RTL / gate sim:`vcs` - 合成:`dc_shell` 其餘依 Phase 0 看到的專案改,不要原樣貼範本。常見可調、但不是必寫: - `+define+SVA`:PATTERN 裡真的有 SVA 才加 - `TIMESCALE`:跟 TB / 既有 makefile 對齊 - `+define+...`:TESTBED / PATTERN 已有的 `` `ifdef `` 才對應加上(gate 一定要有 `+define+GATE`,跟 `dv-format` 一致) - target 名稱預設 `vcs_rtl` / `vcs_gate` / `syn`;專案已有 makefile 就沿用它的 target,三個 `*_run` 跟著改 已有 makefile 且使用者選跳過 → 不要覆蓋,只改 `*_run` 去呼叫現有 target。 --- ## 製程 問 **90nm** 或 **16nm**。只決定 `03_GATE/file.f` 的 `-v`。 | 製程 | `CELL_LIB` | |---|---| | **90nm** | `/usr/cad/CBDK_TSMC90G_Arm_v1.1/Lib90/tsmc090.v` | | **16nm** | `/usr/cad/ADFP/Executable_Package/Collaterals/IP/stdcell/N16ADFP_StdCell/VERILOG/N16ADFP_StdCell.v` | 路徑一字不改。 --- ## Phase 0 — 掃描(只讀) 確認這四個目錄在不在,並列出: - `01_RTL`:`*.sv` / `*.v` / `*.vh`(排除 `01_run`、`file.f`) - `00_TESTBED`:`TESTBED.sv`、`PATTERN.sv`、有的話才算 `CHECKER.sv`、`*.vh` - `02_SYN`:已有的 `*.tcl` - 已有的 `makefile`(`00_TESTBED` 或專案根):讀 target 名稱、`+define` - `00_TESTBED` / `01_RTL` 裡的 `` `ifdef `` / `` `define ``(用來決定 makefile 要不要加對應 `+define`) RTL 用 `^package` 分成 `PKG_FILES` 與 `DESIGN_FILES`。從 `DESIGN_FILES` 找 `^module ` 當 candidate top。 `01_RTL` 不存在或沒有 design 檔 → **中止**,叫使用者先放 RTL。 --- ## Phase 1 — 一次問完 用 `AskQuestion`(沒有就口頭問)。最多這三題,能推的就不要問: 1. **製程**(永遠問):`90nm` / `16nm` 2. **Top**(只有多個 `module` 時問) 3. **覆蓋**(`makefile`、任一 `file.f`、`01_run`/`02_run`/`03_run` 已存在才問):全部覆蓋 / 跳過已存在 `00_TESTBED` 不存在 → 建立空目錄(makefile 仍寫在這裡)。 `02_SYN` / `03_GATE` 不存在 → 直接建立,不問。 單一 design 檔 → `TOP` = 檔名去副檔名。 --- ## Phase 2 — 寫入 範本在本 skill 的 `resource/`。佔位符:`{{TOP}}`。 ### 目錄 沒有就 `mkdir`:`00_TESTBED`、`02_SYN`、`03_GATE`。 ### `00_TESTBED/makefile` 有現成 makefile 且選跳過 → 不覆蓋。 否則以 `resource/makefile.tpl` 當起點,填 `top_design`,再依掃描結果加減 flag。不要為了「跟範本一樣」而加專案用不到的 `+define`。不要產生或指定 `syn_tcl`。 `*_run` 呼叫的 makefile 路徑與 target 必須跟實際 makefile 一致。 ### run scripts 預設: `01_RTL/01_run` → `make -f ../00_TESTBED/makefile vcs_rtl` `02_SYN/02_run` → `make -f ../00_TESTBED/makefile syn` `03_GATE/03_run` → `make -f ../00_TESTBED/makefile vcs_gate` makefile 不在 `00_TESTBED`、或 target 名稱不同 → `*_run` 跟著改,不要硬寫這三行。 ### `01_RTL/file.f` 相對 `01_RTL`: ``` +incdir+./ ← 有 .vh 或 package 才加 -sverilog ./.sv ← 每個 package -sverilog ./.sv ← 非 top 的 design -sverilog ./.sv ← top 放最後 -sverilog ../00_TESTBED/PATTERN.sv ← 檔案存在才加 -sverilog ../00_TESTBED/CHECKER.sv ← 只有檔案存在才加 -sverilog ../00_TESTBED/TESTBED.sv ← 檔案存在才加 ``` ### `02_SYN/file.f` 只有 RTL,不要 TB: ``` +incdir+../01_RTL/ ← 有 .vh 或 package 才加 -sverilog ../01_RTL/.sv -sverilog ../01_RTL/.sv -sverilog ../01_RTL/.sv ``` ### `03_GATE/file.f` ``` +incdir+../01_RTL/ -sverilog ../02_SYN/Netlist/_syn.v -sverilog ../00_TESTBED/PATTERN.sv ← 存在才加 -sverilog ../00_TESTBED/CHECKER.sv ← 只有存在才加 -sverilog ../00_TESTBED/TESTBED.sv ← 存在才加 -v ``` `_syn.v` 在合成前可以還不存在,路徑格式必須對。 不要複製或改 `02_SYN` 裡的 TCL。合成腳本由使用者自己放。 --- ## Phase 3 — 檢查整個環境 寫完後**立刻**做一次檢查,把結果列給使用者。缺檔或路徑錯要標出來並修(能修的修;Netlist 尚未合成標成預期、不要當錯誤)。 **目錄** - `00_TESTBED`、`01_RTL`、`02_SYN`、`03_GATE` 都在 **檔案存在** - `00_TESTBED/makefile`(或專案實際使用的那份 makefile) - `01_RTL/01_run`、`01_RTL/file.f` - `02_SYN/02_run`、`02_SYN/file.f` - `03_GATE/03_run`、`03_GATE/file.f` **內容** - 三個 `*_run` 能呼叫到 makefile 的 RTL sim / syn / gate target(預設 `vcs_rtl` / `syn` / `vcs_gate`) - makefile 用 `vcs` 與 `dc_shell`,sim 吃 `-f file.f` - gate 流程有 `+define+GATE` - `01_RTL/file.f`、`02_SYN/file.f` 列出的 `.sv`/`.v`/`.vh` 路徑都存在 - `03_GATE/file.f` 最後一行 `-v` 等於選定的 `CELL_LIB` - `03_GATE/file.f` 的 netlist 路徑是 `../02_SYN/Netlist/_syn.v` - 沒有 `CHECKER.sv` 就不要寫進任何 `file.f` - package 在 design 前面;top 在 RTL 最後 不要把 makefile 每一行 flag 拿去跟 `makefile.tpl` 逐字比。 本地 Windows **不必**檢查 CAD server 上的 StdCell 實體檔。 檢查全過才算完成。失敗列出哪一項、修完再檢查一次。完整的「丟 VCS / DC 前檢查」走 **`asic-check`**,本段只確認剛寫出的 flow 檔。