2023년 12월 31일 일요일

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [9]/입출력 패드 붙이기

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [9]

IX. 입출력 패드 붙이기
    IX-1. KLayout: 레이아웃 형식 변환도구
    IX-2. oa(OpenAccess) 형식 레이아웃 .mag 로 변환
    IX-3. 코어와 패드의 배치 및 배선

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

IX. 입출력 패드 붙이기

RTL 문서를 합성하여 폭이 0.6 마이크로 미터 밖에 않되는 트랜지스터 수천개를 엮어 가로세로 1mm의 영역에 집적해 놨다. 이제 마이크로미터의 세계에서 미리미터의 세계로 옮겨갈 단계에 왔다. 반도체 부품은 결국 인간의 인지영역에서 사용된다. 적어도 기판에 땜을 하려면 미리미터 단위로 옮겨와야 한다. 마이크로 단위의 세계는 크기 만큼이나 작동에 필요한 에너지량도 매우 적다. CMOS 트랜지스터의 작동에 필요한 에너지는 나노 와트에 불과하다. 자연계에 부유하는 에너지에 과도하게 반응하거나 견디지 못히고 파괴되기도 한다. 마이크로 세계의 트랜지스터를 보호하고 의미있는 신호만을 걸러내는 장치가 입출력 패드(IO Pad)다[link].

[이미지 출처] De-Capped 6502, http://www.visual6502.org/docs/6502_in_action_14_web.pdf

[이미지 출처] https://pages.hmc.edu/harris/cmosvlsi/4e/lect/lect23.pdf

IX-1. KLayout: 레이아웃 형식 변환도구

ETRI 0.5um CMOS 공정의 PDK는 입출력 패드를 라이브러리로 제공하는데 파일 형식이 OAsis[link] 다. 이 형식은 오픈-소스 레이아웃 도구 Magic과 호환되지 않기 때문에 GDS-II로  변환 후 들여쓰기로 한다.

레이아웃 편집기들은 공정마다 정해진 레이어 규칙(디자인 룰)을 참조하여 변환한다. 레이아웃의 표현은 레이어 번호와 좌표로써 단순하다. 이에 덧붙여 반복 사용되는 블럭은 하위 블럭으로 정의하여 계층화된 레이아웃으로 기술한다. 레이아웃 편집기 Magic이 계층적 GDS를 바르게 처리하지 못하기 때문에 또다른 오픈-소스 KLayout[link]을 활용할 것이다. 두 도구는 비아(via)와 컨택(contact)을 처리하는 방식에서 큰 차이가 있다. Magic은 컷(cut)과 오버행(overhang)을 묶어서 표현하고 GDS 생성시 자동으로 구멍을 뚫는다. 그리고 Magic은 테크 파일에 정의되지 않은 레이어는 없는 것으로 무시하기 때문에 레이어 번호가 매우 중요한 반면 KLayout은 모든 레이어와 좌표를 있는 그대로 읽는다. KLayou 형식변환과 검토에 매우 유용한 도구로 쓰인다.

 


IX-2. .oa(OpenAccess) 형식 레이아웃 .mag 로 변환

기능은 단순한 선로에 불과 하나 마이크로 세계로 통하는 매우 중요한 역활을 담당하는 입출력 패드를 표준 셀 그리듯 쉽게 취급할 수 없다. 다행히 ETRI 공정의 PDK는 입출력 패드 셀 라이브리를 제공하고 있다.

ETRI 공정에서 제공한 입출력 패드 파일은 oa 형식 이다. 유사한 이름으로 OASIS(Open Artwork System Interchange Standare[link])가 있다. 반도체 도면 뿐만 아니라 PCB 도면, 기타 평면도를 그리는 상용 도구에서 사용된다[link]. LEF/DEF 처럼 전자설계 자동화 도구들 사이에 공용으로 사용하는 형식으로 추진 되었다. 이 형식은 집적회로 레이아웃으로 널리 쓰이는 GDS-II 형식을 이어받고 있다. 케이던스사의 버츄오소등 상용 레이아웃 도구에서 사용되고 있지만 Magic은 이 형식을 지원하지 않는다.

라이브러리로 제공된 OA(OpenAccess database)를 Magic에서 사용하려면 다소 복잡한 변환을 거쳐야 한다. 이 절차는 입출력 패드 뿐만 아니라 외부에서 (상용도구로) 제작된 레이아웃을 오픈-소스 레이아웃 도구로 들여올때 응용할 수 있다.

+-----------------------+
| OpenAccess DB: .oa    |
+-----------+-----------+
            |
    [Cadence Virtuoso]
            |
+-----------V-----------+
| GDS-II: .gds          |
+-----------+-----------+
            |
        [KLayout]
            |
+-----------V------------+
| GDS-II: .gds           |
+-----------+------------+
            |
[Magic: cif istyle lambda=0.3(ETRI)]
            |
+-----------V------------+
|    .mag (Flatten)      |
+------------------------+

단계 1 상용 도구에서 oa 형식 파일을 GDS-II 로 저장한다. Magic 은 계층화된 GDS를 제대로 처리하지 못하는 경우가 있으므로 평활화(flatten) 옵션을 주고 저장한다. 

    

단계 2. 만일 계층화된 GDS를 Magic에서 읽었을 때 문제가 발생하면 번거롭지만 KLayout 도구를 써서 GDS를 읽은 후 다시 저장한다. KLayout은 좋은 도구다.

