2026년 3월 22일 일요일

[베릴로그 RTL 예제] 탁구 게임기 -8편: "내 칩"-

[베릴로그 RTL 예제] 탁구 게임기 -8편: "내 칩"-

목차:

1. RTL 베릴로그로 "탁구대" 그리기
2. 그래픽 LCD 구동 칩의 시뮬레이션 모델
3. "탁구대"의 그래픽 테스트 벤치
4. 움직이는 탁구공
5. GLCD의 버스 기능 모델
6. 탁구대, 움직이는 공 그리고 탁구채
7. 코-에뮬레이션(Co-Emulation) 검증

8. "내 칩"
    8-1. 반도체 제조도면
    8-2. 합성
    8-3. 합성 후 시뮬레이션
    8-4. 표준 셀 배치와 배선
    8-5. 사인-오프: '레이아웃' 도면 검사
        a. 적층 비아 검사(Stacked Via Check)
        b. 디자인 룰 검사(Design Rule Check)
        c. 레이아웃 대 회로도(Layout versus Schematic) 검사
    8-6. 칩-탑
    8-7. 실습 및 과제

----------------------------------------------------------------------------------------------------------------
오픈-소스 반도체 설계 도구가 설치된 "내 칩 디자인 킷"의 WSL 가상 디스크 이미지  [링크]
----------------------------------------------------------------------------------------------------------------

8. "내 칩"

설계와 검증을 마친 "탁구 게임기"를 ASIC으로 제작하기로 한다. 반도체 제조 공정은 "내 칩 제작 서비스[모아팹 링크]"의 0.5um Si-CMOS 2-Poly 3-Metal 공정이다. 학생들의 설계를 제출 받아 무료로 제작해주는 MPW 서비스다. 이 서비스를 이용 하려면 지원서와 함께 제조도면(레이아웃)을 GDS 형식으로 제출한다. 오픈-소스 반도체 설계 도구를 사용하여 구축된 표준 셀 디자인 킷[링크]을 활용하여 베릴로그 합성에서 GDS 레이아웃을 생성하는 과정을 설명한다.


[출처]ETRI 0.5um CMOS MPW Std-Cell Design-Kit,
https://github.com/GoodKook/ETRI-0.5um-CMOS-MPW-Std-Cell-DK

8-1. 반도체 제조도면

"탁구 게임기"를 베릴로그로 기술하고 시뮬레이션과 에뮬레이션으로 검증까지 마쳤다. 설계를 마친 셈이다. 이제 "내 칩"을 제작의뢰 하기 위해 도면을 그릴 차례다. 설계자가 반도체라는 물질을 가지고 트랜지스터를 제조하는 과정을 모두 알 필요는 없다. 궁금 하다면 이래의 동영상을 한번 보는 것 만으로 충분하다.


Chip Manufacturing - How are Microchips made? | Infineon
https://youtu.be/bor0qLifjz4?si=LxkssW3X-_8dRinn

CMOS Tech: NMOS and PMOS Transistors in CMOS Inverter (3-D View),
https://youtu.be/oSrUsM0hoPs

반도체 제조 도면을 "레이아웃"이라 한다. 평면위에 반도체 물질을 배치하여 트랜지스터를 구성하고 이들을 배선한 기하학적인 도면이다. 전자회로 인쇄기판 PCB(Printed Circuit Board)의 도면과 다를바 없다. 도면의 그림 형식이 GDS 다. 간단한 "탁구 게임기"만 해도 필요한 트랜지스터 갯수가 수천에 이른다. 이들을 평면에 배치와 배선을 손수 할 일이 아니다. 프로그래밍 언어로 코딩을 해놓으면 컴파일러가 알아서 기계어로 바꿔 주고 운영체제가 이를 실행 시켜주었다. "탁구 게임기"를 베릴로그로 코딩해 놓으면 합성기가 이를 디지털 논리회로로 바꿔주고 자동 배치 배선 도구가 도면을 완성해 준다. 반도체 도면 생성은 자동화 되어있다.

제조도면 그리기는 "설계"가 아니다.

8-2. 합성

앞서 에뮬레이터 검증 편에서 "탁구 게임기"를 묘사한 베릴로그 문장을 FPGA 반도체에서 작동시켰었다. 논리회로도를 작성하지 않았었고 배치와 배선까지 자동화 도구가 해줬다. 반도체 공장에 "내 칩"을 제조해 달라고 도면을 만드는 과정 역시 상당부분 자동화 되어있다. FPGA 에서 0.5um CMOS 공정의 전용 칩 ASIC(Application Specific IC)으로 바뀌었을 뿐이다.

"합성"은 베릴로그로 묘사된 구문을 디지털 논리 회로도로 변환해주는 과정이다. "탁구 게임기"를 묘사한 베릴로그 문장을 디지털 논리회로로 변환해 주는 오픈-소스 도구는 Yosys 다. 이 합성도구를 사용하는 방법은 GNU C++ 컴파일러 사용법과 다르지 않다. 다만 제조할 공정을 지정하고 라이브러리의 경로를 맞춰줘야 하는 절차가 필요하다. C++컴파일러에서도 유사한 절차를 따라야 하지만 개발환경 도구들(아듀이노 IDE, 라즈베리 SDK 등)이 사전에 설정해 놓은 덕에 프로그래머는 수월하게 개발을 할 수 있다. 오픈-소스 반도체 설계 도구의 개발환경이 QFlow 다. 그래픽 사용자 인터페이스 GUI(Graphic User Interface) 대신 명령줄 인터페이스 CLI(Command Line Interface)다. "탁구 게임기"를 디지털 논리회로로 합성해보자. 오픈-소스 반도체 개발 환경 QFlow 는 마이크로소프트사의 비쥬얼 스튜디오처럼 친절하지 않다는 점을 미리 기억해 두자. 검증을 마친 설계 파일들을 바탕으로 합성을 수행하기로 한다. 아래 과정은 리눅스 운영체제 상에서 도구의 사용법을 보여주기 위한 예시이므로 따라할 필요는 없다. 추후 "실습"에서 다룰 것이므로 지금은 읽기와 이해에 집중하자.

리눅스 홈 디렉토리로 이동 한 후 작업 디렉토리 생성,

    $ cd ~

    $ mkdir MyChip_Work

앞서 검증한 설계 파일들을 작업 디렉토리로 복사해 온다.

    $ cd MyChip_Work

    $ cp -r ~/ETRI050_DesignKit/Projects/RTL/pong_SbS/07_Co-Emulation .

예제 디렉토리로 이동,

    $ cd 07_Co-Emulation

