HSPICE를 이용한 노드 capacitance 측정 회로 - 나도 먹고 살아야지

SPICE를 이용해 특정한 노드의 capacitance를 측정하고 싶다고 하자. 이를테면 inverter의 input capacitance, MOS 트랜지스터의 gate-source capacitance 값이 궁금할 수 있다. 시뮬레이션을 통해 capacitance를 간단히 측정하는 데에는 2가지 방법이 있다. (더 있을 수도 있지만 일단 필자는 2가지 방법을 알고 있다.)
  • RC 지연시간 이용
  • 입력 임피던스 이용
이번 글을 통해 두 가지 방법이 어떤 식으로 동작하는지 살펴보도록 하자.

RC 지연시간 이용

모든 전기회로를 저항과 capacitance 성분을 가지며, 두 값의 곱인 RC에 비례하여 신호 전달에 지연이 발생한다. 똑같은 저항으로 inverter 1과 2에 신호를 공급할 때, 두 inverter의 input capacitance값에 따라 inverter 입력 전압이 바뀌는 속도가 다르다. Capacitance가 큰 쪽의 inverter 입력 전압이 더 느리게 움직이게 될 것이다. 따라서, 모르는 capacitance값을 측정하려면 우리가 알고 있는 load capacitance를 쭉 늘어놓은 후, 지연시간이 같아지는 조합을 고르면 될 것이다. 이를테면, inverter input까지의 지연시간을 1fF, 2fF, ..., 10fF capacitance까지의 지연과 비교하여, 개중에 가장 오차가 작은 녀석을 택할 수 있다. 아래 코드는 이 과정을 좀 더 그럴 듯 하게 수행한다.
Find the input capacitance using Hspice optimizer

.lib 'my-transistor.lib' TT
.temp 25

.param vd=1V
.param CLOAD=OPTC(15fF, 1fF, 30fF)

* Power supplies
Vvdd vdd 0 dc vd
Vvss vss 0 dc 0

* Input waveform
Vin in 0 PULSE 0 vd 100ps 80ps 80ps 500ps 1u

* First circuit, uses the load we are trying to characterize
Xinv0_driver mid0 in vdd vss inv WP=2 WN=1
Xinv0_load out0 mid0 vdd vss inv WP=10 WN=5

* Second circuit, uses a parameterized load capacitor
Xinv1_driver mid1 in vdd vss inv WP=2 WN=1
Cload mid1 vss CLOAD

* Measure rising and falling edge (with respect to the output edge) time delays for
* the real copy of the circuit.
.measure TRAN tdr TRIG v(in) VAL='0.5*vd' FALL=1 TARG v(mid0) VAL='0.5*vd' RISE=1
.measure TRAN tdf TRIG v(in) VAL='0.5*vd' RISE=1 TARG v(mid0) VAL='0.5*vd' FALL=1
.measure TRAN tdavg PARAM='(tdr+tdf)/2'

* Measure the same parameters for the model circuit loaded by CLOAD
.measure TRAN tdrc TRIG v(in) VAL='0.5*vd' FALL=1 TARG v(mid1) VAL='0.5*vd' RISE=1
.measure TRAN tdfc TRIG v(in) VAL='0.5*vd' RISE=1 TARG v(mid1) VAL='0.5*vd' FALL=1
.measure TRAN tdavgc PARAM='(tdrc+tdfc)/2' GOAL=tdavg

* We set the GOAL to tdavg which will cause the optimizer to try
* select a CLOAD that cause tdavgc to match tdavg

.model OPT1 opt
.tran 1ps 1ns SWEEP OPTIMIZE=optc RESULTS=tdavgc MODEL=OPT1

.subckt inv out in pow gnd WP=2u WN=1u
mn out in gnd gnd W=WN L=LMIN * assume LMIN is defined in library
mp out in pow pow W=WP L=LMIN * assume LMIN is defined in library
.ends

.probe v(*)
.end

위의 코드를 사용하면 HSPICE가 자동으로 load capacitance를 찾아준다. 내장된 최적화 기능을 이용하지 않았다면 load capacitance를 일일히 바꿔가면서 지연 시간이 같아지는 값을 찾아야 했을 것이다. 한 가지 문제는 HSPICE 최적화 기능이 제대로 동작하지 않은 상황이 가끔 발생한다는 점이다. 필자는 최적화 기능을 그다지 많이 써보지 않아서 그런 적이 없지만, 이상한 결과가 나오는 경우가 있기는 한가보다. 최적화를 통해 구해진 값이 합리적인지는 스스로 확인해봐야 할 듯 싶다.

입력 임피던스(impedance) 이용

중학교 혹은 고등학교 때 배우는 옴의 법칙에 따르면 (전압)=(전류)x(저항)이고, 이를 확장시키면 (전압)=(전류)x(임피던스)로 나타낼 수 있다. 임피던스(impedance)의 실수부는 저항, 허수부는 capacitor나 inductor에 의한 리액턴스(reactance)가 된다. 일반적인 회로에서 inductance 성분은 무시해도 무방하다. 따라서, 구하려는 노드에 보이는 임피던스를 구한 후, 허수부만을 떼어냄으로써 capacitance를 측정할 수 있다. 아래 코드는 노드의 임피던스를 구하기 위한 HSPICE 코드이다.
Find the capacitance by measuring impedance

.lib 'my-transistor.lib' TT
.temp 25

.param P_VGS = 0
.param P_VDS = P_VGS

** Circuit description
mn vds vgs 0 0 nmos L=0.06 W=1

i_in 0 vin 0 ac=1 dc=0
v_vgs vgs vin 0
v_vds vds 0 P_VDS

** Simulation description
.option accurate ingold=2
.ic v(vin)=P_VGS
.ac LIN 1 1k 1k sweep P_VGS 0.1 1 0.1
.print v(vin) vp(vin)

.end

위의 코드는 독립 전류원을 이용해 소전류를 흘려보낸 후, 해당 노드의 전압을 측정하도록 되어 있다. 문제는 임피던스가 복소수 값을 가진다는 점이며, 따라서 전압 역시 복소수 형태로 나타난다. 복소수 전압 크기를 알아내기 크기와 위상을 따로 출력하도록 했다. 둘을 조합한 후 전류로 나누어 줌으로써 리액턴스를 찾아내고, (리액턴스)=1/(2*pi*(주파수)*(capacitance))임을 이용해 capacitance를 구할 수 있다.

덧글

  • GarcianX 2009/12/02 11:52 # 삭제 답글

    좋은 자료네요~ 찾고있었는데 ^^ㅋ 잘 보고 갑니다.
  • Steadfast 2009/12/09 16:50 #

    좋은데 쓰세요. ^^
  • 루트 2013/05/09 16:41 # 삭제 답글

    좋은 글 잘보겠습니다*^^*
  • pku 2014/06/24 04:52 # 삭제 답글

    좋은 자료 감사합니다.

    1. 그런데 이렇게 측정하는 것이랑
    dc simulation 하고 captab 옵션으로 각 노드의 cap을 측정하는 것과
    어떤 차이가 있는지요?

    2. 제 생각에는 게시물 코드로 측정하는 것이 더 정확할 것 같기는 한데
    captab으로 측정하는 것과 오차가 큰 편일까요?


댓글 입력 영역