RTL-AI-Lab:用 Claude API 加速 IC 前端設計

專案概述 IC 設計的學習曲線很陡:CDC、APB、AXI-Lite、Coverage-Driven Verification——每個概念都需要時間消化,更需要動手跑過才算真的懂。 這個專案分兩個月:第一個月用 Claude Code 輔助,8 天走完一條從基礎 FIFO 到 SoC Fabric 的完整 IC 前端設計路徑;第二個月用 Claude API 從頭打造四個 EDA 工具,把重複性工作自動化。 第一個月:IC 前端設計 8 天 設計進展 Day 主題 核心技術 亮點 1 同步 FIFO MSB-trick pointer 無計數器的 full/empty 判斷 2 參數化 FIFO $clog2()、parameter 可重用 IP 設計模式 3 APB Slave APB protocol、register map 刻意埋 bug 示範 debug 流程 4 APB-FIFO Wrapper SVA Assertions Formal verification 入門 5 Async FIFO Gray code CDC、2-FF sync Cummings method,業界標準 6 AXI-Lite Async FIFO 雙時鐘 CDC 架構 完整 IP 規格書撰寫 7 BRAM 推斷 DP RAM inference pattern 83% 面積縮減(390 → 67 cells) 8 大型系統整合 Reset CDC、AXI-Lite Crossbar Coverage-Driven Testbench 成果:27 個 SystemVerilog 檔案、5 份規格文件、8 天設計日記 ...

April 14, 2026 · 3 分鐘 · Eric Hsiao

為什麼我花兩個月用 AI 重新學 IC 設計

起點:一個讓我坐立難安的問題 「如果 AI 真的可以寫 RTL,IC 工程師還需要懂設計嗎?」 這個問題困擾我很久。不是因為我怕被取代,而是因為我不知道答案。所以我決定用兩個月,親自弄清楚這件事。 第一個月:重新走過 IC 設計的基礎 我給自己一個挑戰:8 天內,從零建立一條完整的 IC 前端設計路徑,包含所有工業界真正在用的技術。 不是用 AI 幫我寫,而是讓 AI 陪我學——查詢、解釋、驗證、討論。 8 天的軌跡大概是這樣: Day 1-2:同步 FIFO。最好的入門題,有 full/empty 狀態,但邏輯可以很乾淨。 Day 3-4:APB Slave + SVA Assertions。刻意埋了一個 bug,練習 debug 流程。 Day 5-6:Async FIFO。這才是真正的關卡。Gray code CDC、2-FF synchronizer——跨時鐘域設計是最容易出 metastability 的地方,也是教科書最容易說不清楚的地方。 Day 7:BRAM 推斷。同樣的 FIFO,換一個寫法,合成面積縮減 83%(390 → 67 cells)。一個 always_ff 的細節,差別巨大。 Day 8:Reset CDC + AXI-Lite Crossbar + Coverage-Driven Verification。從單一模組走到系統層級。 最後累積了 27 個 SystemVerilog 檔案、5 份規格文件,還有 8 天的設計日記。 ...

April 14, 2026 · 1 分鐘 · Eric Hsiao

準備 AI 工程師面試:API 整合和 Fine-tuning 我踩過的坑

前情提要 在 RTL-AI-Lab 的第二個月,我花了兩週時間密集整理 AI 工程師面試會問到的東西。 不是因為我要換工作,而是因為我發現:我雖然用了很多 Claude API,但很多底層的東西我說不清楚。Rate limit 怎麼處理?Streaming 為什麼存在?Fine-tuning 和 RAG 到底什麼時候選哪個? 這篇文章是我實際寫過程式、踩過坑之後整理出來的,不是翻教科書。 一、API 整合:在正式環境裡用 AI 的四個關卡 關卡 1:Rate Limit 第一次遇到 HTTP 429 的時候我以為是我的程式壞了。後來才懂——Rate Limit 不是 bug,是設計。 正確處理方式是指數退避(Exponential Backoff):第一次失敗等 1 秒,第二次等 2 秒,第三次等 4 秒,以此類推,中間加一點隨機 jitter 避免所有 client 同時重試: from tenacity import retry, wait_exponential, stop_after_attempt, retry_if_exception_type import anthropic @retry( wait=wait_exponential(multiplier=1, min=1, max=60), stop=stop_after_attempt(5), retry=retry_if_exception_type(anthropic.RateLimitError) ) def call_claude(prompt: str) -> str: client = anthropic.Anthropic() message = client.messages.create( model="claude-opus-4-6", max_tokens=1024, messages=[{"role": "user", "content": prompt}] ) return message.content[0].text 手寫 retry loop 也可以,但用 tenacity 套件更乾淨,面試的時候說你用 tenacity 比手寫更加分。 ...

April 14, 2026 · 3 分鐘 · Eric Hsiao