Simulator Làm Gì Trong DC, AC, Tran? — Và Tại Sao Mạch Của Bạn Không Chịu Converge
Hiểu cơ chế bên trong SPICE simulator — Newton-Raphson, operating point, timestep control — để debug convergence failure đúng chỗ thay vì chỉ tăng RELTOL đại.
Nội dung
- Simulator không phải “chạy mạch” — nó giải hệ phương trình
- DC Analysis: Tìm điểm cân bằng bằng Newton-Raphson
- AC Analysis: Tuyến tính hóa quanh operating point
- Transient Analysis: Tích phân theo thời gian
- Convergence Failure: Tại sao xảy ra và cách debug
- Tolerance settings: Bạn đang “nới” hay “phá” simulation?
- Bài học thực tế
1. Simulator không phải “chạy mạch” — nó giải hệ phương trình
Có một câu nói trong giới analog mà mình nghe khá nhiều lúc mới vào nghề:
“Đừng bao giờ tin vào simulator mà không phải mình viết ra.”
Câu này đúng về mặt nguyên tắc — simulator là một công cụ, và công cụ có thể cho kết quả sai nếu dùng không đúng cách. Nhưng trong thực tế hiện nay, với độ phức tạp của BSIM model, PDK, và hàng chục ngàn dòng code trong Spectre hay HSPICE… tự viết simulator từ đầu là điều không tưởng, kể cả với engineer 20 năm kinh nghiệm.
Vậy câu đó nên hiểu thế nào cho đúng?
Mình nghĩ ý nghĩa thực sự không phải là “tự code lại SPICE” — mà là: bạn phải biết simulator đang làm gì bên trong. Không phải để verify từng dòng code, mà để khi kết quả trông lạ, bạn biết hỏi đúng câu hỏi. Khi sim báo “no convergence”, bạn biết debug đúng chỗ thay vì Google rồi tăng RELTOL đại.
Bài này mình sẽ giải thích simulator làm gì trong ba loại analysis phổ biến nhất — DC, AC, và Transient — và từ đó giải thích tại sao convergence failure xảy ra, tại sao nó xảy ra ở chỗ đó, và bạn nên debug theo thứ tự nào.
2. DC Analysis: Tìm điểm cân bằng bằng Newton-Raphson
DC analysis (.dc hoặc .op) là bước tìm điểm làm việc (operating point) — tức là bộ điện áp và dòng điện khi mạch ở trạng thái tĩnh, tất cả tụ hở mạch, tất cả cuộn ngắn mạch.
Simulator đang giải bài toán gì?
Với mạch có node, simulator cần tìm điện áp sao cho tổng dòng tại mỗi node bằng 0 — tức là KCL thỏa mãn tại mọi node cùng một lúc. Nghe đơn giản, nhưng vì MOSFET và diode có đặc tính phi tuyến (dòng không tỉ lệ tuyến tính với áp), hệ này không giải được bằng đại số thông thường. Simulator phải dùng phương pháp lặp số.
Phương pháp đó là Newton-Raphson (NR).
Nếu muốn xem formulation đầy đủ dạng ma trận, tham khảo Vladimirescu, The SPICE Book, Chương 2.
Newton-Raphson: Ý tưởng bằng hình ảnh
Ý tưởng của NR rất trực quan. Lấy ví dụ hàm đơn giản — mình cần tìm sao cho , tức là chỗ đường cong cắt trục x.
NR làm như sau: bắt đầu từ điểm đoán , vẽ tiếp tuyến của tại đó, tìm chỗ tiếp tuyến cắt trục x — đó là điểm đoán tiếp theo . Lặp lại. Chỉ sau 5 bước, sai số đã xuống dưới — trong khi điểm đoán ban đầu còn cách nghiệm thật hơn 1 đơn vị.
Với mạch nhiều node, “tiếp tuyến” đó trở thành một ma trận (Jacobian — thực chất là ma trận conductance của mạch tại điểm hiện tại), nhưng ý tưởng hoàn toàn giống nhau. Chi tiết xem Kundert, The Designer’s Guide to SPICE and Spectre, Chương 3.
Mỗi vòng lặp NR, simulator làm 3 việc:
- Tuyến tính hóa tất cả thiết bị phi tuyến tại điểm hiện tại
- Giải hệ tuyến tính kết quả để tìm bước cập nhật
- Kiểm tra sai số — nếu đủ nhỏ thì dừng, không thì lặp tiếp
Ví dụ: Operating point của inverter CMOS
Xét inverter CMOS 180nm với , input = 0.9 V. Simulator cần tìm sao cho dòng qua PMOS và NMOS bằng nhau.
Bắt đầu từ , simulator tính dòng PMOS và NMOS tại điểm đó, thấy hai dòng chưa bằng nhau (sai số ≠ 0), cập nhật , lặp lại. Với inverter đơn giản, NR thường hội tụ sau 3–5 vòng lặp. Với OTA 5-transistor có thể cần 10–20 vòng. Với bandgap reference có feedback loop, có thể vài chục vòng — hoặc không hội tụ.
Điểm đoán ban đầu quan trọng như thế nào?
Rất quan trọng. NR chỉ hội tụ nếu điểm đoán ban đầu đủ gần nghiệm thực. Mặc định SPICE bắt đầu với tất cả node = 0 V — đây là lý do tại sao mạch có positive feedback hay latch hay bị convergence issues ở .op.
Nếu bắt đầu quá xa nghiệm — đặc biệt với mạch có nhiều trạng thái ổn định như flip-flop hay SRAM cell — NR có thể dao động giữa hai điểm mà không hội tụ, hoặc nhảy sang nghiệm sai.
3. AC Analysis: Tuyến tính hóa quanh operating point
Sau khi DC operating point được tìm thấy, AC analysis (.ac) làm một việc đơn giản hơn nhiều: tuyến tính hóa mạch tại điểm đó, rồi quét tần số.
Tại sao AC luôn nhanh hơn DC?
Sau khi linearize, hệ phương trình trở thành dạng — tuyến tính hoàn toàn, giải thẳng được mà không cần lặp NR. Simulator chỉ cần cập nhật giá trị tụ và cuộn theo tần số rồi giải lại — rất nhanh. Sweep 1000 điểm tần số chỉ cần giải 1000 hệ tuyến tính nhỏ, không có vòng lặp phi tuyến nào.
Simulator luôn chạy DC operating point trước — dù bạn có ghi hay không
Trên thực tế, simulator luôn chạy DC operating point ngầm trước khi bắt đầu AC — dù bạn có ghi .op tường minh hay không. Điều này có nghĩa là nếu bias của bạn không được set đúng, .ac vẫn chạy được và vẫn cho ra Bode plot — chỉ là Bode plot đó đang mô tả một mạch linearize tại điểm sai.
Ví dụ thực tế: nếu transistor trong OTA của bạn thực ra đang ở linear region thay vì saturation do bias sai, nhưng simulator vẫn tìm được .op (converge nhưng sai điểm), thì:
- tính từ BSIM model sẽ thấp hơn nhiều so với dự kiến
- Gain của OTA sẽ thấp hơn 10–20 dB so với hand calculation
- Phase margin trông đẹp nhưng thực ra đang model sai transistor
Bài học: Trước khi tin vào AC result, luôn check
.opoutput:Vgs,Vds,Vth, region (saturation/linear?), , . Kết quả AC chỉ có nghĩa khi operating point đúng.
4. Transient Analysis: Tích phân theo thời gian
Transient (.tran) là analysis phức tạp và mất thời gian nhất. Khác với DC, điện áp bây giờ thay đổi theo thời gian — nên dòng qua tụ () và cuộn () không còn bằng 0. Simulator phải tích phân từng bước nhỏ theo thời gian, tại mỗi bước lại dùng NR để tìm nghiệm — rồi mới bước tiếp.
Timestep control
Simulator tự điều chỉnh timestep (adaptive step) dựa trên tốc độ thay đổi của tín hiệu:
- Vùng signal phẳng → timestep lớn, chạy nhanh
- Edge của clock, switching event → timestep thu nhỏ để không bỏ sót
- NR không hội tụ tại một bước → giảm timestep và thử lại
Khi timestep cần thiết nhỏ hơn ngưỡng tối thiểu của simulator → transient convergence failure.
Ví dụ: Oscillator tần số cao với default timestep
Đây là tình huống hay gặp nhưng dễ bỏ qua vì sim không báo lỗi — nó chạy xong bình thường, chỉ là kết quả sai.
Giả sử bạn có LC oscillator chạy ở 2.4 GHz. Chu kỳ dao động là:
Default timestep trong SPICE thường là TSTEP = TSTOP / 100 — tức nếu bạn chạy .tran 10n mà không chỉ định gì thêm, simulator tự chọn timestep khoảng 100 ps. Với oscillator 2.4 GHz, mỗi chu kỳ chỉ được sample 4–5 điểm — hoàn toàn không đủ để reconstruct waveform chính xác.
Hệ quả thực tế: tần số oscillation đọc ra từ waveform bị lệch so với thực tế, biên độ steady-state không chính xác — có thể thấy amplitude drift theo thời gian dù mạch thật ổn định, và phase noise estimate từ transient sim hoàn toàn vô nghĩa.
Fix: Luôn set TSTEP tường minh, nhắm ít nhất 20 điểm mỗi chu kỳ — với 2.4 GHz thì cần timestep ≤ 20 ps:
* Sai — để simulator tự chọn timestep
.tran 10n
* Đúng — 20ps đủ để sample waveform 2.4GHz chính xác
.tran 20p 10n
Bài học: Với bất kỳ mạch oscillator hay high-frequency signal nào, luôn tính chu kỳ ngắn nhất rồi chia cho 20 để lấy
TSTEP. Sim chạy xong không có nghĩa là kết quả đúng.
Backward Euler vs Trapezoidal
Simulator dùng hai integration method chính:
| Backward Euler | Trapezoidal | |
|---|---|---|
| Độ chính xác | Thấp hơn (1st order) | Cao hơn (2nd order) |
| Ổn định | Unconditionally stable | Có thể sinh ringing số học |
| Dùng khi | Khởi động, timestep nhỏ, khó hội tụ | Steady state, timestep lớn hơn |
“Ringing số học” ở đây là numerical artifact — dao động xuất hiện trong waveform không phải vì mạch thật oscillate, mà vì Trapezoidal xử lý không tốt các step discontinuity. Nếu thấy ringing nhỏ ở output sau một switching event, hãy thử đổi sang Gear integration hay BDF — Backward Differentiation Formula (là một integration method khác dùng trong transient simulation, thay thế cho Trapezoidal.) trước khi kết luận mạch có vấn đề.
Nhiều simulator (Spectre, HSPICE) tự động switch giữa hai method — dùng Backward Euler lúc khởi đầu hoặc khi NR khó hội tụ, rồi chuyển sang Trapezoidal khi đã ổn định.
5. Convergence Failure: Tại sao xảy ra và cách debug
Bây giờ với nền tảng trên, mình có thể giải thích tại sao convergence failure xảy ra — và quan trọng hơn, loại nào thì debug ra sao.
5.1. DC Convergence Failure
Triệu chứng: ERROR: No convergence in DC analysis, hoặc .op không chạy xong.
a) Điểm đoán ban đầu quá xa nghiệm
Hay gặp nhất với mạch có feedback mạnh: bandgap reference, latch, SRAM cell. NR bắt đầu từ 0 V, nhưng nghiệm thực có thể là — khoảng cách quá lớn để NR hội tụ.
Fix: Dùng .ic để gợi ý simulator điểm gần nghiệm:
.ic V(vref) = 1.2
.ic V(out) = 0.9
Hoặc dùng nodeset (nhẹ hơn — chỉ là gợi ý, không ép buộc):
.nodeset V(vref) = 1.2
b) Mô hình thiết bị có discontinuity
Một số BSIM model version cũ có điểm gãy ở vùng transition linear/saturation hoặc gần . NR không thể nhảy qua điểm gãy.
Fix: Update PDK. Hoặc bật GMIN stepping — simulator tạm thời thêm conductance nhỏ giữa các node và GND để “mềm hóa” mạch, rồi giảm dần về 0:
.options gminstepping
c) Mạch thực sự không có operating point ổn định
Đôi khi đây là bug thiết kế thực sự, không phải vấn đề simulator. Một số tình huống hay gặp: bias chain bị hở do thiếu startup circuit (bandgap, current mirror self-biased), feedback dương quá mạnh khiến mạch không có điểm cân bằng ổn định ở DC, hoặc current source không đủ dòng để kéo node về điện áp hợp lệ.
Simulator báo convergence failure vì nó trung thực — nó không tìm được nghiệm vì nghiệm thật không tồn tại ở trạng thái bạn đang mô tả.
Fix: Không phải fix simulator — mà fix mạch. Thêm startup circuit, check bias chain, verify current budget.
5.2. AC Convergence — Thực ra rất hiếm
AC analysis ít khi fail vì hệ tuyến tính. Nếu AC “fail”, thường là do DC fail trước, hoặc có node floating — node không có DC path về GND.
Để hiểu tại sao node floating gây vấn đề: nhớ lại simulator đang giải hệ — tức là tìm điện áp tại mỗi node từ ma trận conductance . Nếu một node không có path nào về GND, conductance của node đó bằng 0 — tức là có một hàng trong ma trận toàn số 0. Ma trận có hàng toàn 0 thì không thể giải được (gọi là singular — tương tự như phương trình : không có nghiệm xác định). Simulator báo lỗi vì bài toán về mặt toán học không xác định.
Fix: Thêm resistor lớn (ví dụ 10 GΩ) từ node floating về GND — đủ để ma trận không còn singular, không ảnh hưởng đáng kể đến circuit behavior:
Rbias_fix vfloat 0 10G
5.3. Transient Convergence Failure
Triệu chứng: Transient timestep too small, hoặc sim dừng giữa chừng tại một thời điểm .
a) Edge rate của source signal = 0
Nguyên nhân hay gặp nhất, và dễ fix nhất. Voltage source với tr = 0 yêu cầu timestep vô cực nhỏ.
* Sai — edge rate = 0
Vclk in 0 PULSE(0 1.8 0 0 0 0.5n 1n)
* Đúng — edge rate 100ps thực tế hơn
Vclk in 0 PULSE(0 1.8 0 100p 100p 0.5n 1n)
b) Switching event quá đột ngột
Comparator bật, latch set, ESD clamp kích hoạt — những event này có điểm chung: trạng thái mạch thay đổi gần như không liên tục. Output nhảy từ 0 V lên trong thời gian cực ngắn.
NR tại timestep đó đang dùng trạng thái bước trước làm điểm đoán ban đầu — tức là nó “đứng” ở phía cũ của discontinuity. Nghiệm thực lại ở phía mới. Khoảng cách quá xa → NR không hội tụ.
Điểm dễ nhầm: simulator phản ứng bằng cách giảm timestep, nhưng giảm timestep không giúp ích gì ở đây. Giảm timestep chỉ hiệu quả khi tín hiệu thay đổi nhanh nhưng liên tục — vì khi đó timestep nhỏ hơn đồng nghĩa điểm đoán gần nghiệm hơn. Còn với discontinuity thật, hai phía của event vẫn cách nhau một khoảng cố định dù timestep nhỏ đến đâu. Kết quả: simulator cứ giảm timestep mãi cho đến khi chạm limit → fail.
Fix: Thêm .ic để gợi ý simulator trạng thái sau switching event, hoặc thêm RC nhỏ tại output của comparator để làm mềm edge — biến discontinuity thành transition có thời gian hữu hạn:
* Thêm RC nhỏ để làm mềm edge — rise time ~1ps, không ảnh hưởng behavior
Rsoft out out_soft 10
Csoft out_soft 0 0.1p
c) Trapezoidal ringing
Nếu có step discontinuity, Trapezoidal có thể sinh ra dao động số học. Simulator thấy “tín hiệu dao động” → cố giảm timestep → không cải thiện → fail.
Fix: Bật Gear integration nếu simulator hỗ trợ:
.options method=gear
6. Tolerance Settings: Bạn đang “nới” hay “phá” simulation?
Khi convergence fail, Google thường gợi ý “tăng RELTOL lên”. Nhưng nếu không hiểu tolerance nghĩa là gì, bạn có thể đang phá độ chính xác simulation mà không biết.
Ba tolerance chính
| Parameter | Mặc định | Nghĩa |
|---|---|---|
RELTOL | 1e-3 | NR coi là converge khi sai số tương đối < 0.1% |
ABSTOL | 1e-12 A | Sai số tuyệt đối dòng — dùng khi điện áp gần 0 |
VNTOL | 1e-6 V | Sai số tuyệt đối điện áp |
RELTOL = 1e-3 nghĩa là simulator coi kết quả đúng khi sai số < 0.1%. Với mạch analog thông thường, đây là đủ.
Nếu bạn tăng RELTOL = 1e-2 (1%) để fix convergence, bạn chấp nhận sai số 1% ở mọi node. Điều này thường ổn cho mạch digital hoặc kiểm tra rough behavior, nhưng không ổn khi đo: offset voltage của OTA (thường chỉ vài mV — sai 1% của 1.8 V = 18 mV >> offset thật), PSRR hay CMRR (cần accuracy cao ở nhiều tần số), hoặc noise simulation.
GMIN và TRTOL
GMIN (default: 1e-12 S): Conductance nhỏ nối song song với mọi junction, giúp tránh singular matrix. Tăng GMIN quá cao (> 1e-9) có thể làm sai bias point vì tạo ra leakage path không thực tế.
TRTOL (default: 7 trong SPICE3, 1 trong Spectre): Hệ số scale cho sai số tích phân trong transient. Tăng TRTOL → timestep lớn hơn → nhanh hơn nhưng kém chính xác. Đặc biệt nguy hiểm với mạch có tích phân (charge pump, integrator) vì sai số tích lũy theo thời gian.
Bài học: Tăng tolerance là giải pháp cuối cùng, không phải bước đầu tiên. Luôn debug nguyên nhân gốc trước.
Checklist debug theo thứ tự ưu tiên
DC convergence fail:
- Check
.opoutput — có node nào giá trị vô lý (< 0 V hoặc > VDD)? - Thêm
.ichoặc.nodesetgần nghiệm dự kiến - Check node floating — thêm R lớn về GND
- Thử
gminstepping - Cuối cùng: nới
RELTOLmột chút (1e-3 → 5e-3)
Transient convergence fail:
- Check edge rate của source — không dùng
tr = 0 - Check
.iccủa transient có hợp lý không - Thử
method=gearnếu có ringing - Check switching event có quá đột ngột không — thêm RC nhỏ để làm mềm edge
- Cuối cùng: tăng
TRTOL(cẩn thận với mạch tích phân)
7. Bài học thực tế
Bài học 1: Debug nguyên nhân gốc, không phải triệu chứng. Khi simulator báo convergence failure, nó đang nói với bạn rằng mạch đang mô tả một trạng thái vật lý không nhất quán hoặc quá khó để solver tìm nghiệm. Tăng tolerance che đi triệu chứng, không giải quyết vấn đề — và trong nhiều trường hợp, tạo ra kết quả sai mà không có warning nào.
Bài học 2: .op là bước quan trọng nhất, hay bị bỏ qua nhất. Trước khi chạy AC hay transient, mở .op output ra đọc: Vgs, Vds, Vth, gm, region. Nếu một transistor đang ở linear region khi bạn nghĩ nó đang ở saturation, mọi kết quả AC sau đó đều vô nghĩa — dù Bode plot trông rất đẹp.
Bài học 3: Sim chạy xong không có nghĩa là kết quả đúng. Đây là điểm nguy hiểm nhất — không có error message, không có warning, chỉ có kết quả sai im lặng. Oscillator với default timestep, OTA với bias sai region, transient với tr = 0 — tất cả đều cho ra waveform và number, chỉ là number đó không có nghĩa gì. Luôn sanity check bằng hand calculation trước khi tin vào sim.
Tổng kết
- DC: Newton-Raphson tìm điểm cân bằng bằng cách lặp — fail khi điểm đoán ban đầu xa nghiệm, model có discontinuity, hoặc mạch thật không có operating point ổn định
- AC: Tuyến tính hóa tại operating point, giải thẳng theo tần số — nhanh và ít fail, nhưng simulator luôn chạy
.opngầm trước, nên kết quả AC hoàn toàn phụ thuộc vào DC point đúng - Transient: Tích phân từng bước + NR tại mỗi timestep — fail khi signal thay đổi quá nhanh, timestep chạm limit, hoặc NR gặp discontinuity thật; default timestep có thể cho kết quả sai im lặng với mạch tần số cao
- Convergence failure có nguyên nhân cụ thể — debug có hệ thống theo checklist, không chỉ Google rồi tăng RELTOL
Tham khảo
-
Nagel, SPICE2: A Computer Program to Simulate Semiconductor Circuits, Memorandum No. ERL-M520, Electronics Research Laboratory, UC Berkeley, 1975 — tài liệu gốc định nghĩa thuật toán NR và MNA trong SPICE; đọc để hiểu tại sao các default tolerance và GMIN được chọn như vậy.
-
Baker, CMOS Circuit Design, Layout, and Simulation, 4th ed. — SPICE simulation basics và DC operating point analysis trong bối cảnh CMOS, có ví dụ netlist cụ thể. Website: cmosedu.com.
-
Kundert, The Designer’s Guide to SPICE and Spectre, Kluwer, 1995 — cuốn sâu nhất về thuật toán simulator từ góc độ người thiết kế analog; đặc biệt phần transient timestep control, integration methods, convergence failure, và discontinuity handling. Tiện nhắc đến huyền thoại Kundert, mình giới thiệu luôn các bạn trang web của ông: kunderts.com và Designers Guide— có rất nhiều bài viết bổ ích cho thiết kế analog và simulation.
-
Vladimirescu, The SPICE Book, Wiley, 1994 — reference thực tế cho tất cả SPICE options và tolerance settings, kèm giải thích ngắn gọn từng parameter; hữu ích khi cần tra cứu nhanh RELTOL, ABSTOL, GMIN, TRTOL.