Languages

CommunityCategory: MODELZENHSPICE나 Spectre 테스트벤치를 XMODEL 테스트벤치로 변환하는 방법

MODELZEN

HSPICE나 Spectre 테스트벤치를 XMODEL 테스트벤치로 변환하는 방법

SA Support Team Staff 2019-07-12

기존에 작성하였던 HSPICE 또는 Spectre 시뮬레이션 테스트벤치를 XMODEL 시뮬레이션에 재사용하고 싶습니다. Verilog-SPICE co-simulation을 수행하는 방법도 있겠지만, 빠른 속도를 위해서는 SPICE 테스트벤치를 동등한 XMODEL 테스트벤치로 바꾸는 것이 좋다고 생각합니다. 수작업을 하지 않고 자동변환하는 방법이 있을까요?

1 Answers
Best Answer
SA Support Team Staff 2019-07-12

예, 있습니다. HSPICE, Spectre 등 SPICE 시뮬레이션을 위한 테스트벤치가 텍스트 파일 형태로 기술된 경우, MODELZEN은 이 파일을 읽어서 상당한 부분을 동등한 XMODEL 테스트벤치로 자동변환할 수 있습니다.

예를 들어, 아래와 같은 HSPICE 테스트벤치 파일이 tb_hspice.sp로 저장된 경우:

tb_hspice.sp:

* SPICE testbench example

* parameters
.param sup=1.2
+      amp=2.0


* stimuli sources
v0 vdd gnd dc=sup
v1 vss gnd dc=0

v2 vpwl gnd PWL ( 0 0 10n 1.0 15n 1.0 20n 0 )
v3 vpls gnd DC=0 PULSE (0 1.5 10n 1n 1n 20n 40n)
v4 vsin gnd SIN (0 amp 1MEG)

* DUT instance
X1 n1 n2 n3 subckt_DUT p1=1 p2=2

* measurements
.measure tran delay trig v(n1) val=0.5 rise=1 targ v(n2) val=0.5 rise=1
.measure tran level find v(n3) at=10n

아래와 같이 MODELZEN을 커맨드라인 명령으로 실행하면 이를 XMODEL 테스트벤치로 변환할 수 있습니다.

modelzen tb_hspice.sp -o tb_hspice.sv --top TB

여기서 -o 옵션은 출력 파일이름을, --top 옵션은 생성되는 최상위 모듈의 이름을 정의합니다 (기본값: __TOP__).

위의 tb_hspice.sp 테스트벤치 파일을 tb_hspice.sv로 변환한 결과는 다음과 같습니다.

tb_hspice.sv:

`include "xmodel.h"

// TOP-LEVEL MODULE TB
module TB ();

parameter real m = 1.0;

xreal n1;
xreal n2;
xreal n3;
xreal vdd;
xreal vpls;
xreal vpwl;
xreal vsin;
xreal vss;

subckt_DUT #(.p1(1), .p2(2), .m(m)) X1 (n1, n2, n3);
vsource #(.mode("dc"), .dc(1.2), .m(m)) v0 (.pos(vdd), .neg(`ground), .in(`ground));
vsource #(.mode("dc"), .dc(0), .m(m)) v1 (.pos(vss), .neg(`ground), .in(`ground));
xreal XMODEL_VPWL_v2;
pwl_gen #(.data('{0,0,1e-08,1,1.5e-08,1,2e-08,0}), .repeat_pos(0), .period(-1), .delay(0)) XMODEL_VPWL_INST_v2 (XMODEL_VPWL_v2);
vsource #(.m(m)) v2 (.pos(vpwl), .neg(`ground), .in(XMODEL_VPWL_v2));
xreal XMODEL_VSIN_v4;
sin_gen #(.offset(0), .amp(2), .freq(1e+06)) XMODEL_VSIN_INST_v4 (XMODEL_VSIN_v4);
vsource #(.m(m)) v4 (.pos(vsin), .neg(`ground), .in(XMODEL_VSIN_v4));
xreal XMODEL_VPWL_v3;
pwl_gen #(.data('{0,0,1e-08,0,1.1e-08,1.5,3.1e-08,1.5,3.2e-08,0}), .repeat_pos(1e-08), .period(4e-08), .delay(0)) XMODEL_VPWL_INST_v3 (XMODEL_VPWL_v3);
vsource #(.m(m)) v3 (.pos(vpls), .neg(`ground), .in(XMODEL_VPWL_v3));

// .measure tran level find v(n3) at=10n
real        level;
xbit        DEVO_MEAS_level_trig;
trig_time   #(.delay(1e-08), .period(0))
            DEVO_MEAS_level_1 (.out(DEVO_MEAS_level_trig));