단계 3. Klayout에서 저장한 GDS를 Magic 에서 읽는다. 이때 레이어 번호를 Magic의 레이어 이름으로 변경해 주어야 한다. Magic명령창에서 읽기 스타일을 lambda=0.3(ETRI) 으로 변경해 준다.

    % cif istyle lambda=0.3(ETRI)

비록 레이아웃을 기술하는 문법은 단순하지만 외부에서 공급되는 라이브러리를 들여올때 레이어 번호와 좌표계의 단위를 주의하여 맞춰줘야한다. 디자인 킷은 ETRI 050 공정의 GDS를 읽어들이기 위한 기술 파일을 제공한다. 디자인 킷의 tech 폴더에 이 기술 파일이 있다. ETRI 공정용 레이어 번호 변환 및 디자인 룰 검사가 기술되어 있다.

    ~/ETRI050_DesignKit/v.1a/tech/SCN3ME_SUBM.30.ETRI.tech

단계 4. Magic 에서 GDS 파일을 읽으면 계층적임을 알 수 있다. 패드 셀에 수천개의 비아(via)가 뚫리는데 이들이 모두 하위 블럭으로 취급한다. Magic 에서 이들을 다룰때 부하가 많이 걸리므로 평활화 시켜 단일 셀로 저장해 두는 편이 좋다. 입력 패드 셀 PIC를 읽고 평활화 시키는 명령은 아래와 같다.

    % gds read PIC
    % select top cell; unexpand
    % flatten PIC_F; load PIC_F
    % save PIC_F

IX-3. 코어와 패드의 배치 및 배선

KION 의 'My Chip' 제작 서비스[link]의 MPW 칩 크기는 1850x1850um 이며 28핀 PLCC 패키지로 제작해준다. 이 조건에 맞춰 외곽에 입출력 패드를 붙이고 중심부에 앞서 설계한 코어를 배치한 후 패드와 배선한다.

MPW는 서로다른 다수의 칩을 한 웨이퍼에서 제작되므로 칩크기와 패드의 위치가 고정되어 있다. 패드의 배치가 고정된 칩의 외형이 제공되므로 이를 따라야 한다. 디자인 킷에는 입출력 패드를 부착한 칩 레이아웃이 제공된다.

패드는 설계한 코어에 따라 입출력을 달리 붙이게된다. 코어를 설계할 때 입출력 핀의 배치 계획을 세워 놓도록 한다. 자동 배치도구 GrayWolf의 입출력 핀 배치 파일은 ALU_wrapper.cel2 다. ALU 예제의 경우 입출력 핀을 몇개의 모둠으로 나눠 입력 핀 iAB[7:0]은 왼쪽 패드에 출력 핀 oACC[7:0]은 오른쪽 패드에 그리고 제어 핀들은 윗쪽에 배치했다.

    padgroup input_B permute
    twpin_iAB[0]  nonfixed
    twpin_iAB[1]  nonfixed
    restrict side B

    padgroup input_L permute
    twpin_iAB[2]  nonfixed
    twpin_iAB[3]  nonfixed
    twpin_iAB[4]  nonfixed
    twpin_iAB[5]  nonfixed
    twpin_iAB[6]  nonfixed
    twpin_iAB[7]  nonfixed
    restrict side L

    padgroup control permute
    twpin_iSel[0]  nonfixed
    twpin_iSel[1]  nonfixed
    twpin_iOutSel  nonfixed
    twpin_reset  nonfixed
    twpin_clk  nonfixed
    restrict side T

    padgroup output_T permute
    twpin_oACC[7]  nonfixed
    twpin_oACC[6]  nonfixed
    restrict side T

    padgroup output_R permute
    twpin_oACC[5]  nonfixed
    twpin_oACC[4]  nonfixed
    twpin_oACC[3]  nonfixed
    twpin_oACC[2]  nonfixed
    twpin_oACC[1]  nonfixed
    twpin_oACC[0]  nonfixed
    restrict side R

디자인 킷은 코어와 입출력 패드 사이의 배선은 자동화 하지 못했다. Magic 레이아웃 도구를 써서 수동으로 연결해 주도록 한다. Magic 레이아웃 도구의 사용법은 설명서가 잘 준비되어 있으니 익혀두자[link].

예제 실행을 위한 폴더 구조

+---------------------------+
| ~/ETRI050_DesignKit/v.1a/ |
+-------+-------------------+
        |
        +-- Tools : Open-source archives
        |
        +-- digital_ETRI -> digital_ETRI050_m2d (symbolic link)
        |
        +-- pads_ETRI050
        |
        +-- scripts
        |
        +-- tech
        |
        +-- Ref_Design/ALU8 Project Home
                         |
                         +-- log
                         |
                         +-- source : RTL Verilog
                         |
                         +-- layout : P&R results
                         |
                         +-- simulation : C++ Tectbench
                         |
                         +-- synthesis : Synthesized netlists
                         |
                         +-- chiptop


단계 1. ALU8 에서 패드를 붙인 최종 칩 작업 폴더는 chiptop으로 한다.

    $ mkdir chiptop
    $ cd chiptop

단계 2. 셀 라이브러리 경로 심볼링크

    $ ln -s ../../../digital_ETRI
    $ ln -s ../../../pads_ETRI050

단계 3. 코어 심볼링크

    $ ln -s ../layout/ALU_wrapper_Fixed.mag ./ALU_wrapper_Core.mag

단계 4. MPW용 28핀 패드 프레임 복사

    $ cp ./pads_ETRI050/MPW_PAD_28Pin_frame.mag ./ALU_wrapper_Top.mag

