--- name: asic-check description: "Final preflight check before VCS simulation or DC synthesis. Reports RTL syntax, makefile, run scripts, file.f, and path errors. Does not verify functional logic. Use when the user calls /asic-check, asks to check the environment, or wants a last check before sim or syn. Do not apply while generating RTL or TB." --- # asic-check 丟進 **VCS** 或 **DC** 之前的最後一步。只查「這個環境能不能跑起來、RTL 語法有沒有明顯錯」,**不查功能、不跑 sim、不跑 syn、不評分 scoreboard / SVA 語意**。 彈性:專案有哪個階段就查哪個。只有 `00_TESTBED` + `01_RTL` 要 RTL sim → 不要因為還沒 `03_GATE` 而 fail。makefile flag 不跟範本逐字比。 **預設只報告,不改檔。** 使用者說修再修。 通過才能說可以丟 VCS / DC。有 blocker 就列出路徑與原因,不要含糊講「可能有問題」。 --- ## 不做 - 功能對不對、test pattern 會不會過 - 時序、面積、`rtl-opt` - 排版(那是 `design-format`) - 真的執行 `vcs` / `dc_shell`(本機多半也沒有 CAD) - 檢查 CAD server 上 StdCell 實體檔是否存在 --- ## 流程 1. 看使用者要去哪:RTL sim / syn / gate;沒說就查**現有**階段 2. **列出該查的每一個檔**,再**逐檔打開讀過**。禁止抽樣、禁止只看 `file.f` 就當 RTL 查完 3. 依下面清單打 **blocker** / **warn** 4. 輸出結論:`PASS` 或 `FAIL`,並附 **已檢查檔案清單** 沒被打開讀過的檔,不能算檢查過。有檔沒讀 → 不能 `PASS`。 `warn` 不擋(例如 Netlist 還沒合成、要 gate 才需要)。`blocker` 擋。 --- ## 必須逐檔讀的清單 現有階段裡,下面每一個都要 Read 過一遍: - `01_RTL`:全部 `.sv` / `.v` / `.vh`,加上 `file.f`、`01_run` - `00_TESTBED`:全部 `.sv` / `.v` / `.vh`,加上 makefile(或專案實際使用的那份) - `02_SYN`:`file.f`、`02_run`;有 TCL 也讀(只查路徑 / 檔案是否指得到,不評時序約束好不好) - `03_GATE`:`file.f`、`03_run` 合成出來的 `Netlist/*.v` 若已存在:確認檔在、`file.f` 指到它。**不要**用 `rtl-constraint` 打 netlist。 `file.f` 有列到、但目錄掃描沒掃到的檔 → 仍然要打開;打不開就是 blocker。 --- ## 環境 / 路徑 目錄名允許就是 `00_TESTBED`、`01_RTL`、`02_SYN`、`03_GATE`。有自訂名稱且 `*_run` / `file.f` 已用那套 → 跟實際路徑查,不要硬改名。 - `*_run` 指到的 makefile **存在**,target **存在** - `makefile` 裡 sim 用 `vcs`、合成用 `dc_shell`,sim 有 `-f` 吃 filelist - gate 流程有 `+define+GATE`(跟 TESTBED `` `ifdef GATE `` 對得上) - `file.f` 裡 `-sverilog` / `-v` / `-f` / `+incdir+` 的相對路徑,從**該 file.f 所在目錄**解析後,檔案或目錄要存在 - `+incdir` 有列出的目錄要在 - `` `include "..." `` 能在 `+incdir` 或同目錄找到 - `file.f` 出現 `CHECKER.sv` 但檔案不存在 → blocker - DUT 有 `instantiate` 的 module,對應 `.sv` / `.v` 要在同一個 file.f 裡(或明確是 stdcell / memory 模型) - package 應在 design 之前;top 建議在 RTL 段最後(順序明顯反了才 warn) **依階段放寬:** - 只做 RTL sim:不要求 `02_SYN` / `03_GATE`、不要求 netlist - 要 syn:`02_SYN/file.f` 的 RTL 路徑都要在;TCL 有就確認路徑寫得對,沒有只 warn「合成腳本不在本 skill 範圍」 - 要 gate:`03_GATE/file.f` 要有 netlist 路徑與 `-v` StdCell;netlist / sdf 還沒產生 → **warn**(還不能跑 gate,但不是 file.f 寫錯)。`-v` 必須是這兩個之一(一字不改),否則 blocker: - `/usr/cad/CBDK_TSMC90G_Arm_v1.1/Lib90/tsmc090.v` - `/usr/cad/ADFP/Executable_Package/Collaterals/IP/stdcell/N16ADFP_StdCell/VERILOG/N16ADFP_StdCell.v` --- ## RTL 語法 每個 `01_RTL` 的 `.sv` / `.v` / `.vh` 都要過一遍,對照 `rtl-constraint`。不推波形、不證明規格。 每個 `00_TESTBED` 的 `.sv` / `.v` / `.vh` 也要過一遍:只查語法結構(module 成對、include 找得到),**不要**用 `rtl-constraint` 打 TB。 blocker: - `module` / `endmodule` 不成對;`begin`/`end`、`case`/`endcase`、`package`/`endpackage` 明顯不成對 - port / 宣告明顯缺分號、未閉合的 `(` `[` - DUT 出現 `#delay`、`$display` / `$finish` / `$fatal`、`force` / `release`、`fork` / `join`、`casex`、`always @(*)`、`always @(posedge`(應用 `always_comb` / `always_ff`) - `always_comb` 與 `always_ff` 在同一塊混用 `=` / `<=` - 同一個 signal 被兩個 `always_*` 或 `assign` + `always` 寫(多重驅動) - `for` 邊界用 runtime 變數 - 明顯 combo loop(A 的 comb 依賴 B、B 又依賴 A) warn: - `always_comb` 某分支可能沒賦值(latch 風險) - `case` 沒有 `default` - 宣告 `= 0` 當 reset --- ## makefile / run blocker: - `01_run` / `02_run` / `03_run` 指向不存在的 makefile 或沒有的 target - sim 指令不是 `vcs`,合成不是 `dc_shell`(名稱可包在變數裡,但展開後要是這兩個 tool) - `-f` 指到的 filelist 不存在 不要因為少了 `+define+SVA`、timescale 數字跟範本不同而 fail。 --- ## 輸出 ``` asic-check: PASS | FAIL scope: RTL-sim / syn / gate(實際查了哪些) checked: - 每個讀過的檔(完整列出,不可省略) blocker: - path: 原因 warn: - path: 原因 ``` `checked` 必須覆蓋「必須逐檔讀的清單」。少列或沒讀就不能 `PASS`。 `FAIL` = 有 blocker。沒有 blocker 才寫「可以丟 VCS / DC」(gate 若 netlist 還不在,寫「可以 syn;gate 等 Netlist 出來再跑」)。