2024년 3월 12일 화요일

반도체 공정을 설명하는 영상 두편, 그리고 표준 셀 D-FlipFlop 제작 노트

반도체 공정을 설명하는 영상 두편, 그리고 표준 셀 D-FlipFlop 제작 노트

모래에서 웨이퍼 그리고 반도체 트랜지스터가 되기까지 과정을 보여주는 동영상

p-채널/n-채널 트랜지스터 그리고 인버터 레이아웃

-------------------

셋과 리셋이 달려있는 D 플립플롭 표준 셀: DFFSR

74HC74 D-FlipFlop의 데이터 쉬트 중 기능 도(Functional Diagram)

트랜지스터 회로도 그리기

오픈소스 도구 XSChem 사용 트랜지스터 회로도 그리기

표준 셀 레이아웃

표준 셀의 기하학적 기준

오픈-소스 도구 Magic 사용 표준 셀 DFFSR의 레이아웃


레이아웃과 회로도 비교(LVS, Layout vs. Schematic)

        NetGen: 트랜지스터 수준 네트리스트 비교에 사용된 오픈-소스 도구

SPICE 시뮬레이션

Magic 레이아웃에서 추출한 트랜지스터 네트리스트

    * NGSPICE file created from DFFSR.ext - technology: scmos
    .option scale=0.15u

    .subckt DFFSR D S R CLK Q vdd gnd

    M1000 a_64_14# a_60_10# gnd gnd nfet w=40 l=4
    +  ad=0.16n pd=48u as=0.4n ps=60u
    M1001 a_126_86# CLK vdd vdd pfet w=40 l=4
    +  ad=0.56n pd=0.108m as=0.32n ps=56u
    M1002 a_146_14# a_126_86# a_60_10# gnd nfet w=20 l=4
    +  ad=0.16n pd=36u as=0.16n ps=36u
    M1003 a_296_14# S a_380_14# gnd nfet w=40 l=4
    +  ad=0.64n pd=0.112m as=0.16n ps=48u
    M1004 gnd a_326_14# Q gnd nfet w=20 l=4
    +  ad=0.28n pd=68u as=0.28n ps=68u
    M1005 a_36_10# S a_64_14# gnd nfet w=40 l=4
    +  ad=0.64n pd=0.112m as=0.16n ps=48u
    M1006 a_146_14# a_122_10# a_60_10# vdd pfet w=20 l=4
    +  ad=0.3n pd=56u as=0.16n ps=36u

        ......

    M1029 vdd a_326_14# Q vdd pfet w=40 l=4
    +  ad=0.56n pd=0.108m as=0.56n ps=0.108m
    M1030 a_296_14# a_122_10# a_276_14# vdd pfet w=20 l=4
    +  ad=0.28n pd=68u as=0.16n ps=36u
    M1031 a_380_14# a_326_14# gnd gnd nfet w=40 l=4
    +  ad=0.16n pd=48u as=0.36n ps=58u
    C0 Q gnd 7.47f
    C1 CLK gnd 9.24f
    C2 D gnd 3.67f
    C3 S gnd 13.8f
    C4 R gnd 14.2f
    C5 vdd gnd 53.3f
        ......

    .ends

ETRI 공정 파라메터를 적용한 SPICE 테스트 벤치

    * NGSPICE TB
    *.include 05cmos_model_spice_231025.lib
    .include amic5_mosfet_model.lib
    .include DFFSR.spice
    
XDFFSR_0 D S R CLK Q VDD GND DFFSR
    R0 VDD Q 5000
    VDD VDD GND 5
    
VSin S GND PWL(0n 5 40n 5 50n 0 140n 0 150n 5)
    VRin R GND PWL(0n 5 240n 5 250n 0 340n 0 350n 5)
    VDin D GND PWL(0n 0 540n 0 550n 5 740n 5 750n 0)
    VClk CLK GND pulse(0 5.0 100n 10n 10n 80n 200n)

    .tran 0.01n 800n
    .save all
    .control

    run

    plot S CLK Q
    plot R CLK Q
    plot D CLK Q

    .endc

    .GLOBAL VDD
    .GLOBAL GND

    .end