단계 5. Magic의 리소스 파일 복사

    $ cp ../layout/.magicrc .

단계 6. Magic 리소스 파일 수정.

    $ vi .magicrc

    셀 라이브러리 경로 추가

    #-----------------------------------------------------
    # .magicrc startup file for ETRI050 project under qflow
    #-----------------------------------------------------
    path sys +/usr/local/share/qflow/tech/etri050
    tech load SCN3ME_SUBM.30.ETRI -noprompt
    scalegrid 1 2
    set GND gnd
    set VDD vdd
    drc euclidean on
    drc off

    addpath digital_ETRI
    addpath pads_ETRI050

    macro Control_XK_Pointer_Button4 {zoom 0.5}
    macro Control_XK_Pointer_Button5 {zoom 2}

단계 7. MPW 패드 프레임에 코어 배치

    $ magic -d XR ALU_wrapper_Core

    Magic 명령창에서 상자 커서를 위치한 후 코어셀 불러들이기

    % box 600um 600um 600um 600um
    % getcell ALU_wrapper_Core

28개 패드 중 0번과 14번은 각각 VDD 와 VSS로 지정했고 나머지는 모두 NC(No-Connectrd)다. 코어의 핀 배치에 맞춰 입출력 패드를 배정 한다.

단계 9. 그래픽 화면을 보며 NC 패드에 PIC(입력패드)와 POB8(출력 패드)를 달 수 있지만 번거롭다. Magic 레이아웃 파일은 일반 문자 파일이므로 문자 문서 편집기로 고치는 편이 수월하다. 대부분 전자설계 자동화 파일들이 일반 문자 파일이라서 양식만 이해하고 있다면 수정이 쉽다. 자동화 도구 만들기도 수월하다.

    % vi ALU_wrapper_Top.mag

앞서 자동배치시 핀배치 방향을 지정 했었다. 이에 맞춰 패드를 배정해 보자. 예를들어 PORT_2 를 찾아서 PAD_NC_F 패드를 입력 패드 라이브러리 PIC_F 로 바꿔준다. 출력 패드의 이름은 POB8_F 다.

    use PAD_NC_F  PORT_2    ---> use PIC_F   PORT_2
    use PAD_NC_F  PORT_13   ---> use POB8_F  PORT_2

단계 10. 코어에서 포트의 라벨을 찾아 각 패드에 연결해준다. 수평 배선을 금속2, 수직 배선은 금속3의 규칙을 반드시 따를 필요는 없다. 배선길이가 길다. 가급적 두껍게 사용하자. 3~4um가 적당하다.


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

[목차][이전][다음]


2023년 12월 30일 토요일

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [8]/레이아웃 검증(LVS)

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [8]

VIII. 레이아웃 검증: LVS 및 DRC
    VIII-1. Netgen: 트랜지스터 회로 네트리스트 비교
    VIII-2. 서로다른 추상화 수준에서 표준 셀을 기술하는 양식
    VIII-3. 겹친 비아(Stacked VIA) 검사
        a. 배선과 비아 생성 규칙
        b. 자동배선 도구의 겹친 비아 금지 옵션
        c. 겹친 비아 검사
    VIII-4. Magic: 레이아웃 편집도구로 겹친 비아 수정
    VIII-5. Magic: 디자인 룰 검사

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

VIII. 레이아웃 검증(LVS)

앞서 베릴로그 RTL을 합성하여 얻은 네트리스트와 레이아웃에서 추출한 네트리스트를 비교하여 낮은 추상화 수준으로 변환된 두 설계가 동일한지 검증한다. QFlow의 LVS 처리 명령은 다음과 같다.

    % qflow lvs ALU_wrapper

레이아웃(실리콘 도면)에서 추출된 네트리스트는 트랜지스터 회로다. RTL 합성으로 얻은 네트리스트는 표준 셀의 연결도다. 두 네트리스트의 추상화 수준이 다르다. LVS 를 위해 RTL 합성으로 얻은 표준 셀 네트리스트를 트랜 지스터로 변환 해야 한다. SPICE 형식으로 변환된 표준 셀 네트리스트에 디자인 킷으로 제공된 표준 셀의 SPICE 네트리스트를 하위회로(sub-circuit)로 불러온다.

+----------------+
|Verilog RTL     |
+-----+----------+                      
      |                                     
+-----V-------------------------+      [Design-Kit]
|Yosys: RTL Synthesis <--[Std-Cell Liberty] == [etri050_stdcells.sp]
|                               |                      |
|    -> SPICE Netlist for LVS --|-------------+   [including...]
|    -> Verilog Netlist         |             |        |
|         for P&R and Post-Sim  |             V        V
+--------------+----------------+    [Hierachical SPICE Netlist  ]
               :                     [./synthesis/ALU_wrapper.spc]
               :                                     |
+--------------V----------------+                    |
|Magic: Migration    <---[Std-Cell Layout]           |
|    -> SPICE Netlist for LVS --|----------+         |
|    -> Merged Layout           |          |         |
+--------------+----------------+          |         |
               |                           |         |
               |          +----------------V---------V------------+
      +--------+          | LVS         (Layout vs. Schematic)    |
      |                   |     Netgen: SPICE netlist compare     |
     (?)<<<<<<<<<<<<<<<<<<<          @ Transistor Circuit Level!  |
      |                   +---------------------------------------+
      V
    GDS-II Generation

VIII-1. Netgen: 트랜지스터 회로 네트리스트 비교 도구