디렉토리 구조와 설계 파일들을 살펴본다.

    $ tree
    .
    ├── /emulation
    │   ├── Epong_SbS.h
    │   ├── Makefile
    │   ├── pong_SbS_wrapper.v
    │   ├── /PSCE-MI
    │   │   ├── /Epong_SbS
    │   │   │   ├── Epong_SbS.ino
    │   │   │   ├── PinMap_A7_100T.h
    │   │   │   ├── PinMap_TANG_25K.h
    │   │   │   ├── PSCE_APIs.cpp
    │   │   │   ├── PSCE_APIs.h
    │   │   │   ├── PSCE_Config.h
    │   │   │   └── PSCE_Splash.h
    │   │   └── Makefile
    │   └── /PSCE-TRANS
    │       └── /Altera_Cmd
    │           ├── Makefile
    │           └── pong_SbS_wrapper.tcl
    ├── /pong_SbS
    │   └── pong_SbS.v
    └── /simulation
        ├── Makefile
        ├── sc_glcd128x64_TLM.cpp
        ├── sc_glcd128x64_TLM.h
        ├── sc_main.cpp
        ├── sc_pong_SbS_TB.cpp
        ├── sc_pong_SbS_TB.gtkw
        ├── sc_pong_SbS_TB.h
        └── Vpong_SbS.gtkw

    8 directories, 22 files

"탁구 게임기"의 베릴로그는 pong_SbS/pong_SbS.v 다. 시뮬레이션과 에뮬레이션 작업 디렉토리를 별도로 만들었던 것처럼 "내 칩" 작업 디렉토리 ETRI050 를 만들고 이동한다.

    $ mkdir ETRI050

    $ cd ETRI050

합성 하면서 생성되는 각종 중간(임시) 파일들을 저장할 디렉토리를 만들어 준다. QFlow 환경에서 반드시 필요한 하위 디렉토리는 layout, log, synthesis, source 다.

    $ mkdir layout

    $ mkdir log

    $ mkdir synthesis

디렉토리 source 는 합성 할 베릴로그 파일이 저장된 곳이다. "탁구 게임기"의 베릴로그 디렉토리를 source  로 심볼(소프트)링크 한다.

    $ ln -s ../pong_SbS ./source

    $ ll
    total 8
    drwxr-xr-x 2 mychip ...... layout
    drwxr-xr-x 2 mychip ...... log
    lrwxrwxrwx 1 mychip ...... source -> ../pong_SbS
    drwxr-xr-x 2 mychip ...... synthesis

QFlow 프로젝트 파일을 만들기 위해 GUI 모드로 실행,

    $ qflow gui


합성 목표 공정을 etri050 으로 변경,

이어 "Run" 버튼을 눌러 "Okay"를 확인한다.

QFlow 를 사용할 환경이 준비됐다. 이후 과정은 모두 명령줄로 실행될 것이다. QFlow GUI는 더이상 사용하지 않을 것이므로 종료한다. 디렉토리 목록을 보면 project_vars.sh 가 생성된 것을 확인한다.

$ ll

total 24
drwxr-xr-x 2 mychip mychip 4096 Mar 22 11:37 layout
drwxr-xr-x 2 mychip mychip 4096 Mar 22 11:37 log
lrwxrwxrwx 1 mychip mychip   11 Mar 22 11:17 source -> ../pong_SbS
drwxr-xr-x 2 mychip mychip 4096 Mar 22 11:18 synthesis
-rw-r--r-- 1 mychip mychip 1733 Mar 22 11:37 project_vars.sh
-rwxr--r-- 1 mychip mychip 1461 Mar 22 11:37 qflow_exec.sh
-rw-r--r-- 1 mychip mychip  683 Mar 22 11:37 qflow_vars.sh

합성 명령을 주고 QFlow 실행 한다.

    $ qflow synthesize -T etri050 pong_SbS

화면에 메시지가 순식간에 지나간다. log 디렉토리에 합성기의 메시지들이 기록된다. 노련한 설계자는 도구가 보여주는 각종 메시지를 읽고 이해한다. 실력은 이 기록 파일들을 이해하고 적절한 대응을 할줄 아는가에 달렸다. 최소한 합성 오류가 없다는 것부터 확인하자.

    Done.

합성 로그 파일 log/synth.log 에서 기초적으로 확인할 사항은 "내 칩"의 디지털 회로 구성이다. 회로의 규모를 파악할 수 있다.

Qflow synthesis logfile created on Sun Mar 22 11:46:32 AM KST 2026
Running yosys for verilog parsing and synthesis

yosys  -s pong_SbS.ys

 /------------------------------------------------------------------\
 |  yosys -- Yosys Open SYnthesis Suite                             |
 |  Copyright (C) 2012 - 2026  Claire Xenia Wolf<claire@yosyshq.com>|
 |  Distributed under an ISC-like license, type "license" to see    |
 \------------------------------------------------------------------/

 Yosys 0.62+9 (git sha1 1717fa018, clang++ 18.1.3 -fPIC -O3)

    ......

12. Printing statistics.

=== pong_SbS ===
        +----------Local Count, excluding submodules.
        | 
      472 wires
      511 wire bits
      472 public wires
      511 public wire bits
        9 ports
       20 port bits
      506 cells
       17   AND2X2
       24   AOI21X1
       15   AOI22X1
       15   BUFX2
       38   DFFSR
       66   INVX1
        1   MUX2X1
      105   NAND2X1
       51   NAND3X1
       71   NOR2X1
        1   NOR3X1
       83   OAI21X1
        8   OAI22X1
       11   OR2X2

506개의 표준 셀이 동원되었고 결선은 472개다. 조합 논리 셀(AND, OR, NOT 게이트)과 비동기 셋과 리셋이 있는 D-플립플롭이 있다. 이어 몇가지 중간 파일들을 만들어 냈다고 알려준다. 주로 네트리스트 파일들이다. 네트리스트는 논리 게이트와 플립플롭들의 결선을 언어로 기술한 것으로 회로도(schematics)를 그림 대신 언어로 표현했다. Spice 파일은 레이아웃과 LVS 용으로 사용될 것이다.

Generating RTL verilog and SPICE netlist file in directory
         /home/mychip/MyChip_Work/07_Co-Emulation/ETRI050/synthesis

Files:
   Verilog: .../ETRI050/synthesis/pong_SbS.rtl.v
   Verilog: .../ETRI050/synthesis/pong_SbS.rtlnopwr.v
   Verilog: .../ETRI050/synthesis/pong_SbS.rtlbb.v
   Spice:   .../ETRI050/synthesis/pong_SbS.spc

Reading liberty netlist /usr/local/share/qflow/tech/etri050/etri05_stdcells.lib

Reading spice netlist pong_SbS.spc
Writing xspice netlist pong_SbS.xspice
Writing xspice file

Done.

8-3. 합성 후 시뮬레이션

합성기의 오류는 없을까? 베릴로그 구문에서 디지털 회로로 변환(합성)해 주는 Yosys 합성기는 소프트웨어(응용 프로그램)이다. 내부 '버그'로 부터 자유롭지 않다. 게다가 합성의 결과로 얻은 네트리스트는 소프트웨어에서 디지털 회로의 하드웨어로 옮겨 왔으므로 '회로 경로' 상 시간지연을 담고 있다. 클럭 엣지의 시간조건 오류(바이얼레이션, clock timing violation, setup-hold violation)도 살펴봐야 한다. 변환이 기능적으로 이상이 없을지, 회로상 바이얼레이션은 없을지 확인해보기 위해 합성 후 네트리스트 시뮬레이션을 실시한다.

