Mở đầu: Code y hệt, FPGA chạy ngon lành — ASIC báo hàng trăm lỗi signoff
9 bài trước bạn nạp thiết kế lên FPGA (Bài 10) — bấm 4 lệnh, xong, chip chạy thật. Nhưng nếu mục tiêu là ASIC (chip đúc riêng, không lập trình lại được), cùng 1 file RTL y hệt — không đổi 1 dòng — có thể khiến flow tổng hợp ASIC báo về hàng trăm cảnh báo mà FPGA chưa từng phàn nàn: latch vô tình bị suy luận, clock bị AND với 1 tín hiệu enable "cho tiện", reset đồng bộ trộn lẫn bất đồng bộ giữa các khối. FPGA có đủ tài nguyên dư dả (flip-flop, mạng clock buffer toàn cục) để "che" những vấn đề này; ASIC thì không — mỗi lỗi kiểu này có thể là hàng triệu đô la phải làm lại (respin) sau khi đã gửi đi đúc.
Bài này đi hết chặng đường vật lý cuối cùng của series: từ thư viện standard cell (khối "LEGO" của ASIC) qua synthesis → floorplan → placement → clock tree → routing → signoff → GDSII (bản thiết kế cuối gửi nhà máy đúc), khái niệm corner PVT quyết định "chậm nhất"/"nhanh nhất" mạch có thể chạy, cạm bẫy "sạch cho FPGA ≠ sạch cho ASIC", và toolchain mã nguồn mở OpenLane/OpenROAD — con đường thật để 1 người tự học có thể đúc chip của chính mình qua TinyTapeout. Cuối bài, Die Viewer ảo cho bạn bấm qua từng bước flow, thấy con die "hiện dần" từng lớp vật lý.
Tài nguyên ngoài: HDLBits, ChipVerify, EDA Playground.
1. Standard Cell Library: bộ "LEGO" của ASIC
Thay vì tổng hợp xuống LUT như FPGA (Bài 9), ASIC tổng hợp xuống standard cell — hàng nghìn cổng logic cơ bản (NAND, NOR, DFF, buffer, ICG...) đã được vẽ sẵn ở mức transistor CMOS thật (đúng khái niệm đã học ở Series Điện Tử Bài 12), sản xuất hàng loạt cho 1 công nghệ (process node) cụ thể. Mỗi cell đi kèm 2 file mô tả:
| File | Định dạng | Nội dung |
|---|---|---|
.lib (Liberty) |
Text, dạng bảng tra | Timing (giống $t_{clk \to q}$/$t_{setup}$ đã học ở Bài 8, nhưng đo thật cho từng cell) và công suất tiêu thụ ở nhiều điều kiện input slew/output load khác nhau |
.lef |
Text, hình học | Kích thước vật lý, vị trí chân (pin), lớp kim loại cell chiếm — dữ liệu để P&R sắp xếp cell |
cell (NAND2X1) {
area : 1.6;
pin(A) { direction : input; capacitance : 0.002; }
pin(B) { direction : input; capacitance : 0.002; }
pin(Y) {
direction : output;
function : "!(A & B)";
timing() {
related_pin : "A";
cell_rise(delay_template) { /* bang tra cuu delay theo slew/load */ }
cell_fall(delay_template) { /* ... */ }
}
}
}
MACRO NAND2X1
CLASS CORE ;
SIZE 1.4 BY 2.0 ; # kich thuoc vat ly that (micron)
PIN A
DIRECTION INPUT ;
PORT
LAYER metal1 ; RECT 0.20 0.50 0.30 1.50 ; # toa do chan tren die
END
END A
PIN Y
DIRECTION OUTPUT ;
PORT
LAYER metal1 ; RECT 1.10 0.50 1.20 1.50 ;
END
END Y
END NAND2X1
Đây chính xác là dữ liệu $t_{clk \to q}$/$t_{comb}$ mà STA (Bài 8) và P&R (Bài
10) đã dùng trong suốt series — chỉ khác việc trên FPGA, bảng tra này do hãng FPGA (Xilinx/Lattice) giữ
kín cho từng LUT; trên ASIC, .lib/.lef là thứ nhóm thiết kế phải tự đọc và tuân
theo.
2. Flow vật lý: 7 bước từ RTL tới GDSII
| Bước | Việc làm | Liên hệ đã học |
|---|---|---|
| 1. Synthesis | RTL → netlist standard cell | Giống Bài 10 Mục 1, đích là standard cell thay vì LUT |
| 2. Floorplan | Định hình kích thước die, tỉ lệ lấp đầy (utilization), vành IO pad | Bước mới — FPGA không có, vì hình dạng chip FPGA đã cố định sẵn |
| 3. Placement | Đặt từng standard cell vào vị trí thật trên die | Cùng bài toán NP-hard đã học ở Bài 10 Mục 3 |
| 4. CTS (Clock Tree Synthesis) | Dựng mạng phân phối clock riêng, cân bằng độ trễ tới mọi flip-flop (giảm skew) | Skew ảnh hưởng trực tiếp slack setup/hold — nối thẳng Bài 8 |
| 5. Routing | Nối dây thật giữa các cell qua nhiều lớp kim loại | Cùng khái niệm routing/congestion đã học ở Bài 10 Mục 3 |
| 6. Signoff DRC/LVS | DRC kiểm hình học hợp lệ vật lý; LVS đối chiếu layout khớp đúng netlist | Bước mới — kiểm tra cuối cùng trước khi không thể sửa được nữa |
| 7. Xuất GDSII | File hình học nhị phân cuối cùng, gửi thẳng nhà máy đúc (foundry) | Điểm kết — không có bước "nạp lại" như bitstream FPGA |
Khác biệt cốt lõi với FPGA: mọi bước ở đây tạo ra hình học vĩnh viễn trên silicon. Sai 1 bước, phát hiện ở bước signoff hay tệ hơn là sau khi đã gửi đúc — không có nút "nạp lại bitstream khác" để sửa.
3. Corner PVT: mạch chậm nhất và nhanh nhất trong cùng 1 thiết kế
Cùng 1 con chip, cùng 1 thiết kế, nhưng transistor thật không bao giờ giống hệt nhau 100% giữa các lô sản xuất, và tốc độ transistor đổi theo điện áp/nhiệt độ lúc vận hành. Ba biến số này gộp thành PVT (Process/Voltage/Temperature), và STA phải kiểm ở nhiều corner (tổ hợp cực trị) khác nhau:
| Corner | Process | Điện áp | Nhiệt độ | Kiểm loại vi phạm nào |
|---|---|---|---|---|
| SS (Slow-Slow) | Chậm | Thấp | Cao | Setup — transistor chậm nhất có thể, nếu vẫn kịp deadline ở đây thì mọi chip sản xuất ra đều kịp |
| FF (Fast-Fast) | Nhanh | Cao | Thấp | Hold — transistor nhanh nhất có thể, dữ liệu "chạy" tới nơi sớm nhất, dễ vi phạm hold nhất |
Đây chính là lý do Bài 8 nhấn mạnh hold violation không sửa được bằng cách giảm tần số clock: hold bị kiểm ở corner FF — nhanh nhất có thể — hoàn toàn không phụ thuộc chu kỳ clock dài hay ngắn. Thiết kế ASIC thật phải "đạt" (sign off) ở tất cả corner cùng lúc, không chỉ 1 điều kiện lý tưởng.
4. Cạm bẫy: "Sạch cho FPGA" ≠ "Sạch cho ASIC"
Vì FPGA có mạng clock buffer toàn cục chuyên dụng và dư dả flip-flop, một số thói quen "chạy được" trên FPGA trở thành lỗi nghiêm trọng khi tổng hợp ASIC:
Muốn tiết kiệm công suất, nhiều người viết trực tiếp gated_clk = clk & enable. Trên
FPGA, mạng clock buffer toàn cục thường đủ dung sai để "nuốt" glitch nhỏ này. Trên ASIC —
không: nếu enable đổi giá trị không đúng lúc so với cạnh clock, cổng AND
tạo ra 1 glitch (xung giả) ngay trên đường dây clock — mọi flip-flop nhận
gated_clk có thể bị kích hoạt sai thời điểm, phá vỡ toàn bộ giả định timing của STA.
// ❌ SAI: tự chế bằng cổng AND thường — "sạch" trên FPGA, glitch trên ASIC
assign gated_clk = clk & enable; // enable đổi sát cạnh clock -> glitch thật
always_ff @(posedge gated_clk) begin
q <= d;
end
// ✅ ĐÚNG: dùng cell Integrated Clock Gating (ICG) chuẩn của standard cell
// library — bên trong là latch (không phải AND thường) giữ enable ỔN ĐỊNH
// trong suốt nửa chu kỳ clock đang mức cao, đảm bảo KHÔNG BAO GIỜ tạo glitch
// bất kể enable đổi lúc nào. Được suy luận tự động khi bạn viết đúng khuôn
// mẫu chuẩn (không tự ghép cổng AND tay):
// ⚠️ Ngoài subset VeriLite — engine không mô hình glitch/ICG cell thật.
always_latch begin
if (!clk) enable_latched = enable; // chốt enable khi clk đang thấp
end
assign gated_clk = clk & enable_latched; // AND ở đây AN TOÀN vì
// enable_latched đã ổn định
// từ trước, không đổi giữa chừng
Tool tổng hợp ASIC (Design Compiler, Genus, hoặc Yosys với thư viện có ICG cell) nhận diện đúng khuôn mẫu latch-based này và tự động thay bằng cell ICG chuyên dụng của thư viện — không bao giờ tự ghép cổng AND tay cho mục đích tạo clock mới.
5. Hệ sinh thái mã nguồn mở: OpenLane/OpenROAD → tape-out thật
Toàn bộ flow ở Mục 2 từng chỉ khả thi với license thương mại giá hàng triệu đô/năm. Ngày nay, OpenLane (đóng gói OpenROAD + Yosys + magic + nhiều công cụ mã nguồn mở khác thành 1 flow tự động) cho phép chạy toàn bộ 7 bước trên máy cá nhân, nhắm vào SkyWater 130nm PDK (thư viện standard cell + luật thiết kế mã nguồn mở đầu tiên được công nghiệp công nhận). Con đường tape-out thật cho người tự học: TinyTapeout — dự án cho phép nhiều người chia sẻ chung 1 lần đúc (multi-project wafer), mỗi người chỉ trả phần diện tích nhỏ mình dùng, nhận về chip thật đúc trên silicon vài tháng sau.
# Chạy TOÀN BỘ 7 bước ở Mục 2 chỉ bằng 1 lệnh, dùng SkyWater 130nm PDK
docker run -v $(pwd):/work -it efabless/openlane:latest \
./flow.tcl -design rca4 -tag run1
# Kết quả nằm trong runs/run1/results/:
# 1-synthesis/ -> netlist standard cell
# 2-floorplan/ -> die + IO ring
# 3-placement/ -> vi tri tung cell
# 4-cts/ -> mang clock tree
# 5-routing/ -> day dan that
# 6-signoff/ -> bao cao DRC/LVS/STA
# final/gds/ -> rca4.gds <- file GDSII gui thang nha may duc
6. Demo tương tác: Die Viewer ảo
Bấm từng lớp theo đúng thứ tự flow ở Mục 2 để xem die "hiện dần" — từ floorplan trống tới routing dày đặc; bấm "Zoom NAND2" để xem cận cảnh 1 standard cell ở mức layout (transistor + lớp kim loại).
Tóm lược
Bài này khép lại chặng đường vật lý cuối cùng từ RTL tới silicon thật:
-
✅ Standard cell library:
.lib(timing/power) +.lef(hình học) — bộ "LEGO" ASIC tổng hợp xuống, khác LUT của FPGA. - ✅ Flow vật lý 7 bước: synthesis → floorplan → placement → CTS → routing → signoff DRC/LVS → GDSII — hình học vĩnh viễn, không sửa lại được sau khi đúc.
- ✅ Corner PVT: setup kiểm ở SS (chậm nhất), hold kiểm ở FF (nhanh nhất) — đúng lý do hold không sửa được bằng giảm tần số.
- ✅ Cạm bẫy FPGA-clean ≠ ASIC-clean: tự chế clock gating bằng AND thường tạo glitch thật trên ASIC — phải dùng cell ICG chuẩn (latch-based).
- ✅ OpenLane/OpenROAD + SkyWater PDK: flow ASIC mã nguồn mở hoàn chỉnh, TinyTapeout mở đường tape-out thật cho người tự học.
Trắc nghiệm ôn tập
Câu 1
File .lib (Liberty) của 1 standard cell chứa thông tin gì?
Câu 2
Vì sao setup violation kiểm ở corner SS (Slow-Slow) còn hold violation kiểm ở corner FF (Fast-Fast)?
Câu 3
Vì sao tự chế clock gating bằng assign gated_clk = clk & enable; nguy hiểm hơn nhiều trên
ASIC so với FPGA?
Câu 4
TinyTapeout giải quyết vấn đề gì cho người tự học muốn có chip ASIC thật?
Tải file code thực hành minh họa bài học
File SystemVerilog gồm ví dụ clock gating ❌ tự chế vs ✅ latch-based chuẩn ICG, cộng ví dụ nội dung
.lib/.lef dạng comment tham khảo, kèm lệnh chạy flow OpenLane thật:
Bình luận