meas_value  DEVO_MEAS_level_2 (.in(n3), .trig(DEVO_MEAS_level_trig), .out(level));

// .measure tran delay trig v(n1) val=0.5 rise=1 targ v(n2) val=0.5 rise=1
real        delay;
xbit        DEVO_MEAS_delay_trig1, DEVO_MEAS_delay_trig2;
trig_rise   #(.threshold(0.5), .delay(0), .times(1))
            DEVO_MEAS_delay_1 (.in(n1), .out(DEVO_MEAS_delay_trig1));
trig_rise   #(.threshold(0.5), .delay(0), .times(1))
            DEVO_MEAS_delay_2 (.in(n2), .out(DEVO_MEAS_delay_trig2));
meas_delay  DEVO_MEAS_delay_3 (.from(DEVO_MEAS_delay_trig1), .to(DEVO_MEAS_delay_trig2), .out(delay));

endmodule

그리고, 다음은 Spectre 테스트벤치를 변환하는 예입니다. 아래의 tb_spectre.scs 테스트벤치 파일을 다음의 명령을 통해 변환하면, 결과파일인 tb_spectre.sv이 생성됩니다. 앞 예제와 다른 점은 입력 파일의 형식을 Spectre 형식으로 지정하는 –f spectre 옵션이 추가된 것 뿐입니다.

modelzen tb_spectre.scs -o tb_spectre.sv --top TB -f spectre
tb_spectre.scs:

// Spectre testbench example

// parameters
parameters sup=1.2
parameters amp=2.0

// stimuli sources
v0 ( vdd gnd ) vsource dc=sup
v1 ( vss gnd ) vsource dc=0

v2 ( vpwl gnd ) vsource type=pwl wave=[0 0 10n 1.0 15n 1.0 20n 0]
v3 ( vpls gnd ) vsource type=pulse val0=0 val1=1.5 delay=10n rise=1n fall=1n width=20n period=40n
v4 ( vsin gnd ) vsource type=sine dc=0 ampl=amp freq=1MEG

// DUT instance
X1 ( n1 n2 n3 ) subckt_DUT p1=1 p2=2


tb_spectre.sv:

`include "xmodel.h"

// TOP-LEVEL MODULE TB
module TB ();

parameter real m = 1.0;

xreal gnd;
xreal n1;
xreal n2;
xreal n3;
xreal vdd;
xreal vpls;
xreal vpwl;
xreal vsin;
xreal vss;

xreal XMODEL_VPWL_v3;
pwl_gen #(.data('{0,0,1e-08,0,1.1e-08,1.5,3.1e-08,1.5,3.2e-08,0}), .repeat_pos(1e-08), .period(4e-08), .delay(0)) XMODEL_VPWL_INST_v3 (XMODEL_VPWL_v3);
vsource #(.m(m)) v3 (.pos(vpls), .neg(gnd), .in(XMODEL_VPWL_v3));
subckt_DUT #(.p1(1), .p2(2), .m(m)) X1 (n1, n2, n3);
vsource #(.mode("dc"), .dc(1.2), .m(m)) v0 (.pos(vdd), .neg(gnd), .in(`ground));
vsource #(.mode("dc"), .dc(0), .m(m)) v1 (.pos(vss), .neg(gnd), .in(`ground));
xreal XMODEL_VPWL_v2;
pwl_gen #(.data('{0,0,1e-08,1,1.5e-08,1,2e-08,0}), .repeat_pos(0), .period(-1), .delay(0)) XMODEL_VPWL_INST_v2 (XMODEL_VPWL_v2);
vsource #(.m(m)) v2 (.pos(vpwl), .neg(gnd), .in(XMODEL_VPWL_v2));
xreal XMODEL_VSIN_v4;
sin_gen #(.offset(0), .amp(2), .freq(1e+06)) XMODEL_VSIN_INST_v4 (XMODEL_VSIN_v4);
vsource #(.m(m)) v4 (.pos(vsin), .neg(gnd), .in(XMODEL_VSIN_v4));

endmodule

참고로, SPICE 또는 Spectre 테스트벤치 파일에는 시뮬레이션 대상 회로에 인가하는 자극(stimuli)을 생성하는 부분, 그리고 그 대상회로의 반응을 측정(measure)하는 부분 외에도 SPICE 시뮬레이터 또는 공정 모델에 특수한 내용을 담고 있을 수 있습니다. MODELZEN이 SPICE 또는 Spectre의 모든 구문을 지원하는 것은 아니므로, 자동변환이 되지 않는 부분이 있으면 일부 수작업을 하셔야 합니다.