합성 후 시뮬레이션 용도의 네트리스트 베릴로그로는 synthesis/pong_SbS_mapped.v 다. 무려 3천줄이 넘는다. 합성 로그에서 봤던 506개의 셀들과 450여개에 이르는 배선(wire)들이 기술되었다. (*...*) 는 합성기 내부 정보를 표시하는데 디지털 셀들이 베릴로그의 어느 문장에서 도출되었는지 표시하고 있다. 불필요하게 생성된 부분은 없는지 확인 할 수 있다.

/* Generated by Yosys 0.62+9 (git sha1 1717fa018, ... -fPIC -O3) */

(* top =  1  *)
(* src = ".../pong_SbS.v:9.1-169.10" *)
module pong_SbS(clk, reset, x_pos, y_pos, pixel, p_tick, busy, up, down);
  (* src = ".../pong_SbS.v:10.17-10.20" *)
  input clk;
  wire clk;
  (* src = ".../pong_SbS.v:11.17-11.22" *)
  input reset;
  wire reset;
  (* src = ".../pong_SbS.v:12.17-12.22" *)
  output [6:0] x_pos;
  wire [6:0] x_pos;
  (* src = ".../pong_SbS.v:13.17-13.22" *)
  output [5:0] y_pos;
  wire [5:0] y_pos;
  (* src = ".../pong_SbS.v:14.17-14.22" *)
  output pixel;
  wire pixel;
    ......
  (* onehot = 32'd1 *)
  wire [1:0] State;
  wire _0_;
  wire _100_;
  wire _101_;
    ............
  wire _99_;
  wire _9_;
  (* src = "pong_SbS.v:136.17-136.23" *)
  wire [5:0] paddle;

  (* src = "....../pong_SbS.v:25.17-25.23" *)

  wire v_sync;

  (* src = "....../pong_SbS.v:75.15-75.21" *)

  wire [5:0] y_ball;

  (* keep = 32'd1 *)
  BUFX2 _456_ (
    .A(_454_[6]),
    .Y(x_pos[6])
  );
    ......
  (* src = ".../pong_SbS.v:76.5-93.8" *)
  DFFSR _960_ (
    .CLK(clk),
    .D(_370_),
    .Q(y_ball[4]),
    .R(1'h1),
    .S(_388_)
  );

  DFFSR _961_ (
    .CLK(clk),
    .D(busy),
    .Q(State[0]),
    .R(1'h1),
    .S(_388_)
  );
endmodule

합성 후 네트리스트의 하위 모듈들(BUFX2, DFFSR 등)은 모두 표준 셀이다. 이 표준 셀들의 기능적, 시간적 모델은 디자인 킷으로 제공된다. 표준 셀의 타이밍 모델과 네트리스트를 묶어 시뮬레이션을 실시한다. 합성 후 네트리스트 시뮬레이션 또한 검증의 일관성을 유지해야 한다. 기능 시뮬레이션에 사용했던 SystemC 테스트 벤치를 네트리스트 타이밍 시뮬레이션에서도 동일하게 적용한다. 베릴로그의 VPI(Verilog Procedural Interface)를 통하면 C 언어로 작성된 함수를 호출할 수 있다. 베릴레이터가 포용하는 범위는 제한적이다. 베릴로그로 높은 추상화 수준에서 타이밍 모델링할 수 있는 사용자 지정 프리미티브(UDP, User Defined Primitives)를 지원하지 않는다. 따라서 네트리스트 타이밍 시뮬레이션은 다른 오픈-소스 베릴로그 시뮬레이터 이카루스베릴로그 iVerilog를 사용한다.

VPI(PLI2.0) 표준은 매우 방대하다. 객체 표현 추상성이 낮은 C 언어에 기초하고 있어서 하드웨어를 기술하려면 번거로운 절차를 따라야 한다. 운용 방식은 기본적으로 사건과 콜-백 함수의 조합이다. GNU C++ 컴파일러의 넓은 호한성 덕에 SystemC의 C++를 VPI에 연결 시킬 수 있다. 방대한 VPI에 대한 설명은 다음으로 미루고 준비된 VPI 루틴을 활용하여 네트리스트 타이밍 시뮬레이션을 수행해본다.

ETRI050 작업 디렉토리에 하위 시뮬레이션 디렉토리를 만든다.

    $ pwd

        ~/MyChip_Work/07_Co-Emulation/ETRI050

    $ mkdir simulation

    $ cd simulation

미리 만들어 놓은 VPI 소스 코드 복사,

    $ pwd

        ~/MyChip_Work/07_Co-Emulation/ETRI050/simulation

    $ cp ~/ETRI050_DesignKit/Projects/RTL/pong_SbS/08_ETRI050/ETRI050/simulation/*.* .

    $ ls -l

    total 36
    -rw-r--r-- 1 mychip ...... pong_SbS_TB.v
    -rw-r--r-- 1 mychip ...... sc_pong_SbS_TB.h
    -rw-r--r-- 1 mychip ...... vpi_pong_SbS_tb.cpp
    -rw-r--r-- 1 mychip ...... vpi_pong_SbS_tb_exports.h
    -rw-r--r-- 1 mychip ...... vpi_pong_SbS_tb_ports.h
    -rw-r--r-- 1 mychip ...... vpi_stub.cpp

SystemC 테스트벤치를 재사용하기 위해 기능 시뮬레이션에 사용되었던 파일들을 현재 디렉토리로 심볼 링크,

    $ ln -s ../../simulation/sc_pong_SbS_TB.cpp ./sc_pong_SbS_TB.cpp

    ln -s ../../simulation/sc_glcd128x64_TLM.cpp ./sc_glcd128x64_TLM.cpp

    $ ln -s ../../simulation/sc_glcd128x64_TLM.h ./sc_glcd128x64_TLM.h

VPI 모듈을 빌드한다. 만들어지는 바이너리 vpi_stub,vpi 는 SystemC 테스트벤치와 함께 링크되는 동적 라이브러리(쉐어드 오브젝트, shared object)다.

    $ g++ -DVPI_SIM \
            -I/usr/local/include/iverilog \
            -I/opt/systemc/include -I.. \
            -L/opt/systemc/lib \
            -g -fPIC \
            -o vpi_stub.vpi \
            -shared -latomic -lsystemc -lgsl -lSDL2 \
            ./vpi_stub.cpp \
            ./sc_glcd128x64_TLM.cpp  \
            ./vpi_pong_SbS_tb.cpp \
            ./sc_pong_SbS_TB.cpp

이어 베릴로그 DUT와 테스트벤치를 묶어 시뮬레이터를 빌드한다. 표준셀의 타이밍 모델은 khu_etri05_stdcells.v에 기술되었다.

    $ iverilog -g2005-sv -Tmin -gspecify \
               -o pong_SbS_TB \
                pong_SbS_TB.v  \
             ~/ETRI050_DesignKit/digital_ETRI/khu_etri05_stdcells.v \
              ../synthesis/pong_SbS_mapped.v

앞서 빌드한 VPI 라이브러리와 함께 시뮬레이터를 실행 시켜보자. 

    $ vvp -M. -mvpi_stub pong_SbS_TB -v

    vpi_stub:`./vpi_stub.vpi' failed to open using dlopen() because:

    libsystemc.so.3.0: cannot open shared object file
    pong_SbS_TB.v:59: Error: System task/function
            $sc_pong_SbS_tb() is not defined by any module.
    pong_SbS_TB: Program not runnable, 1 errors.

쉐어드 오브젝트 libsystemc.so.3.0 를 찾지 못해서 VPI 함수 $sc_pong_SbS_tb()를 호출할 수 없다고 한다. 리눅스 파일 시스템에서 동적 링크 SystemC의 쉐어드 오브젝트 파일의 위치를 찾아보자.

    $ find /opt -name "libsystemc.so.3.0"
    /opt/systemc/lib/libsystemc.so.3.0

리눅스 배쉬 쉘의 변수 LD_LIBRARY_PATH 는 동적 링크 라이브러리의 탐색 경로를 지정한다. 위에서 찾은 경로를 환경변수에 넣고 시뮬레이션을 실행 한다.

    $ LD_LIBRARY_PATH=/opt/systemc/lib

    $ vvp -M. -mvpi_stub pong_SbS_TB -v

베릴로그 기능 시뮬레이션에 비해 실행이 매우 느리다. 네트리스트 베릴로그에 500여개의 하위 모듈과 네트들이 모두 사건을 발생하기 때문이다. 타이밍 시뮬레이션으로 얻은 파형을 관찰해보자.

    $ gtkwave pong_SbS_TB.vcd

시뮬레이션이 시작되기 직전에 모든 출력 신호들에 붉은 색의 '알수없음(unknown)'이다.

리셋 reset 입력이 주어지면서 '알수없음'이 더이상 지속되지 않고 있다. '알수없음'이 가장 길게 지속되는 출력이 pixel이다.

탁구대, 공 그리고 패들을 그리는 픽셀 값이 조합회로 였기 때문이다.

    // Table --------------------------------------------------------
    wire pixel_table = ((x_pos>5) && (x_pos<15))? 1:0;
    // Ball ---------------------------------------------------------
    reg pixel_ball;
    always @*
        if ((x_ball<=x_pos) && ((x_ball+7)>=x_pos) &&
            (y_ball<=y_pos) && ((y_ball+7)>=y_pos))
            pixel_ball = rom_data[rom_bit];
        else
            pixel_ball = 0;
    // Paddle -------------------------------------------------------
    wire pixel_paddle;
    assign pixel_paddle = ((x_pos>122) && (y_pos>paddle) && (y_pos<(paddle+20)))? 1:0;

    // Pixel --------------------------------------------------------
    assign pixel = (pixel_table ^ pixel_ball) | pixel_paddle;

조합회로 출력 pixel 에 글리치(glitch)가 발생하는 모습을 볼 수 있다.

클럭 clk 의 상승 엣지 부분을 확대해 보면 출력 신호들이 저마다 지연을 반영하고 있는 것을 확인할 수 있다.

만일 타이밍 시뮬레이션에서 오류가 발생한다면 디지털 파형은 중요한 단서를 제공한다. 베릴로그 설계에서 플립플롭이 모두 비동기식 리셋을 가졌음에도 불구하고 초기 "알수없음"으로 시작하는 이유를 찾아보라.

8-4. 표준 셀 배치와 배선

수백개에 이르는 부품을 배치하고 배선까지 수동으로 할 수 있는 인쇄회로 기판 PCB 설계 능력자를 상상하기 어렵다. 반도체 설계에서 표준 셀은 '부품'에 해당한다. "탁구 게임기"를 합성하여 얻은 네트리스트에 표준 셀이 500여개에 이른다. 배치와 배선은 자동화 할 수 밖에 없다. 표준 셀 자동 배치에 줄수 있는 옵션은 기판의 가로세로비, 입출력 포트(핀)를 뽑을 상하좌우 방향, 표준 셀 밀도다.

배치 평면의 가로세로비는 자동 배치 설정 파일 layout/pong_SbS.par 에서 지정한다. 이 파일은 합성 과정에서 생성된다. TWMC*chip.aspect.ratio 값을 변경하여 가로 또는 세로로 긴 배치를 할 수 있다. 기본 값은 1.0으로 정방형으로 배치한다.

    # etri050.par --- Parameter file for GrayWolf

    ........

    TWMC*chip.aspect.ratio : 1.0

    GENR*flip_alternate_rows : 1

향후 패드 부착 위치를 지정하여 패키지 했을때 IC 부품 핀 번호에 규칙성을 가지도록 한다. 특히 한 신호가 다수의 비트로 구성되는 디지털 칩의 경우 응용 보드를 제작할 때 매우 유리하다. "내 칩"의 소비자를 고려해야 한다. 입출력 포트를 뽑을 방향을 지정하는 파일은 layout/pong_SbS.cel2 이다. 이 파일은 자동으로 생성되지 않으므로 직접 만들어 주어야 한다.

    $ touch layout/pong_SbS.cel2

"탁구 게임기"는 x_pos와 y_pos 가 여러 비트로 구성된 포트다. 각각 좌측과 하단에 배치하기로 하자. 핀 배치 설정 파일의 예는 다음과 같다. 지정되지 않은 핀들은 임의로 배치된다.

    $ cat layout/pong_SbS.cel2

    padgroup _Clk_ permute
    twpin_clk       nonfixed
    restrict side T

    padgroup _x_pos_ permute
    twpin_x_pos[0]       nonfixed
    twpin_x_pos[1]       nonfixed
    twpin_x_pos[2]       nonfixed
    twpin_x_pos[3]       nonfixed
    twpin_x_pos[4]       nonfixed
    twpin_x_pos[5]       nonfixed
    twpin_x_pos[6]       nonfixed
    restrict side L

    padgroup _y_pos_ permute
    twpin_y_pos[5]       nonfixed
    twpin_y_pos[4]       nonfixed
    twpin_y_pos[3]       nonfixed
    twpin_y_pos[2]       nonfixed
    twpin_y_pos[1]       nonfixed
    twpin_y_pos[0]       nonfixed
    restrict side B

표준 셀 배치 밀도는 QFlow의 프로젝트 파일 project_vars.sh 에서 지정한다. 아울러 겹친 비아 배선을 금지해 놓아야 한다.

    # Placement command options:
    # -------------------------------------------

    set initial_density = 0.8

    # Router command options:
    # -------------------------------------------
    set route_show = 1
    set via_stacks = none

ETRI050 디렉토리로 이동 후 자동 배치 명령을 주어 QFlow를 실행 한다.

    $ pwd
    ~/MyChip_Work/07_Co-Emulation/ETRI050

    $ qflow place -T etri050 pong_SbS

이어 배선이다.

    $ qflow route -T etri050 pong_SbS

"탁구 게임기"는 크지 않은 설계인 까닭에 배치와 배선은 순식간에 끝난다. 배치와 배선은 상당히 까다로운 과정으로 자동화 도구를 운영하는 과정에서 큰 시간 비중을 차지하므로 신중히 결정해야 한다. 마이크로 프로세서와 주변장치들이 포함된 시스템 규모의 설계인 경우 배치와 배선에만 수시간을 넘어 수일씩 걸린다. 따라서 FPGA 를 비롯하여 상용 자동화 도구에서도 매우 공을 들이는 부분이기도 하다. 블럭으로 나눠 각각 배치배선 후 매크로 단위로 재배치 하거나 수정이 없는 부분을 따로 분리하여 하드 매크로로 사용하는 등의 기법이 동원된다. 이 때 각 블럭들의 관리 전략이 매우 중요하다.

자동 배치와 배선을 마치면 표준 셀을 병합해 준다.

    $ qflow migrate -T etri050 pong_SbS

자동 배치와 배선 그리고 표준 셀 병합을 마치면 레이아웃은 생성된다. 검증이 완료된 설계에서 제조도면을 만드는 과정은 자동화 도구에 의하여 수행된다. 디지털 반도체 설계에서 레이아웃 도면을 손수 그릴 일은 없다. 다시한번 상기해 둔다. 도면 그리기를 "설계"로 오해하지 말자.

8-5. 사인-오프: '레이아웃' 도면 검사

자동 배치와 배선 도구의 오류는 없을까? 합성기와 마찬가지로 이 자동화 도구 역시 '버그'로부터 자유롭지 못한 응용 프로그램이다. 자동 배치배선도구가 만들어낸 레이아웃을 검사해 봐야 한다. 자동화 도구가 만들어낸 도면이 저장된 디렉토리 layout로 이동한다.

    $ cd layout

    $ ls -l

    total 3392
    -rw-r--r-- 1 mychip      34 Mar 22 22:19 fail.out
    -rw-r--r-- 1 mychip   45375 Mar 22 22:19 fillcells.txt
    -rw-r--r-- 1 mychip    1706 Mar 22 22:19 migrate_pong_SbS.tcl
    -rw-r--r-- 1 mychip  361263 Mar 22 22:19 pong_SbS.cel
    -rw-r--r-- 1 mychip     539 Mar 22 21:50 pong_SbS.cel2
                .......
    -rw-r--r-- 1 mychip  264599 Mar 22 22:19 pong_SbS.def
    -rw-r--r-- 1 mychip 1362701 Mar 22 22:19 pong_SbS.lef
    -rw-r--r-- 1 mychip  268021 Mar 22 22:19 pong_SbS.mag
    -rw-r--r-- 1 mychip    1671 Mar 22 11:37 pong_SbS.par
                .......
    -rw-r--r-- 1 mychip   98630 Mar 22 22:19 pong_SbS_unroute.def

많은 중간(임시) 파일들이 보이는데 최종 레이아웃은 pong_SbS.mag 다. 레이아웃을 표현하는 파일 형식은 사용하는 도구마다 상이하다. 오픈-소스 레이아웃 편집 도구 Magic의 파일 확장자는 .mag 다. 최근 혼란을 피하기 위해 업계 표준으로 OASIS(An Open Artwork System Interchange Standard)가 제정되었다. 전통적으로 사용되어왔던 형식은 GDS다. 반도체 제조 공장에 제출하는 형식이다.

반도체 제조 공장에 제출할 도면을 검사하려는 참이다. 반도체 제조공장의 사정에 따라 공정 특성과 제약사항이 있다. 이 규정은 일반적인 사항이 아니므로 특별히 전용의 검사도구가 필요하다. 이러한 도구를 '인-하우스 툴(in-house tool)'이라 하며 디자인 킷의 일부로 제공된다. 이후 진행할 '레이아웃' 검사에 사용된 도구들은 "내 칩 MPW" 공정용 인-하우스 툴을 사용한다. '사인-오프(sign-off)'는 반도체 제조 공장에 제출할 도면이 최종적으로 공정의 요구조건을 따랐는지 확인 도장을 찍는 절차다. 적층 비아 검사(Stacked Via Checl), 디자인 룰 검사(Design Rule Check), 회로도 대 레이아웃 검사(Layout Versus Schematic Check)가 이에 해당한다. 내 칩 제작 서비스의 지원서에 이를 이행 했음을 확인하는 항목을 두고 있다.

a. 적층 비아 검사(Stacked Via Check)

"내 칩 MPW" 공정은 3개의 금속층을 가진다. PCB로 치면 3층 기판인 셈이다. 금속층 사이의 연결을 위해 뚫는 구멍을 비아(via)라 한다. "적층 비아"는 가장 아랫층과 윗층을 구멍 한개로 연결한 경우다.

"내 칩 MPW" 공정은 적층 비아를 금지한다. 인-하우스 도구 check_via_stack.py는 레이아웃 파일 pong_SbS.mag 을 읽어 금속 1층과 2층 사이의 비아와 금속 2층과 3층의 비아 사이의 거리를 검사한다. 이 도구는 파이썬으로 작성되었다.

    $~/ETRI050_DesignKit/scripts/check_via_stack.py pong_SbS \
                m2contact m3contact 6 | \
                tee pong_SbS_Stacked.log

    --------------------
    Checking Stacked VIA in pong_SbS.mag
         From VIA: << m2contact >>
         To VIA  : << m3contact >>
         Margin  : 6
    Mult=1 / Div=2

    [0][1][2][3][4][5][6][7][8][9]
    [10][11][12][13][14][15][16]

    Stacked #1
    << m2contact >> rect 1713 473 1727 487
    << m3contact >> rect 1713 473 1727 487

    Box(Scaled): 856 236 863 243

    [17]
    ***************************************
    1 Stacked Contact and/or Via found!
    Magic layout "pong_SbS_Stacked.mag" created with DRC error layer

자동 배선도구를 실행 하면서 적층 비아 배선을 금지하도록 QFlow 프로젝트 파일project_vars.sh 에  명시해 놓았다.

    # Router command options:
    # -------------------------------------------
    set via_stacks = none

하지만 1개의 적층 비아가 검출 되었다. 자동화 도구가 항상 완벽하지 않다는 것을 보여준다. 레이아웃 편집 도구 Magic을 사용하여 적층 비아를 찾아 수정해 주어야 한다. 인-하우스 도구 check_via_stack.py는 적층 비아가 발견된 위치에 오류 표시를 해놓은 pong_SbS_Stacked.mag를 생성한다. 이 파일을 읽어 오류 위치를 찾아 수동으로 편집해 주어야 한다.

    $ magic -d XR pong_SbS_Stacked.mag

적층 비아의 위치를 찾아 수정하려면 레이아웃 도구 Magic 의 사용법을 익혀야 한다. 그나저나 저 넓은(?) 평면위에서 적층 비아가 표시된 위치는 어떻게 찾을까?

b. 디자인 룰 검사(Design Rule Check)

디자인 룰은 공정의 정밀도를 감안하여 기하학적 허용치를 규정한 것이다. 표준 셀은 이 규정에 따라 제작되었다. 자동 배선도구에 의해 그려진 금속 배선이 디자인 규칙을 따랐는지 검사한다. 디자인 룰 검사를 수행하는 오픈-소스 도구는 Magic이다. 레이아웃 편집하는 목적이 아니므로 스크립트 run_drc.sh로 DRC를 수행한다. 이 스크립트는 인-하우스 도구의 일부로 디자인 킷에 포함되어 제공된다.

    $~/ETRI050_DesignKit/scripts/run_drc.sh pong_SbS | \
                tee pong_SbS_DRC.log

    Magic 8.3 revision 538
    Starting magic under Tcl interpreter
    Using the terminal as the console.

        ......

    Using NULL graphics device.
    Processing system .magicrc file
    Input style lambda=0.30(p): scaleFactor=30, multiplier=1

    Root cell box:
               width x height  (   llx,  lly  ), (   urx,  ury  )
    microns:   0.000 x 0.000   ( 0.000,  0.000), ( 0.000,  0.000)
    lambda:     0.00 x 0.00    (  0.00,  0.00 ), (  0.00,  0.00 )
    internal:      0 x 0       (     0,  0    ), (     0,  0    )

    Cell pong_SbS read from current working directory

    Cell pong_SbS_DRC has 19 error tiles.

    Total DRC errors found: 0

    This layer can't abut or partially overlap between subcells

    Design-rule checker statistics (recent/total):
        Squares processed: 121/121
        Tiles processed: 314154/314154
        Edges pieces processed: 636487/636487
        Constraint areas checked: 3268440/3268440
        Multi-tile constraints: 2346669/2346669
        Interaction areas processed: 98/98
        Tiles processed for interactions: 314154/314154
        Tiles processed for arrays: 0/0

    Root cell box:
               width x height  (   llx,  lly  ),(   urx,  ury  )
    microns: 666.600 x 661.050 (-9.300, -3.600),( 657.300,  657.450)
    lambda: 2222.00  x 2203.50 (-31.00, -12.00),( 2191.00,  2191.50)
    internal:   4444 x 4407    (   -62, -24   ), (  4382,  4383 )

DRC 오류는 없으나 표준 셀이 겹친(overlap) 오류가 다수 검출 되었다. 배치될 때 이웃하는 표준 셀과 전원선을 공유하도록 여유를 두었기 때문이다. 표준 셀의 겹침은 무시해도 좋다.

c. 레이아웃 대 회로도(Layout versus Schematic) 검사

자동 도구가 배선을 완결 했는지 검사한다. 배선된 레이아웃으로부터 네트리스트를 추출하여 합성으로 얻은 네트리스트와 비교한다. 네트리스트 비교를 수행하는 오픈-소스 도구는 netgen 이다. 레이아웃 도구 Magic은 도면으로부터 Spice 네트리스트를 추출하는 기능을 가지고 있다. 네트리스트 추출과 비교를 수행하는 스크립트는 run_lvs.sh 다. 이 스크립트는 인-하우스 도구의 일부로 디자인 킷에 포함되어 제공된다.

    $~/ETRI050_DesignKit/scripts/run_lvs.sh pong_SbS | \
                tee 
pong_SbS_LVS.log

    Magic 8.3 revision 538
    Starting magic under Tcl interpreter
    Using the terminal as the console.

    .......

    Extracting DFFSR into
        /home/mychip/ETRI050_DesignKit/digital_ETRI/DFFSR.ext:
    Extracting BUFX2 into
        /home/mychip/ETRI050_DesignKit/digital_ETRI/BUFX2.ext:
    Extracting CLKBUF1 into
        /home/mychip/ETRI050_DesignKit/digital_ETRI/CLKBUF1.ext:
    Extracting FILL into
        /home/mychip/ETRI050_DesignKit/digital_ETRI/FILL.ext:

    Extracting pong_SbS into pong_SbS.ext:
    exttospice finished.

    ......

    Reading netlist file pong_SbS.spice
    Reading netlist file ../synthesis/pong_SbS.spc

    Call to undefined subcircuit FILL

    Creating placeholder cell definition.
    ......

    Contents of circuit 1:  Circuit: 'pong_SbS'
    Circuit pong_SbS contains 523 device instances.
      Class: NOR3X1                instances:   1
      Class: OR2X2                 instances:  11
      Class: MUX2X1                instances:   1

        ......

      Class: INVX2                 instances:  16
      Class: INVX8                 instances:   1

    Circuit contains 530 nets.

    Contents of circuit 2:  Circuit: 'pong_SbS'
    Circuit pong_SbS contains 523 device instances.

      Class: NOR3X1                instances:   1
      Class: OR2X2                 instances:  11
      Class: MUX2X1                instances:   1

        ......

      Class: INVX2                 instances:  16
      Class: INVX8                 instances:   1

    Circuit contains 530 nets.

    Circuit 1 contains 523 devices, Circuit 2 contains 523 devices.
    Circuit 1 contains 530 nets,    Circuit 2 contains 530 nets.

    Final result:
        Circuits match uniquely.

    LVS Done.

두 네트리스트가 완벽히 일치한다. 자동 배치와 배선도구로 생성한 도면에 겹친 비아와 디자인 룰 오류가 발견될 경우 수동 편집이 불가피 하다. 수동 편집 후 LVS 검사는 필수다.

8-6. 칩-탑

 "내 칩"이 반도체 부품으로 제작되어 응용 회로에 적용되려면 PCB 기판위에 납땜되어야 한다. 나노 미터 단위에서 기계적 조립이 가능한 미리미터 단위의 세계로 해상도를 높여야 한다. 기계적 측면 뿐만 아니라 전기적으로도 고려되어야 한다. 마이크로 미터 단위의 좁은 길이를 가지고 집적된 트랜지스터의 작동에 필요한 에너지는 나노 와트 미만이다. 자연계에서 발생하는 온갖 전기 에너지(정전기는 수천볼트에 육박한다!)에 의해 트랜지스터의 게이트 간격을 유지하는 산화막이 파괴될 수 있다. 정전기가 칩 내부로 침투하는 것을 차단하고 내부의 미세한 에너지 수준을 외부의 미리와트 세계로 바꿔주어야 한다. 입출력 패드가 이 역할을 한다.

"내 칩 MPW"에서 무료로 제작해 주는 칩의 크기는 1900x1900um 다. 입출력 핀의 갯수는 28개다. 설계와 검증을 마친 "내 칩"의 레이아웃을 이에 맞춰 배치하고 입출력 패드와 연결하는 작업이 '칩-탑'이다.

'칩-탑'은 레이아웃 편집 도구를 사용하여 PCB 그리기와 다를바 없는 금속층으로 연결 패턴을 그리는 작업이다. 아래 링크의 문서를 참고하여 연습해 보자.

[부록] FIR 필터 PE 의 "내 칩MPW" 제출용 GDS 생성 [링크][pdf]

8-7. 실습 및 과제

설계와 검증을 마친 "내 칩"을 ASIC으로 제작하기 위해 제조도면(레이아웃)을 생성하는 과정을 실습해본다. 예제 디렉토리의 구성은 다음과 같다.

    $ cd ~/ETRI050_DesignKit/Projects/RTL/pong_SbS/08_ETRI050

    $ tree
    .
    ├── /emulation
    ├── /ETRI050
    │   ├── Makefile
    │   ├── project_vars.sh
    │   ├── /chip_top
    │   │   ├── ETRI050_CMOS.lyp
    │   │   └── Makefile
    │   ├── /layout
    │   │   ├── ETRI050_CMOS.lyp
    │   │   ├── Makefile
    │   │   ├── pong_SbS.cel2
    │   │   └── pong_SbS.par
    │   └── /simulation
    │       ├── Makefile
    │       ├── pong_SbS_TB.v
    │       ├── sc_pong_SbS_TB.h
    │       ├── vpi_pong_SbS_tb.cpp
    │       ├── vpi_pong_SbS_tb_exports.h
    │       ├── vpi_pong_SbS_tb_ports.h
    │       └── vpi_stub.cpp
    ├── /pong_SbS
    │   └── pong_SbS.v
    └── /simulation
        ├── Makefile
        ├── sc_glcd128x64_TLM.cpp
        ├── sc_glcd128x64_TLM.h
        ├── sc_main.cpp
        ├── sc_pong_SbS_TB.cpp
        ── sc_pong_SbS_TB.h

설계 도구들을 명령줄에서 실행 시키려면 입력할 내용이 너무 길어진다. Makefile을 작성하여 생산성을 높이기로 한다. 작업 디렉토리로 이동,

    $ cd ETRI050

    $ ls -l

    total 32
    drwxr-xr-x 2 mychip mychip 4096 Mar 22 10:59 chip_top
    drwxr-xr-x 2 mychip mychip 4096 Mar 22 10:59 layout
    drwxr-xr-x 2 mychip mychip 4096 Mar 22 10:59 simulation
    -rw-r--r-- 1 mychip mychip 5064 Mar 22 10:59 Makefile
    -rw-r--r-- 1 mychip mychip 1771 Mar 22 10:59 project_vars.sh

Makefile이 준비되었다.

    $ make

    Symbolic link './source' to RTL...
    Create synthesis folder...

    Makefile for "Verilog-RTL Ex.: pong_SbS"
    QFlow RTL-to-Layout using ETRI 0.5um CMOS Technology

    TOP_MODULE=pong_SbS make synthesize
    TOP_MODULE=pong_SbS make place
    TOP_MODULE=pong_SbS make sta
    TOP_MODULE=pong_SbS make route
    TOP_MODULE=pong_SbS make migrate
    TOP_MODULE=pong_SbS make lvs
    TOP_MODULE=pong_SbS make size

    CC BY-NC, by GoodKook, goodkook@gmail.com

베릴로그 소스 디렉토리를 심볼 링크 하고 합성으로 생성되는 임시 파일들이 저장될 디렉토리 synthesis 를 만들었다.

a. 베릴로그 합성

합성명령을 주고 QFlow를 실행한다. 합성 목표 공정은 etri050 이다.

    $ make synthesize

    qflow synthesize -T etri050 pong_SbS

    yosys  -s pong_SbS.ys
    ......
    Done.

오픈-소스 합성기는 yosys 다. QFlow가 만든 스크립트 source/pong_SbS.ys 를 불러들여 합성한다. 

[과제] 합성의 결과는 타이밍 시뮬레이션, LVS 그리고 배치배선에 사용될 네트리스트다. 

    synthesis/pong_SbS_mapped.v
    synthesis/pong_SbS.spc
    synthesis/pong_SbS.v

각 네트리스트 파일의 형식을 비교해 보고 용도를 확인해보라.

b. 네트리스트 타이밍 시뮬레이션

네트리스트 시뮬레이션을 수행하기 위해 simulation 디렉토리로 이동,

    $ cd simulation

b-1. 시뮬레이션 준비,

    $ make

    Symbolic link './sc_pong_SbS_TB.cpp' ...
    Symbolic link './sc_glcd128x64_TLM.cpp' ...
    Symbolic link './sc_glcd128x64_TLM.h' ...

    Netlist timing simulation using iVerilog-VPI:pong_SbS

    TOP_MODULE=pong_SbS make build
    TOP_MODULE=pong_SbS make run
    TOP_MODULE=pong_SbS make wave
    TOP_MODULE=pong_SbS make clean

    CC BY-NC, by GoodKook, goodkook@gmail.com

SystemC 테스트벤치와 GLCD 모델을 재사용하기 위해 심볼링크 했다.

[과제] SystemC 테스트벤치의 헤더 파일 sc_pong_SbS_TB.h은 재사용되지 않고 있다. 아래의 두 헤더파일을 비교하고 재사용되지 않은 이유를 토론해 보자.

    08_ETRI050/ETRI050/simulation/sc_pong_SbS_TB.h

    08_ETRI050/simulation/sc_pong_SbS_TB.h


b-2. 네트리스트 시뮬레이터 빌드,

    $ make build

    g++  -DVPI_SIM \
            -I/usr/local/share/verilator/include \
            -I/usr/local/share/verilator/include/vltstd \
            -I/usr/local/include/iverilog \
            -I/opt/systemc/include -I.. \
            -L/opt/systemc/lib \
            -g -fPIC \
            ./vpi_stub.cpp ./sc_glcd128x64_TLM.cpp  \
            ./vpi_pong_SbS_tb.cpp ./sc_pong_SbS_TB.cpp \
            -o vpi_stub.vpi \
            -shared -latomic -lsystemc -lgsl -lSDL2

    iverilog -g2005-sv -Tmin -gspecify -o pong_SbS_TB \
            pong_SbS_TB.v  \
        ~/ETRI050_DesignKit/digital_ETRI/khu_etri05_stdcells.v  \
        ../synthesis/pong_SbS_mapped.v

GNU C++ 툴로 SystemC 테스트벤치와 VPI 모듈을 빌드하고 iVerilog 로 베릴로그 테스트벤치를 빌드했다.

[과제] 표준 셀의 기능과 타이밍 정보를 모델링 한 베릴로그는 khu_etri05_stdcells.v다. 타이밍 정보를 기술하기 위해 사용된 베릴로그 구문들에 대하여 토론해보라. 특히 UDP에 대하여 알아보라.

b-3. 시뮬레이터 실행

    $ make run

    vvp -M. -mvpi_stub pong_SbS_TB -v

    Icarus Verilog started
    VCD info: dumpfile pong_SbS_TB.vcd opened for output.

    Info: (I703) tracing timescale unit set: 100 ps
                                         (sc_pong_SbS_TB.vcd)
    #0 s SystemC started
    Frame[0]

[과제] 네트리스트 시뮬레이션의 실행 속도가 매우 느리다. 사건 기반의 시뮬레이터에서 실행 속도에 영향을 주는 요인에 대하여 토론하고 시뮬레이션 속도가 느린 이유를 설명해보라

b-4. 타이밍 시뮬레이션 파형 관찰

    $ make wave

    gtkwave pong_SbS_TB.vcd --save=pong_SbS_TB.gtkw &

    gtkwave sc_pong_SbS_TB.vcd --save=sc_pong_SbS_TB.gtkw &

시뮬레이션이 시작된 시점을 관찰해보자.

[과제] 베릴로그 RTL에서 비동기 리셋으로 묘사되었지만 플립플롭들의 출력에 '알수없음'으로 시작하는 이유를 설명해 보라.

[과제] 클럭의 상승엣지 이후 지연이 가장 긴 신호를 찾아보고 그 이유를 설명해 보라.

c. 표준셀 배치

레이아웃 디렉토리로 이동 후 표준셀 자동 배치 실행,

    $ make place

    Running vlog2Cel to generate input files for graywolf

    vlog2Cel  -l .../etri050_stdcells.lef -u 100 \
        -o ...../layout/pong_SbS.cel  \
        .../synthesis/pong_SbS.rtlnopwr.v

    ......

    Preparing pin placement hints from pong_SbS.cel2

    Running GrayWolf placement

    graywolf  pong_SbS

    ......

표준 셀의 외형을 기술한 LEF 파일을 참조하여 합성기의 출력 네트리스트 pong_SbS.rtlnopwr.v로부터 자동 배치 도구용 파일 pong_SbS.cel 을 만든다. 배치 단계에서 pong_SbS.cel2을 참조하여 입출력 핀을 뽑을 방향을 정할 수 있다. 자동배치 도구는 graywolf 다.

[과제] 배치가 완료되면 대략적인 배선 경로를 알 수 있다. 정적 타이밍 분석(STA, Static Timing Analysis)을 통해 가장 긴 경로를 파악할 수 있다.

    $ make sta

STA를 수행하여 가장 긴 경로을 가진 신호를 파악하라. STA의 설명은 아래 링크의 문서를 참조한다.

    1. AN 545: Design Guidelines and Timing Closure Techniques for HardCopy ASICs[pdf]
    2. Achieving Timing Clouser[Link]

c. 표준셀 배선

자동 배선을 실시한다.

    $ make route

    qflow route -T etri050 pong_SbS

    Technology set to etri050
    Regenerating files for existing project pong_SbS
    Running qrouter 1.4.88.T

    qrouter -noc  -s pong_SbS.cfg

    *** Running stage1 routing with defaults
    Nets remaining: 500
    Nets remaining: 400
        ......
    Nets remaining: 90
    Progress: Stage 1 total routes completed: 1196
    Failed net routes: 92
        ......

    *** Running stage3 routing with defaults, 2nd round
    Nets remaining: 500
    Nets remaining: 400
        ......
    Nets remaining: 3
    Nets remaining: 2
    Progress: Stage 3 total routes completed: 4620
    No failed routes!
    *** Writing DEF file pong_SbS_route.def
    Final: No failed routes!

    *** Writing RC file pong_SbS_route.rc
    DEF2Verilog -v .../synthesis/pong_SbS.rtlnopwr.v \
                    -o .../synthesis/pong_SbS_postroute.v \
                -l .../etri050_stdcells.lef pong_SbS_route.def

    Generating RTL verilog and SPICE netlist file in directory

    Running vlog2Verilog.

    vlog2Verilog -c -v vdd -g gnd -o pong_SbS.rtl.anno.v  \
                                        pong_SbS_postroute.v

    Running vlog2Spice.

    vlog2Spice -i -l .../etri050_stdcells.sp -o pong_SbS.anno.spc  \
                                        pong_SbS.rtl.anno.v

자동 배선 도구는 qrouter 다. 표준 셀이 배치된 DEF 파일 pong_SbS_unroute.def을 읽어 배선을 실시한다. 최적의 배선을 위해 몇번의 배선 시도를 한 후 pong_SbS.def에 저장한다. DEF/LEF는 자동 배치와 배선 도구 사이에 주고받기 위한 업계표준 형식이다. 배선까지 마치면 배선의 길이를 감안하여 선로상의 기생 RC 를 계산한다. RC 값은 반도체 제조 공정에서 제공되는 PDK를 근거로 LEF에 설정되었다. 배선 선로가 길어 지연이 과도할 경우 버퍼를 삽입한다. 만일 버퍼가 삽입되면 논리식은 변함 없지만 네트리스트가 변경 되므로 새로운 네트리스트를 추출해 주어야 한다.

[과제] 레이아웃 디렉토리에서 배선 전 pong_SbS_unroute.def와 배선 후 pong_SbS.def 를 비교해 보고 차이점에 대하여 알아보자.

[과제] 네트리스트 타이밍 시뮬레이션에서 가장 긴 지연을 보였던 네트가 v_sync 였다. 이 네트의 경로에 버퍼가 삽입 되었다. synthesis/pong_SbS_mapped.v와 synthesis/pong_SbS_postroute.v 를 비교하고 삽입된 버퍼를 확인 하라.

d. 표준 셀 병합

배치와 배선을 완료하여 얻은 DEF 파일 layout/pong_SbS.def은 표준셀과 배선의 좌표들로 채워져있다. 표준 셀의 내부 트랜지스터 모습은 디자인 킷의 라이브러리로 제공된다. DEF의 표준 셀 내부를 채워 넣음으로써 레이아웃을 완성 할 수 있다. 표준 셀을 병합하는 도구는 Magic이다.

    $ make migrate

    qflow migrate -T etri050 pong_SbS

    Technology set to etri050
    Regenerating files for existing project pong_SbS
    Running magic 8.3.538

    magic -dnull -noconsole  migrate_pong_SbS.tcl

    ......

    Reading LEF data from file ....../etri050_stdcells.lef.

    LEF read: Processed 3266 lines.

    Reading DEF data from file pong_SbS.def.

    ......

    Extracting OAI22X1 into OAI22X1.ext:
    Extracting MUX2X1 into MUX2X1.ext:
    Extracting AOI22X1 into AOI22X1.ext:
    Extracting pong_SbS into pong_SbS.ext:

    exttospice finished.

[과제] 표준 셀 병합까지 마치면 비로서 레이아웃 파일 layout/pong_SbS.mag 이 완성된다. 평면의 크기는 "내 칩 MPW"의 표준 크기 이내에 들어야 한다. 아래 명령으로 "탁구 게임기" 레이아웃의 크기를 판단해보라

    $ make size

[과제] 완성된 레이아웃이 합성기에서 생성된 네트리스트와 '기능적'으로 부합하는지 비교 해보자.

    $ make lvs

e. 레이아웃 검사







https://fun-teaching-goodkook.blogspot.com/2024/08/verilog-verilator-systemc-mpw-gds.html