QFlow 의 LVS 도구는 Netgen[link] 이다. SPICE의 네트리스트 형식으로 표현된 두 트랜지스터 회로를 비교한다. 추상화 수준이 낮아질수록 처리할 부품의 기능은 단순해지고 갯수는 기하급수적으로 증가하여 자동화 도구에 의존도가 매우 높아진다. 인간이 간여할 부분은 줄어들고 낮은 수준의 자동화 도구 사용법은 단순하다. 가장 낮은 수준의 도구에 해당하는 Netgen의 사용법도 간단하다. QFlow에서 LVS 를 위해 Netgen을 호출하는 명령은 아래와 같다.

    Regenerating files for existing project ALU_wrapper
    Running netgen
    netgen -batch lvs \
        "ALU_wrapper.spice ALU_wrapper" \
        "../synthesis/ALU_wrapper.spc ALU_wrapper" \
        .../etri050_setup.tcl comp.out

Netgen을 호출 하면서 비교할 두 SPICE 네트리스트 파일을 지시했을 뿐이다. 예제의 LVS를 수행한 결과는 아래와 같다.

    Contents of circuit 1:  Circuit: 'ALU_wrapper'
    Circuit ALU_wrapper contains 366 device instances.
      Class: OR2X2                 instances:   5
      Class: MUX2X1                instances:   1
      Class: AOI22X1               instances:  13
      Class: NOR2X1                instances:  12
        <......>
      Class: INVX2                 instances:   4
      Class: INVX4                 instances:   3
      Class: INVX8                 instances:   1
    Circuit contains 381 nets.

    Contents of circuit 2:  Circuit: 'ALU_wrapper'
    Circuit ALU_wrapper contains 366 device instances.
      Class: OR2X2                 instances:   5
      Class: MUX2X1                instances:   1
      Class: AOI22X1               instances:  13
      Class: NOR2X1                instances:  12
        <......>
      Class: INVX2                 instances:   4
      Class: INVX4                 instances:   3
      Class: INVX8                 instances:   1
    Circuit contains 381 nets.

    Circuit 1 contains 366 devices, Circuit 2 contains 366 devices.
    Circuit 1 contains 381 nets,    Circuit 2 contains 381 nets.

    Final result:
    Circuits match uniquely.

두 회로에 사용된 하위회로들의 목록과 네트의 수 등을 요약해서 보여주고 두 회로가 일치 했음을 알려준다.

VIII-2. 서로다른 추상화 수준에서 표준 셀을 기술하는 양식

디자인 킷에 포함된 표준 셀의 라이브러리는 크게 3가지 추상화 수준의 형식으로 제공된다.

  1. 레이아웃 형식: 표준 셀의 기하학적 도면으로 가장 낮은 추상화 단계의 양식이다. 최종적으로 GDS 를 생성 할 때 사용된다.
  2. SPICE 형식: 표준 셀의 레이아웃에서 추출된 트랜지스터 회로의 네트리스트다. LVS 용도로 사용된다.
  3. Liberty 형식: 합성에서 사용되는 양식이다. 표준 셀 단위의 물리적 특성(기능, 크기, 지연 특성)을 담고있다.
  4. HDL 형식: 표준 셀 묘사의 가장 높은 수준의 양식이다. HDL 시뮬레이션을 위해 사용된다. 레이아웃의 트랜지스터와 스위치 수준에서 등가로 기술되며 게이트의 지연 특성, 플립플롭의 셋업-홀드 바이얼레이션을 검사할 수 있다.

합성으로 얻은 표준 셀의 네트리스트에서 디자인 킷의 표준 셀 SPICE 하위 회로를 불러들여 트랜지스터 회로를 만들게 된다. 합성 후 SPICE 네트리스트의 일부를 보면 아래와 같다.

    .subckt INVX1 A Y vdd gnd
    M1000 Y A vdd vdd pfet w=6u l=0.6u
    +  ad=12.600001p pd=16.2u as=12.600001p ps=16.2u
    M1001 Y A gnd gnd nfet w=3u l=0.6u
    +  ad=6.300001p pd=10.200001u as=6.300001p ps=10.200001u
    .ends
    <......>
    .subckt NAND2X1 A B Y vdd gnd
    M1000 vdd B Y vdd pfet w=6u l=0.6u
    +  ad=12.600001p pd=16.2u as=7.200001p ps=8.400001u
    M1001 a_24_14# A gnd gnd nfet w=6u l=0.6u
    +  ad=2.7p pd=6.9u as=12.600001p ps=16.2u
    M1002 Y B a_24_14# gnd nfet w=6u l=0.6u
    +  ad=16.2p pd=17.400002u as=2.7p ps=6.9u
    M1003 Y A vdd vdd pfet w=6u l=0.6u
    +  ad=7.200001p pd=8.400001u as=12.600001p ps=16.2u
    .ends
    <......>

    .subckt ALU_wrapper vdd gnd clk iAB[0] iAB[1] iAB[2] iAB[3]
    + iAB[4] iAB[5] iAB[6] iAB[7] iOutSel iSel[0] iSel[1] oACC[0]
    + oACC[1] oACC[2] oACC[3] oACC[4] oACC[5] oACC[6] oACC[7] reset
    <......>
    XFILL_2__291_ gnd vdd FILL
    X_512_ _155_ _156_ vdd gnd INVX1
    XFILL_2__347_ gnd vdd FILL
    XFILL60750x19650 gnd vdd FILL
    X_321_ iAB[4] _36_ vdd gnd INVX1
    XFILL_1__369_ gnd vdd FILL
    XFILL_2__576_ gnd vdd FILL
    XFILL_3__518_ gnd vdd FILL
    X_550_ _192_ _191_ _193_ vdd gnd NAND2X1
    XFILL_1__598_ gnd vdd FILL
    XFILL_0__603_ gnd vdd FILL
    <......>
    .ends

