SPICE3f5 와 ngspice 의 차이
SPICE3f5는 1993 년에 배포가 종료된 기준 구현이다. ngspice 는 그 소스를 출발점으로 삼아 결함을 고치고 기능을 더해 온 구현이며, 넷리스트(netlist) 문법과 소자 접두사, 해석 제어문의 뼈대를 그대로 유지한다. 그러므로 두 구현의 차이는 문법의 차이가 아니라 다룰 수 있는 범위의 차이다.
1. 차이의 축
섹션 제목: “1. 차이의 축”| 축 | SPICE3f5 | ngspice |
|---|---|---|
| 개발 | 1993 년 7 월 종료 | 계속 갱신된다 |
| 해석 종류 | 9 종 | 11 종 — .PSS · .SP 추가 |
| 소자 | §2 의 목록에 한정 | 소자 디렉터리 57 개 |
| 행렬 솔버(matrix solver) | 희소 LU 하나 | 희소 LU 와 KLU 중 선택 |
| 넷리스트 문법 | 상수와 .MODEL | 파라미터 · 수식 · 함수 정의 · 조건 |
| 비선형 종속 소스 | 다항식 계수 | 임의 수식 |
| 실행 형태 | 실행 파일 | 실행 파일과 공유 라이브러리(shared library) |
| 디지털 | 없음 | 이벤트 구동(event-driven) 엔진과 코드 모델(code model) |
| 소자 기술 언어 | 없음 | 컴파일된 Verilog-A 모델 적재 |
| 공정 소자 해석 | 없음 | 소자 물리 수준 해석기 포함 |
디지털 지원이 실무에서 가장 큰 차이를 만든다. §4 부터 그것만 따로 다룬다.
2. 소자 모델의 범위
섹션 제목: “2. 소자 모델의 범위”SPICE3f5 의 MOSFET 모델은 LEVEL 1 – 6 이며, 실체는 MOS1 · MOS2 · MOS3 · BSIM1 · BSIM2 · MOS6
여섯이다. 현대 공정의 파라미터 집합은 이 여섯 가운데 어느 것으로도 배포되지 않는다.
| 계열 | ngspice 가 추가로 수록하는 것 |
|---|---|
| MOS 대량생산 공정 | BSIM3 계열 · BSIM4 계열 |
| SOI 공정 | BSIM3SOI 계열 · BSIMSOI · SOI3 |
| 고전압·전력 | HiSIM-HV 계열 · VDMOS |
| 바이폴러 | VBIC · HICUM |
| 화합물 반도체 | HFET · MESA |
| 전송선(transmission line) | 결합 다중 도체 선로 · TXL |
| 소자 물리 수준 | 수치 다이오드 · 수치 BJT · 수치 MOS |
모델이 없으면 부품을 넣을 수 없다. 반도체 공급사가 배포하는 파라미터 집합이 어느 모델을 요구
하는지가 곧 시뮬레이터 선택의 조건이 된다 — 넷리스트가 같아도 .MODEL 카드가 요구하는 LEVEL
을 구현하지 않으면 해석이 서지 않는다.
3. 넷리스트 문법의 확장
섹션 제목: “3. 넷리스트 문법의 확장”SPICE3f5 의 넷리스트는 상수만 담는다. ngspice 는 파라미터와 수식을 담는다.
* 파라미터 정의와 수식 참조.param vdd=5 rload=2kV1 in 0 DC {vdd}R1 in out {rload}R2 out 0 {rload}* 임의 수식으로 기술한 비선형 종속 소스B1 sq 0 V = V(out)*V(out)Rb sq 0 1meg.end| 절점(node) | 값 |
|---|---|
v(in) | 5.000000 V |
v(out) | 2.500000 V |
v(sq) | 6.250000 V — v(out) 의 제곱 |
SPICE3f5 의 종속 소스는 다항식 계수 목록만 받으므로 같은 것을 적으려면 계수를 손으로 전개해야 한다. 파라미터 정의가 없으므로 소자값을 한 곳에서 바꾸는 방법도 없다 — 같은 값을 여러 줄에 되풀이해 적고, 바꿀 때 모두 고쳐야 한다.
4. 디지털 지원의 필요성
섹션 제목: “4. 디지털 지원의 필요성”기판에는 아날로그와 디지털이 함께 실린다. 그런데 디지털 블록을 아날로그 해석기로 다루려는 순간 네 가지가 동시에 막힌다.
| 제약 | 내용 |
|---|---|
| 모델 부재 | 논리 IC 의 내부 회로는 공개되지 않는다. 트랜지스터 수준 기술을 얻을 수 없다 |
| 미지수 증가 | 플립플롭 하나가 수십 개의 절점을 요구한다. 행렬이 그만큼 커진다 |
| 수렴(convergence) | 논리 소자는 강한 비선형이며, 스위칭 시점마다 뉴턴 반복이 늘어난다 |
| 시간 간격 | 아날로그 커널은 파형이 급변하는 구간에서 시간 간격을 좁힌다. 스위칭이 잦을수록 계산량이 늘어난다 |
해법은 디지털을 아날로그로 흉내 내는 것이 아니라, 디지털을 다른 방식으로 푸는 것이다. 논리 값은 연속량이 아니므로 상태가 바뀌는 순간에만 계산하면 된다. 이것이 이벤트 구동 방식이며, ngspice 는 아날로그 커널과 이벤트 구동 엔진을 같은 시간 축 위에서 함께 돌린다.
§6 의 4 비트 계수기가 이 차이를 수치로 보인다 — 플립플롭 네 개를 포함하고도 아날로그 미지수는 10 개이고, 각 단의 이벤트 기록은 17 · 9 · 5 · 3 건으로 절반씩 줄어든다. 이벤트 구동의 계산량은 시간 간격이 아니라 활동량에 비례한다.
5. 구현 방법
섹션 제목: “5. 구현 방법”5.1 두 엔진과 절점 타입
섹션 제목: “5.1 두 엔진과 절점 타입”| 아날로그 절점(analog node) | 이벤트 절점(event node) | |
|---|---|---|
| 값 | 전압 · 전류 (연속량) | 이산 값 |
| 계산 시점 | 시간 간격마다 | 상태가 바뀔 때 |
| 푸는 방법 | 연립 방정식 | 값 전파와 지연(delay) |
| 행렬 기여 | 있다 | 없다 |
이벤트 절점의 자료형은 하나가 아니다. 디지털 외에 실수와 정수 타입이 있고 사용자 정의 타입을 더할 수 있다 — 그래서 상태 기계나 계수값처럼 전압으로 표현할 이유가 없는 양을 그대로 나를 수 있다.
5.2 디지털 값은 두 축을 갖는다
섹션 제목: “5.2 디지털 값은 두 축을 갖는다”디지털 절점의 값은 상태 하나가 아니라 (상태 state, 세기 strength) 쌍이다.
| 축 | 값 |
|---|---|
| 상태 | 0 · 1 · U(미정) |
| 세기 | 강 · 저항성 · 고임피던스 · 미정 |
곱하면 12 가지 조합이 된다. 세기 축이 있어야 개방 컬렉터(open collector)와 삼상태(tri-state) 버스(bus)가 성립한다 — 아무도
구동하지 않는 버스는 고임피던스(high impedance)이고, 풀업이 있으면 저항성 1 이며, 강한 구동이 오면 그것이 이긴다.
미정 상태는 오류가 아니라 결과다. §6 의 계수기에서 클록의 아날로그 준위가 문턱(threshold) 구간을 지나는
동안 디지털 절점은 실제로 U 를 거친다 — 이벤트 기록에 그대로 남는다.
5.3 두 영역을 잇는 브릿지
섹션 제목: “5.3 두 영역을 잇는 브릿지”아날로그 절점과 이벤트 절점은 직접 연결되지 않는다. 사이에 브릿지(bridge)를 두어야 한다.
| 모델 | 방향 | 하는 일 |
|---|---|---|
adc_bridge | 아날로그 → 디지털 | 문턱 두 개로 전압을 0 · 1 · U 로 판정한다 |
dac_bridge | 디지털 → 아날로그 | 논리 값을 지정 전압으로 구동한다 |
bidi_bridge | 양방향 | 한 절점을 양쪽에서 구동한다 |
adc_bridge 의 파라미터
| 이름 | 기본값 | 뜻 |
|---|---|---|
in_low | 0.1 | 이 값 이하를 0 으로 판정한다 |
in_high | 0.9 | 이 값 이상을 1 로 판정한다 |
rise_delay · fall_delay | 1 ns | 판정 결과가 나타나기까지의 지연 |
두 문턱 사이 구간은 U 다. 문턱을 하나로 두지 않는 이유가 여기에 있다 — 판정할 수 없는 구간을
0 이나 1 로 밀어 넣지 않고 미정으로 남긴다.
dac_bridge 의 파라미터
| 이름 | 기본값 | 뜻 |
|---|---|---|
out_low · out_high | 0 · 1 | 0 · 1 에 대응하는 출력 전압 |
out_undef | 0.5 | U 에 대응하는 출력 전압 |
input_load | 1 pF | 구동하는 쪽이 보는 용량성 부하 |
t_rise · t_fall | 1 ns | 출력 전이 시간 |
6. 표본 ① — 아날로그 · 디지털 · 아날로그 경로
섹션 제목: “6. 표본 ① — 아날로그 · 디지털 · 아날로그 경로”정현파를 판정해 디지털로 바꾸고, 디지털 영역에서 반전한 뒤, 다시 아날로그로 되돌린다.
Mixed signal chainV1 ain 0 SIN(1.65 1.65 1k)A1 [ain] [dout] adc1.model adc1 adc_bridge(in_low=1.0 in_high=1.5 rise_delay=1n fall_delay=1n)A2 dout dinv inv1.model inv1 d_inverter(rise_delay=5n fall_delay=5n input_load=0.5p)A3 [dinv] [aout] dac1.model dac1 dac_bridge(out_low=0 out_high=3.3 out_undef=1.65 t_rise=2n t_fall=2n)Rl aout 0 1k.tran 0.5u 1.2m.end결과 — 한 주기에서 뽑은 값이다.
v(ain) | v(aout) | 판정 |
|---|---|---|
| 3.30000 V | 0.00000 V | in_high 위 → 1 → 반전 0 |
| 2.15988 V | 0.00000 V | in_high 위 → 1 |
| 1.65000 V | 0.00000 V | in_high 위 → 1 |
| 1.14012 V | 1.65000 V | 문턱 사이 → U → out_undef |
| 0.68016 V | 3.30000 V | in_low 아래 → 0 → 반전 1 |
| 0.00000 V | 3.30000 V | in_low 아래 → 0 |
출력은 두 준위가 아니라 세 준위로 나온다. 가운데 1.65 V 는 결함이 아니라 out_undef 가 그대로
나온 것이며, 입력이 판정 구간에 있었다는 사실을 파형이 그대로 알려 준다. 문턱 설정이 실제 회로와
맞지 않으면 이 구간이 넓어지므로, 브릿지의 파라미터를 실제 소자의 입력 문턱에 맞추어야 한다.
7. 표본 ② — 순수 디지털 블록
섹션 제목: “7. 표본 ② — 순수 디지털 블록”아날로그 클록을 판정해 들여보내고, 디지털 영역에서 4 비트 리플 계수기(ripple counter)를 구성한 뒤, 각 비트를 다시 아날로그로 꺼낸다.
Ripple counterVclk clk 0 PULSE(0 3.3 0 1n 1n 499n 1u)A0 [clk] [dclk] adcx.model adcx adc_bridge(in_low=1.0 in_high=2.0)A1 dq0b dclk NULL NULL dq0 dq0b dffxA2 dq1b dq0b NULL NULL dq1 dq1b dffxA3 dq2b dq1b NULL NULL dq2 dq2b dffxA4 dq3b dq2b NULL NULL dq3 dq3b dffx.model dffx d_dff(rise_delay=1n fall_delay=1n ic=0)A5 [dq0 dq1 dq2 dq3] [q0 q1 q2 q3] dacx.model dacx dac_bridge(out_low=0 out_high=3.3 out_undef=1.65).tran 10n 16u.end각 단은 자기 반전 출력을 자기 데이터 입력에 되먹여 2 분주기가 된다. 쓰지 않는 set · reset 입력은
NULL 로 둔다.
결과 — 1 µs 마다 읽은 네 비트다. 3.3 V 를 1 로 읽는다.
| 시각 | q3 q2 q1 q0 | 값 |
|---|---|---|
| 1.5 µs | 0 0 1 0 | 2 |
| 2.5 µs | 0 0 1 1 | 3 |
| 3.5 µs | 0 1 0 0 | 4 |
| 4.5 µs | 0 1 0 1 | 5 |
| 5.5 µs | 0 1 1 0 | 6 |
| 6.5 µs | 0 1 1 1 | 7 |
| 7.5 µs | 1 0 0 0 | 8 |
| 8.5 µs | 1 0 0 1 | 9 |
| 9.5 µs | 1 0 1 0 | 10 |
7.1 계산량의 근거
섹션 제목: “7.1 계산량의 근거”| 측정 항목 | 값 |
|---|---|
| 아날로그 미지수 | 10 개 — clk · q0–q3 · 전압원 분기 · 브릿지 분기 넷 |
| 플립플롭(flip-flop) 네 개가 행렬에 더하는 미지수 | 0 개 |
이벤트 기록 — dq0 · dq1 · dq2 · dq3 | 17 · 9 · 5 · 3 건 |
이벤트 기록 — dclk | 50 건 |
단마다 이벤트이 절반으로 줄어든다. 아날로그 해석이었다면 뒷단도 앞단과 같은 시간 간격으로 계산
되었을 것이다. dclk 의 항목이 클록 에지 수보다 많은 이유는 에지마다 U 를 한 번 거치기
때문이다 — 아날로그 준위가 in_low 와 in_high 사이를 지나는 동안의 상태가 그대로 기록된다.
8. 디지털 코드 모델
섹션 제목: “8. 디지털 코드 모델”ngspice 46 계열이 수록하는 디지털 코드 모델은 32 종이다.
| 갈래 | 모델 |
|---|---|
| 브릿지 | adc_bridge · dac_bridge · bidi_bridge |
| 조합 논리 | d_and · d_nand · d_or · d_nor · d_xor · d_xnor · d_inverter · d_buffer |
| 버스 구동 | d_tristate · d_open_c · d_open_e · d_pullup · d_pulldown |
| 기억 소자 | d_dff · d_jkff · d_srff · d_tff · d_dlatch · d_srlatch · d_ram |
| 자극 | d_source · d_osc · d_pwm |
| 함수·상태 | d_lut · d_genlut · d_state · d_fdiv |
| 외부 결합 | d_process · d_cosim |
이벤트 절점의 실수·정수 자료형을 다루는 모델이 따로 있다 — real · int · d_to_real ·
real_to_v · real_delay · real_gain. 아날로그 전압으로 바꾸지 않고 값 자체를 나르는 경로다.
9. 배포 조건
섹션 제목: “9. 배포 조건”| 대상 | 조건 |
|---|---|
| SPICE3f5 | BSD |
| ngspice 본체 | Modified BSD |
| 이벤트 구동·코드 모델 부분 | 퍼블릭 도메인 |
| 일부 하위 구성 요소 | 그 구성 요소마다 별도 조건이 붙는다 |
전체가 한 조건이 아니다. 소스를 가져다 쓰거나 재배포할 때는 파일 단위로 조건을 확인해야 한다 — 특히 행렬 솔버, 파라미터 처리, 소자 기술 언어 적재, 표 기반 코드 모델은 본체와 조건이 다르다.
10. 정리
섹션 제목: “10. 정리”| 요구 | 선택 |
|---|---|
| 1993 년의 기준 결과를 재현한다 | SPICE3f5 |
| 현대 공정의 소자 파라미터를 쓴다 | ngspice — 모델 계열이 조건이다 |
| 넷리스트를 파라미터로 다룬다 | ngspice |
| 아날로그와 디지털이 섞인 회로를 본다 | ngspice — 이벤트 구동 엔진과 브릿지 |
| 응용 프로그램에 해석기를 내장한다 | ngspice — 공유 라이브러리 |
두 구현은 대립하지 않는다. SPICE3f5 는 결과를 대조할 기준이고, ngspice 는 그 기준을 유지한 채 범위를 넓힌 구현이다. 해석 결과가 갈리면 먼저 의심할 것은 소자 모델과 해석 옵션이지 커널이 아니다.