오픈-소스 회로시뮬레이터 ngSPICE 사용

입력 S:

입력 R:

입력 D:

클럭 CLK:

출력 Q:

클럭 CLK와 출력 Q:

표준 셀 DFFSR의 타이밍 시뮬레이션 베릴로그(Verilog) 모델

* 주의: 아래 모델의 지연 파라메터는 실제 공정을 반영하고 있지 않음

`celldefine
module DFFSR (CLK, D, R, S, Q);
input  CLK ;
input  D ;
input  R ;
input  S ;
output Q ;
reg NOTIFIER ;

   not (I0_CLEAR, R);
   not (I0_SET, S);
   udp_dff (P0003, D_, CLK, I0_SET, I0_CLEAR, NOTIFIER);
   not (D_, D);
   not (P0002, P0003);
   buf (Q, P0002);
   and (\D&S , D, S);
   not (I7_out, D);
   and (\~D&R , I7_out, R);
   and (\S&R , S, R);

   specify
     // delay parameters
     specparam
       tphlh$S$Q = 0.46:0.46:0.46,
       tpllh$R$Q = 0.33:0.33:0.33,
       tphhl$R$Q = 0.4:0.41:0.41,
       tpllh$CLK$Q = 0.57:0.57:0.57,
       tplhl$CLK$Q = 0.65:0.65:0.65,
       tminpwl$S = 0.064:0.26:0.46,
       tminpwl$R = 0.043:0.23:0.41,
       tminpwh$CLK = 0.32:0.49:0.65,
       tminpwl$CLK = 0.3:0.33:0.37,
       tsetup_negedge$D$CLK = 0.094:0.094:0.094,
       thold_negedge$D$CLK = 0.094:0.094:0.094,
       tsetup_posedge$D$CLK = 0.19:0.19:0.19,
       thold_posedge$D$CLK = 0.000000062:0.000000062:0.000000062,
       trec$R$CLK = -0.19:-0.19:-0.19,
       trem$R$CLK = 0.28:0.28:0.28,
       trec$R$S = 0.000000062:0.000000062:0.000000062,
       trec$S$CLK = 0:0:0,
       trem$S$CLK = 0.19:0.19:0.19,
       trec$S$R = 0.094:0.094:0.094;

     // path delays
     (CLK *> Q) = (tpllh$CLK$Q, tplhl$CLK$Q);
     (R *> Q) = (tpllh$R$Q, tphhl$R$Q);
     (S *> Q) = (tphlh$S$Q, 0);
     $setup(negedge D, posedge CLK &&& \S&R , tsetup_negedge$D$CLK, NOTIFIER);
     $hold (negedge D, posedge CLK &&& \S&R , thold_negedge$D$CLK,  NOTIFIER);
     $setup(posedge D, posedge CLK &&& \S&R , tsetup_posedge$D$CLK, NOTIFIER);
     $hold (posedge D, posedge CLK &&& \S&R , thold_posedge$D$CLK,  NOTIFIER);
     $recovery(posedge R, posedge CLK &&& \D&S , trec$R$CLK, NOTIFIER);
     $removal (posedge R, posedge CLK &&& \D&S , trem$R$CLK, NOTIFIER);
     $recovery(posedge R, posedge S, trec$R$S, NOTIFIER);
     $recovery(posedge S, posedge CLK &&& \~D&R , trec$S$CLK, NOTIFIER);
     $removal (posedge S, posedge CLK &&& \~D&R , trem$S$CLK, NOTIFIER);
     $recovery(posedge S, posedge R, trec$S$R, NOTIFIER);
     $width(negedge S, tminpwl$S, 0, NOTIFIER);
     $width(negedge R, tminpwl$R, 0, NOTIFIER);
     $width(posedge CLK, tminpwh$CLK, 0, NOTIFIER);
     $width(negedge CLK, tminpwl$CLK, 0, NOTIFIER);

   endspecify

endmodule
`endcelldefine