합성으로 얻은 최상위 모듈(ALU_wrapper)의 SPICE 네트리스트는 디자인 킷의 표준 셀 (INVX1, NAND2X1 등등)을 하위 회로(sub-sircuit)로 하는 계층구조의 모습을 하고 있다.

VIII-3. 겹친 비아(Stacked VIA) 검사

우리가 사용하려는 ETRI 0.5um CMOS 공정은 겹친 비아(Stacked VIA)를 허용하지 않는다. 겹친 비아는 접점형성이 되지 않기 때문이다. 

a. 배선과 비아 생성 규칙

대상공정[링크]의 배선을 담당하는 금속층은 3개다. 금속1층(m1, metal 1 layer)은 실리콘 층의 바로위에서 깔리는 금속층으로 표준 셀 내부 배선에 주로 이용되며 금속2(m2)와 3(m3)은 표준셀 사이의 배선에 사용된다. LEF의 배선 규칙에 따르면 금속2층은 수직선, 금속3층은 수평선 배선으로 쓰인다. 디자인 룰에 따라 선폭과 간격이 규정 되어있다. 비아(VIA)는 인접한 수직과 수평 배선 사이를 연결한다. LEF의 배선 규칙은 다음과 같다.

    UNITS
      DATABASE    MICRONS 1000 ;
    END UNITS

    MANUFACTURINGGRID    0.15 ;

    LAYER metal1
      TYPE        ROUTING ;
      DIRECTION   HORIZONTAL ;
      PITCH       3.0 ;
      OFFSET      1.5 ;
      WIDTH       0.9 ;   # ETRI050 Rule: WIDTH=0.8
      SPACING     1.05 ;  # ETRI050 Rule: SPACING=1.0
      RESISTANCE  RPERSQ 0.09 ;
      CAPACITANCE CPERSQDIST 3.2e-05 ;
    END metal1
    LAYER metal2
      TYPE        ROUTING ;
      DIRECTION   VERTICAL ;
      PITCH       3.0 ;
      OFFSET      1.5 ;
      WIDTH       1.05 ;  # ETRI050 Rule: WIDTH=1.0
      SPACING     1.05 ;  # ETRI050 Rule: SPACING=1.0
      RESISTANCE  RPERSQ 0.09 ;
      CAPACITANCE CPERSQDIST 1.6e-05 ;
    END metal2
    LAYER metal3

      TYPE        ROUTING ;
      DIRECTION   HORIZONTAL ;
      PITCH       3.0 ;
      OFFSET      1.5 ;
      WIDTH       1.2 ;   # ETRI050 Rule: WIDTH=1.2
      SPACING     1.05 ;  # ETRI050 Rule: SPACING=1.0
      RESISTANCE  RPERSQ 0.05 ;
      CAPACITANCE CPERSQDIST 1e-05 ;
    END metal3


    LAYER via1
      TYPE CUT ;
      SPACING 0.9 ;
    END via1
    LAYER via2
      TYPE CUT ;
      SPACING 0.9 ;
    END via2

    SPACING
      SAMENET cc   via1 0.900 ;
      SAMENET via1 via2 0.900 ;
    END SPACING

    VIA M2_M1 DEFAULT
      LAYER metal1 ;
        RECT -1.050 -1.050 1.050 1.050 ;
      LAYER via1 ;
        RECT -0.450 -0.450 0.450 0.450 ;
      LAYER metal2 ;
        RECT -1.050 -1.050 1.050 1.050 ;
    END M2_M1
    VIA M3_M2 DEFAULT
      LAYER metal2 ;
        RECT -1.050 -1.050 1.050 1.050 ;
      LAYER via2 ;
        RECT -0.450 -0.450 0.450 0.450 ;
      LAYER metal3 ;
        RECT -1.050 -1.050 1.050 1.050 ;
    END M3_M2

LEF 배선 룰은 인접 금속층 사이의 연결을 위한 구멍(cut)을 내는 규정이 있다. 금속1층에서 금속3층으로 연결이 필요한 경우 M2_M1 비아와 M3_M2 비아를 쌓아 연결 한다. 이를 겹친 비아(Stacked VIA)라고 한다.

[이미지출처] https://www.vlsi-expert.com/2017/12/vias.html

b. 자동배선 도구의 겹친 비아 금지 옵션

좁은 영역에서 효과적인 배선을 위해 겹친 비아를 허용한다. 하지만 겹친 비아가 금지된 공정도 있다. 우리가 사용하려는 ETRI 0.5um CMOS 공정은 비아가 겹쳐 있을 경우 접점이 형성되지 못한다. 따라서 겹침 비아가 절대 허용될 수 없다. LEF에는 겹친 비아에 대한 규정이 없으므로 이 배선규칙을 따르는 자동 배선도구에 겹친 비아를 차단하는 옵션을 주어야 한다.

QFlow의 프로젝트 파일 prohect_vars.sh 에서 via_stacks 에 none 값을 설정 해준다. 기본값은 all 이다.

    Placement command options:
    # -------------------------------------------
    set initial_density = 0.66
    # set graywolf_options =
    set addspacers_options = "-stripe 8 225 PG"
    # set addspacers_power =
    Router command options:
    # -------------------------------------------
    set route_show = 1
    # set route_layers =
    # set via_use =
    set via_stacks none
    # set qrouter_options =
    # set qrouter_nocleanup =

QFlow의 프로젝트 파일에는 그외 자동배치 도구의 옵션도 있으므로 눈여겨 봐두자.

c. 겹친 비아 검사

추상화 수준이 낮아 질 수록 자동화 도구가 처리해야할 요소가 급격히 증가한다. 그만큼 자동화 도구의 결과에 오류가 존재할 가능성도 높아 지므로 추상화 단계가 전이할때 마다 반드시 검사가 이뤄져야 한다. 자동 배선도구에 겹침 비아를 금지 시켰으나 수많은 비아에 겹침을 모두 피했다고 확신할 수 없다. 디자인 킷에는 자동 배선 도구가 생성한 레이아웃에서 비아 겹침을 검사하는 파이썬 스크립트를 제공한다. 사용법은 아래와 같다.

    $ pwd
        ..../ALU8/layout
    $ ../../../scripts/check_via_stack.py
    check_via_stack.py <Magic name> <layer#1> <layer#2> <margin>
     Check stacked via
         Layer Names are;
             ndcontact
             pdcontact
             psubstratepcontact
             nsubstratencontact
             polycontact
             m2contact
             m3contact

    $ ../../../scripts/check_via_stack.py ALU_wrapper m2contact m3contact 6

    Mult=1 / Div=2
    Stacked #1
    << m2contact >> rect 2353 2713 2367 2727
    << m3contact >> rect 2353 2713 2367 2727
    Box(Scaled): 1176 1356 1183 1363
    ***************************************
    1 Stacked Contact and/or Via found!
    Magic layout "ALU_wrapper_Stacked.mag" created with DRC error layer

자동 배선으로 생성된 Magic의 레이아웃 파일 ALU_wrapper 에 m2contact 과 m3contact 가 중심위치에서 6 마이크론 이내에 겹쳐 있는지 검사한 결과 1개의 겹친 비아가 발견되었다. 겹친 비아의 좌표가 오류로 표시된 레이아웃 파일 ALU_wrapper_Stacked.mag 에 저장 되었다.

VIII-4. Magic: 레이아웃 편집 도구로 겹친 비아 수정

겹친 비아가 표시된 레이아웃을 편집 도구 Magic[link]을 사용하여 편집한다. 레이아웃 편집기 Magic의 사용법은 튜토리얼 문서가 잘 준비되어 있으므로 따로 익혀두자[link]. 앞서 겹친 비아를 검사하여 에러로 표시된 레이아웃 파일을 읽는다.

    $ magic -d XR ALU_wrapper_Stacked

넓은 영역에서 겹친 비아를 찾아내려면 좌표를 찾아 읽거나 오류로 표시한 부분을 확대한다. Magic의 오류위치 찾기 명령은 drc find 다.

찾아낸 에러에 편집 상자가 위치하게 된다. 확대(단축키 'z'와 'Z')한 후 서브 셀들의 내부로 확장(단축키 'x')하고 동일 네트를 선택(단축키 's')하면 겹친 비아를 확인할 수 있다.

금속 m1(청색), m2(보라색), m3(자주색) 배선이 겹친 지점에 비아가 뚫려 있다. 흰색 실선으로 외곽이 둘러쳐진 배선은 모두 동일 네트임을 나타낸다. M1_M2 비아를 선택(:select via1)하여 이동 시킨 후 m1 배선을 수정 한다.

단순한 수정이지만 수작업 편집은 항상 오류를 일으킬 우려가 있으므로 LVS 를 통해 검증해주여야 한다. 수정한 레이아웃에서 네트리스트를 추출한다. 회로 시뮬레이션이 목적이 아니므로 저항과 정전용량(커페시턴스)은 배제시킨다. LVS용 네트리스트를 추출하기 위한 Magic의 일련의 명령은 다음과 같다.

    drc off
    extract all
    hierarchy on
    format ngspice
    cthresh infinite
    rthresh infinite
    renumber off
    scale off
    blackbox on
    subcircuit top auto
    global off
    ext2spice subcircuit top off
    ext2spice

LVS가 필요할 때마다 위 명령들을 반복적으로 입력하기란 여간 번거로운 일이 아니다. 스크립트로 저장해 두었다가 반복적으로 사용하기로 한다. Magic의 레이아웃에서 SPICE 네트리스트를 추출하는 쉘 스크립트는 extract_spice.sh 다. 디자인 킷의 scripts 폴더에 있다. 수정한 레이아웃을 ALU_wrapper_Fixed 로 저장한 후 SPICE 네트리스트를 추출하는 스크립트를 실행 한다.

    $ ../../../scripts/extract_spice.sh ALU_wrapper_Fixed