primitive udp_dff (out, in, clk, clr, set, NOTIFIER);
   output out;
   input  in, clk, clr, set, NOTIFIER;
   reg    out;

   table

// in  clk  clr   set  NOT  : Qt : Qt+1
//
   0  r   ?   0   ?   : ?  :  0  ; // clock in 0
   1  r   0   ?   ?   : ?  :  1  ; // clock in 1
   1  *   0   ?   ?   : 1  :  1  ; // reduce pessimism
   0  *   ?   0   ?   : 0  :  0  ; // reduce pessimism
   ?  f   ?   ?   ?   : ?  :  -  ; // no changes on negedge clk
   *  b   ?   ?   ?   : ?  :  -  ; // no changes when in switches
   ?  ?   ?   1   ?   : ?  :  1  ; // set output
   ?  b   0   *   ?   : 1  :  1  ; // cover all transistions on set
   1  x   0   *   ?   : 1  :  1  ; // cover all transistions on set
   ?  ?   1   0   ?   : ?  :  0  ; // reset output
   ?  b   *   0   ?   : 0  :  0  ; // cover all transistions on clr
   0  x   *   0   ?   : 0  :  0  ; // cover all transistions on clr
   ?  ?   ?   ?   *   : ?  :  x  ; // any notifier changed

   endtable
endprimitive // udp_dff

표준 셀 DFFSR의 합성기용 리버티(Liberty) 모델

* 주의: 아래 모델의 지연 파라메터는 실제 공정을 반영하고 있지 않음

    library(etri05_stdcells) {
        ......

        cell (DFFSR) {
            area : 1584;
            cell_leakage_power : 0.532978;
            ff (P0002,P0003) {
                next_state : "D";
                clocked_on : "CLK";
                clear : "(!R)";
                preset : "(!S)";
                clear_preset_var1 : L;
            }
            pin(CLK)  {
                direction : input;
                capacitance : 0.0161478;
                ......
            }
            pin(D)  {
                direction : input;
                capacitance : 0.0162024;
                rise_capacitance : 0.0161472;
                fall_capacitance : 0.0162024;
                internal_power() {
                    rise_power(passive_energy_template_6x1) {
                    ......
                    }
                    fall_power(passive_energy_template_6x1) {
                    ......
                    }
                }
                timing() {
                  related_pin : "CLK";
                  timing_type : hold_rising;
                  when : "S&R";
                  sdf_cond : "S\&R";
                  rise_constraint(hold_template_3x6) {
                    ......
                  }
                  fall_constraint(hold_template_3x6) {
                    ......
                  }
               }
            }
            pin(Q)  {
                direction : output;
                capacitance : 0;
                rise_capacitance : 0;
                fall_capacitance : 0;
                max_capacitance : 0.408128;
                function : "P0002";

                ......
            }
            pin(R)  {
                ......
            }
            pin(S)  {
                ......
            }
        }
    }

* 리버티는 합성기에서 참조하는 모델이다. 타이밍 구동 합성을 지원하지 않는 Yosys 합성기는 셀의 입출력 핀의 기능을 참조하여 테크놀로지 매핑을 실시한다. 위의 DFFSR 셀의 기능은 플립-플롭 ff() 으로 D 핀의 입력이 CLK에 의해 출력 Q 로 반영됨을 기술하고 있다. 복합 게이트 AOI21 의 경우 출력 Y의 기능은 입력 A, B, C의 논리식으로 표현 된다.

cell (AOI21X1) {
  pin(Y)  {
    direction : output;
    capacitance : 0;
    rise_capacitance : 0;
    fall_capacitance : 0;
    max_capacitance : 0.375698;
    function : "(!((A B)+C))";

    ......

    }
  ......
}

--------------------


댓글 없음:

댓글 쓰기