수정한 레이아웃의 SPICE 네트리스트를 합성으로 얻은 네트리스트와 LVS를 실시한다.

    $ netgen -noc lvs \
        "../synthesis/ALU_wrapper.spc ALU_wrapper"  \
        "ALU_wrapper_Fixed.spice ALU_wrapper_Fixed"  \
        ../../../tech/etri050_setup.tcl

    <......>
    Contents of circuit 1:  Circuit: 'ALU_wrapper'
    Circuit ALU_wrapper contains 366 device instances.
      Class: OR2X2                 instances:   5
      Class: MUX2X1                instances:   1
    <......>
      Class: INVX4                 instances:   3
      Class: INVX8                 instances:   1
    Circuit contains 381 nets.

    Contents of circuit 2:  Circuit: 'ALU_wrapper_Fixed'
    Circuit ALU_wrapper_Fixed contains 366 device instances.
      Class: OR2X2                 instances:   5
      Class: MUX2X1                instances:   1
    <......>
      Class: INVX4                 instances:   3
      Class: INVX8                 instances:   1
    Circuit contains 381 nets.

    Circuit 1 contains 366 devices, Circuit 2 contains 366 devices.
    Circuit 1 contains 381 nets,    Circuit 2 contains 381 nets.

    Final result:
    Circuits match uniquely.

    % quit

LVS로 두 네트리스가 일치한 결과를 얻게 되면 겹침 비아의 수정이 완료된다.

VIII-5. Magic: 디자인 룰 검사

디자인 룰은 반도체 제조의 정밀도에 따라 기하학적인 한계를 규정한다. 유효한 트랜지스터의 제조에 요구되는 최소 길이와 폭을 정한 것이다. 이에 더블어 수많은 트랜지스터들 사이의 배선에 사용될 금속선의 폭과 간격 그리고 접점의 조건을 규정한다[Design Rule Checking].

자동 배선 도구도 소프트웨어로 오류의 가능성을 가지고 있다. 전체 레이아웃 면적에서 구역을 나눠 배선을 진행 하게 되는데 구획된 배선 영역을 합치는 과정에서 문제를 잃으키기도 한다. 자동 배선이 완료 되었다는 로그를 받게 되더라도 반드시 LVS를 실시해야 하는 이유다.

표준 셀은 이미 공정의 디자인 룰에 맞게 준비 되었으므로 LVS와 겹친 비아까지 수정된 레이아웃은 GDS 생성 단계로 넘어가도 좋다. 자동 배선기 또한 디자인 룰에 맞춰 배선 규칙이 규정 되어 있으며 표준 셀의 배선 제한영역(OBS, obstruction)을 피하도록 되어있다. 따라서 이 단계의 디자인 룰 검사는 대부분 배선용 금속층과 접점 사이의 규정위반이 나타나게된다.

겹침 비아까지 수정된 레이아웃을 읽어 디자인 룰을 검사해 보자. 먼저 Magic 으로 레이아웃을 읽는다.

    $ magic -d XR ALU_wrapper_Fixed

메뉴 Options > DRC Manager 를 선택하여 DRC 관리창을 연다.

금속 1, 2, 3의 간격(spacing) 오류가 있다. DRC 관리창에서 오류 좌표를 선택 후 Zoom 버튼을 누르면 해당 위치를 보여준다.

배선의 단말 부분이 두껍게 그려져서 간격이 위배된 경우다. 편집 명령으로 일부분을 지워주면 오류가 사라진다.

아래의 오류는 자동 배선의 규칙을 과하게 적용한 경우다. 금속2를 수직 배선에 적용한 탓에 과도하게 비아를 사용하고 있다. 동일한 네트이므로 굳이 수정할 필요가 없더라도 가급적 모두 수정해 주도록 한다.

비아를 넓게 하거나 한쪽을 제거하고 직접 연결 할 수 있다.

 

자동배선기는 높은 지능 수준을 요구하는 매우 중요한 자동화 도구다. 하지만 실제 배선된 도면을 보면 이해 못할 면도 많다. 수직 배선과 수평 배선 규칙을 융통성 없이 적용하기 때문이다. 자동 배선 도구가 남긴 간격 오류를 모두 수정에도 남은 오류가 있는데 이는 이는 디자인 룰의 기하학적인 오류가 아니다.

표준 셀이 배치되면서 인접 셀과 겹치는 부분이 있다는 뜻이다. 전원과 접지 배선을 공통 선으로 연결 하기 위해 표준 셀에 여유를 두었기 때문이다. 최종 GDS를 생성 할 때 n 과 p의 바닥 디퓨전(substrate diffusion) 접점을 균일하게 배치하도록 규칙을 정해놨기 때문에 무시한다. Magic의 테크 파일에는 비아와 컨택을 자동생성하는 룰을 따로 가지고 있다.

수동 편집이 개입 되었으므로 반드시 LVS를 실시한다. 앞서 실시행던 방법과 같다. 먼저 수정한 레이아웃에서 SPICE 네트리스트를 추출하고,

    $ ../../../scripts/extract_spice.sh ALU_wrapper_Fixed

LVS를 실시한다.

    $ netgen -noc lvs \
        "../synthesis/ALU_wrapper.spc ALU_wrapper"  \
        "ALU_wrapper_Fixed.spice ALU_wrapper_Fixed"  \
        ../../../tech/etri050_setup.tcl

    <......>
    Circuit 1 contains 366 devices, Circuit 2 contains 366 devices.
    Circuit 1 contains 381 nets,    Circuit 2 contains 382 nets. *** MISMATCH ***

    Final result:
    Netlists do not match.

아쉽게도 두 네트리스트가 일치하지 않는다. LVS의 로그는 따로 지정하지 않으면 comp.out 이다. 두 회로에서 일치하지 않는 네트를 확인한다.

Subcircuit summary:
Circuit 1: ALU_wrapper                     |Circuit 2: ALU_wrapper_Fixed
-------------------------------------------|-------------------------------------------
AOI22X1 (13)                               |AOI22X1 (13)
DFFSR (24)                                 |DFFSR (24)
INVX1 (41)                                 |INVX1 (41)
                    <......>
OAI22X1 (1)                                |OAI22X1 (1)
CLKBUF1 (6)                                |CLKBUF1 (6)
Number of devices: 366                     |Number of devices: 366
Number of nets: 381 **Mismatch**           |Number of nets: 382 **Mismatch**
---------------------------------------------------------------------------------------
NET mismatches: Class fragments follow (with fanout counts):
Circuit 1: ALU_wrapper                     |Circuit 2: ALU_wrapper_Fixed

---------------------------------------------------------------------------------------
Net: _25_                                  |Net: _306_/Y
  INVX1/Y = 1                              |  INVX1/Y = 1
  OAI21X1/A = 1                            |
                                           |
(no matching net)                          |Net: _311_/A
                                           |  OAI21X1/A = 1
---------------------------------------------------------------------------------------
Netlists do not match.

RTL 합성 네트리스트 ALU_wrapper.spc 에서 네트명 _25_ 가 수정 네트리스트에서 두개의 네트 _306_/Y 와 _311_/A 로 분리된 것으로 보고되었다. Magic에서 네트를 찾는 명령은 goto 다[Magic-8.3 Command Reference].

끊어진 네트를 찾아 이어준다.

다시 네트리스트를 추출한 후 LVS 를 실시한다.

    $ ../../../scripts/extract_spice.sh ALU_wrapper_Fixed

    $ netgen -noc lvs \
        "../synthesis/ALU_wrapper.spc ALU_wrapper"  \
        "ALU_wrapper_Fixed.spice ALU_wrapper_Fixed"  \
        ../../../tech/etri050_setup.tcl

LVS 결과 로그를 보면 두 네트리스트가 사용된 셀, 네트 그리고 입출력 핀까지 완전히 일치함을 확인할 수 있다.


<......>
Subcircuit summary:
Circuit 1: DFFSR                           |Circuit 2: DFFSR                           
-------------------------------------------|-------------------------------------------
nfet (16)                                  |nfet (16)                                  
pfet (16)                                  |pfet (16)                                  
Number of devices: 32                      |Number of devices: 32                      
Number of nets: 20                         |Number of nets: 20                         
---------------------------------------------------------------------------------------
Netlists match uniquely.
Subcircuit pins:
Circuit 1: DFFSR                           |Circuit 2: DFFSR                           
-------------------------------------------|-------------------------------------------
S                                          |S                                          
R                                          |R                                          
vdd                                        |vdd                                        
gnd                                        |gnd                                        
CLK                                        |CLK                                        
Q                                          |Q                                          
D                                          |D                                          
---------------------------------------------------------------------------------------
Cell pin lists are equivalent.
Device classes DFFSR and DFFSR are equivalent.

<......>

Subcircuit summary:
Circuit 1: ALU_wrapper                     |Circuit 2: ALU_wrapper_Fixed               
-------------------------------------------|-------------------------------------------
AOI22X1 (13)                               |AOI22X1 (13)                               
DFFSR (24)                                 |DFFSR (24)                                 
INVX1 (41)                                 |INVX1 (41)                                 
NAND2X1 (67)                               |NAND2X1 (67)                               
OAI21X1 (94)                               |OAI21X1 (94)                               
INVX4 (3)                                  |INVX4 (3)                                  
                <......>
MUX2X1 (1)                                 |MUX2X1 (1)                                 
BUFX2 (28)                                 |BUFX2 (28)                                 
DFFPOSX1 (12)                              |DFFPOSX1 (12)                              
INVX2 (4)                                  |INVX2 (4)                                  
XNOR2X1 (3)                                |XNOR2X1 (3)                                
INVX8 (1)                                  |INVX8 (1)                                  
OAI22X1 (1)                                |OAI22X1 (1)                                
CLKBUF1 (6)                                |CLKBUF1 (6)                                
Number of devices: 366                     |Number of devices: 366                     
Number of nets: 381                        |Number of nets: 381                        
---------------------------------------------------------------------------------------
Netlists match uniquely.

<......>

Subcircuit pins:
Circuit 1: ALU_wrapper                     |Circuit 2: ALU_wrapper_Fixed               
-------------------------------------------|-------------------------------------------
reset                                      |reset                                      
oACC[6]                                    |oACC[6]                                    
oACC[5]                                    |oACC[5]                                    
oACC[4]                                    |oACC[4]                                    
oACC[2]                                    |oACC[2]                                    
oACC[3]                                    |oACC[3]                                    
oACC[1]                                    |oACC[1]                                    
oACC[0]                                    |oACC[0]                                    
oACC[7]                                    |oACC[7]                                    
iSel[0]                                    |iSel[0]                                    
iSel[1]                                    |iSel[1]                                    
iOutSel                                    |iOutSel                                    
clk                                        |clk                                        
iAB[1]                                     |iAB[1]                                     
iAB[0]                                     |iAB[0]                                     
iAB[3]                                     |iAB[3]                                     
iAB[2]                                     |iAB[2]                                     
iAB[4]                                     |iAB[4]                                     
iAB[5]                                     |iAB[5]                                     
iAB[6]                                     |iAB[6]                                     
iAB[7]                                     |iAB[7]                                     
vdd                                        |vdd                                        
gnd                                        |gnd                                        
---------------------------------------------------------------------------------------
Cell pin lists are equivalent.
Device classes ALU_wrapper and ALU_wrapper_Fixed are equivalent.
Final result: Circuits match uniquely.

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

[목차][이전][다음]