2024년 1월 19일 금요일

ETRI 0.5um CMOS Std-Cell DK 예제: CPU 6502 [6]/베릴로그 합성

ETRI 0.5um CMOS Std-Cell DK 예제: CPU 6502 [6]

IV. 6502 CPU 베릴로그 합성

    IV-1. 유한 상태 기계(FSM)
    IV-2. CPU의 명령 디코더
    IV-3. Yosys의 FSM 합성기
    IV-4. 합성 후 네트 시뮬레이션

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

IV. 6502 CPU 베릴로그 합성

RTL(Register-Transfer Level) 합성기(Synthesizer)는 논리적 행위(logical behavior)를 비트-폭과 클럭 단위(bit-width & clock)로 상세하게 기술한 구문을 디지털 회로로 변환해 주는 도구다. 변환으로 생성될 회로의 부품들은 대상 공정에서 제공 할 수 있는 논리소자들의 목록을 참조한다. 반도체 제조공정에서 제공 할 수 있는 부품의 목록을 기술하는 양식은 시높시스사(Synopsys Inc.)에서 제안하고 업계 표준으로 쓰이는 '리버티(Liverty)' 다[link][Liberty Timing Format][Liberty UG & RM]. 합성기의 역활에 대한 논의는 앞의 예제 ALU8 편[바로가기]에서 다뤘으므로 참조한다[합성기/바로가기].

IV-1. 유한 상태 기계(FSM)

본 예제의 6502 CPU는 마이크로 컨트롤러다. ALU(Arithmetic-Logical Unit) 회로의 특징은 디지털 데이터의 일방적 흐름을 클럭에 맞춰 쫒는다. 이런 특징의 디지털 회로를 데이터 패쓰(Data-Path)라고 한다. 컨트롤러는 조건에 따라 상태의 전이를 달리 할 수 있다. 프로그래밍 언어에서 조건문에 의한 분기를 생각해보자. 단순히 데이터 흐름의 분기와 동작의 분기가 있다. 예를 들어 아래와 같은 if 조건문은 데이터 흐름의 분기를 표현한다.

    if (s==0)               +--+
        d = a;         
a --->0  \
    else                    |   +---> d
        d = b;         b --->1  /
                            +-+-
                       s -----+

논리회로로 치면 스위치 또는 멀티플렉서(multiplexer)다. 데이터 흐름에 반복문 for()가 더해지면 회로는 다소 복잡해 진다.

    for (s=0; s<5; s++)
        if (s%2)
            d += a * c[i];
        else
            d += b * c[i];

데이터 패스 디지털 회로로 구현하면 아래와 같은 구조가 된다.

     a   c[0]   a   c[2]   a   c[4]   b   c[1]   b   c[3]
     |   |      |   |      |   |      |   |      |   |
   +-V---V-+  +-V---V-+  +-V---V-+  +-V---V-+  +-V---V-+
   |   *   |  |   *   |  |   *   |  |   *   |  |   *   |<- clk
   +---+---+  +---+---+  +---+---+  +---+---+  +---+---+
       |          |          |          |          |
       +--+   +---+          +--+   +---+     +----+
          |   |                 |   |         |
        +-V---V-+             +-V---V-+       |
        |   +   |             |   +   |<- clk |
        +---+---+             +---+---+       |
            |                     |           |
            +--------+   +--------+           |
                     |   |                    |
                   +-V---V-+                  |
                   |   +   |<- clk            |
                   +---+---+                  |
                       |                      |
                       +-----+   +------------+
                             |   |
                           +-V---V-+
                           |   +   | <- clk
                           +---+---+
                               |
                               d

위의 구조는 지나치에 많은 하드웨어를 사용한다. 다섯개의 곱셈기와 네개의 덧셈기를 사용하고 있다. 공통의 연산장치를 두고 반복적으로 사용되는 곱셈기와 덧셈기의 수를 줄여보자.

     a   b              c[0] c[1] c[2] c[3] c[4]
     |   |                |    |    |    |    |
   +-V---V-+            +-V----V----V----V----V-+
   \       /<-- S1      \                       /<-- S2
    +--+--+              +----------+----------+
       |                            |
       +------+     +---------------+
              |     |
            +-V-----V-+
            |    *    |<-clk
            +----+----+  +----------+        +--------------+
                 |       |          |        |              |
               +-V-------V-+        |   S1<---  Controller  <--Start
               |     +     |<-clk  |         |              -->Done
               +-----+-----+        |   S2<---    (FSM)     |
                     |              |        |              |<-clk
                     +--------------+        +--------------+
                     |
                     d

클럭의 동기에 맞춰 순차적으로 S1 과 S2의 제어 신호를 만들어 내는 제어기(controller)를 두면 한개의 곱셈기와 한개의 덧셈기로 가능하다. 제어기는 무한 반복되면 않되므로 시작할 시점을 알려 줘야 하며 정해진 반복이 끝나면 끝을 표시해야 한다. 제어기는 for() 반복문의 제어부분을 디지털 회로로 구현하였다. 규정된 반복을 하면서 조건에 따라 제어신호를 내는 회로를 유한 상태 기계(FSM, Finite-State Machine)라 한다[바로가기]추상화 수준이 높아 질수록 데이터 패스 위주의 표현에 가까워 지며 제어는 감춰진다. 고수준 합성기(HLS, High-Level Synthesis)는 제어부 FSM을 자동 생성해 낸다. 이때 시작과 종료에 소요될 클럭의 갯수 또는 지연을 옵션으로 지정해 주면 이를 근거로 FSM 회로를 만들어낸다[바로가기].

IV-2. CPU의 명령 디코더

디지털 회로를 구조적으로 크게 나누면 데이터 패스와 유한 상태 기계(FSM)로 나눌 수 있다. 마이크로 컨트롤러는 FSM이 가장 현명하게 쓰이는 곳이다. CPU의 데이터 패스는 다기능 ALU와 레지스터(register, 임시저장소)를 두고 여러 명령들이 공유하도록 설계 되었다[주]. 보편적인 폰-노이만식 컴퓨터 구조에서 기계어 명령이 실행 되는 절차는 메모리에서 기계어를 인출(Fetch)하고 이를 분석(Decode)한 후 이에 맞는 제어신호를 내보낸다(Execute). 한 명령이 끝나면 다음 명령어를 메모리에서 인출한다. 이 반복 주기를 머신 싸이클(또는 인스트럭션 싸이클, instruction cycle[바로가기])이라 한다. 기계어에 따라 명령어가 수행할 절차가 동일 하지 않을 수 있다(CISC[바로가기] 명령어를 가진 CPU). CPU의 머신 싸이클을 통제하는 디지털 회로가 FSM이다.

[주] Microprocessor Design, WikiBooks [바로가기]

IV-3. Yosys의 FSM 합성기

6502 CPU는 CISC 명령 세트를 가진 컴퓨팅 장치로서 거대한(?) FSM을 가지고 있다. RTL 코드 cpu.v 에 명령 디코더가 기술 되어 있다. 명령어의 종류는 50여가지에 불과 하지만 오퍼랜드의 주소지정 모드(addressing mode; immediate, zero-page, indexed, direct, in-direct)를 다양하게 가지고 있다.

FSM 디지털 회로는 데이터 패쓰와 다른 구조를 취한다. 하드웨어 언어로 기술된 구문으로부터 FSM을 추론해 내고 최적화 하는 방법도 다르다. 조합회로와 순차회로가 복합적으로 구성되므로 까다롭다. 따라서 합성기로 하여금 FSM을 제대로 파악시키기 위해 적절한 기술 양식(coding style)이 권장되고 있다[주].

[주] State Machine Coding Styles for Synthesis [바로가기]

6502 CPU의 베릴로그 RTL을 합성한다. 오픈 소스 도구와 디자인 킷의 환경 설정이 제대로 되어있다면 Yosys 베릴로그 RTL 합성기를 문제없이 실행시킬 수 있다. 설계 관리 도구 QFlow를 통해 etri050 공정을 사용하여 6502 CPU를 합성하는 명령은 아래와 같다. 최상위 모듈의 이름이 cpu 다.

    $ QFlow synthesize -T etri050 cpu

[주] 오픈소스 도구와 ETRI 0.5um CMOS 디자인 킷의 설치 참조[바로가기]
[주] QFlow 1.4 Reference manual[Link]

FSM의 구성이 조합회로와 순차회로가 밀접하게 유기적으로 결합되어 있어서 별도의 최적화알고리즘이 동원된다[바로가기][바로가기]. Yosys 합성기는 별도의 FSM 합성기를 갖추고 있다. 로그 파일을 살펴보면 베릴로그 구문에서 유한 상태 기계를 감지하고 이를 최적화 하고 있다. FSM 합성기를 따로 가지고 있다는 점에서 Yosys 합성기의 전문적인 면모를 보여준다고 할 것이다.

    4.7. Executing FSM pass (extract and optimize FSM).
    4.7.1. Executing FSM_DETECT pass (finding FSMs in design).
    Not marking cpu.dst_reg as FSM state register:
        Users of register don't seem to benefit from recoding.
    Not marking cpu.src_reg as FSM state register:
        Users of register don't seem to benefit from recoding.
    Found FSM state register cpu.state.

6502 CPU의 제어부를 기술한 베릴로그 cpu.v 에서 FSM을 검출하고 상태 레지스터를 판단해낸다. FSM의 입출력과 천이도(transition diagram)를 그린다.

    4.7.2. Executing FSM_EXTRACT pass (extracting FSM from design).
    Extracting FSM `\state' from module `\cpu'.
      found $adff cell for state register: $procdff$777
      root of input selection tree: $0\state[5:0]
      found reset state: 6'001000 (from async reset)
      found ctrl input: \RDY
        ......
      found state code: 6'010111
      found ctrl input: $xor$.../CPU_6502/source/cpu.v:987$144_Y
      found state code: 6'000111
      found ctrl input: \cond_true
        ......
    ctrl inputs: {  $auto$opt_reduce.cc:134:opt_pmux$801 .....
     ..... $auto$opt_reduce.cc:134:\cond_true \write_back \RDY }
    ctrl outputs: { $procmux$468_CMP ......
     $eq$....../CPU_6502/source/cpu.v:1011$147_Y $0\state[5:0]
     $ne$....../CPU_6502/source/cpu.v:424$18_Y }
        ......
      transition:   6'000000 27'---...---0 ->
                        6'000000  61'0001000......0011111
      transition:   6'000000 27'---...---1 ->
                        6'000001 61'00010001......0011111
      transition:   6'100000 27'---...---0 ->
                        6'100000 61'00000000......0001111
        .....
      transition:   6'101111 27'---...--11 ->
                        6'100011 61'10000000......0011111
      transition:   6'011111 27'---...---0 ->
                        6'011111 61'00000000......0010111
      transition:   6'011111 27'----------------------1 ->
                        6'100000 61'00000000......0010111

FSM 최적화 수행,

    4.7.5. Executing FSM_OPT pass (simple optimizations of FSMs).
    Optimizing FSM `$fsm$\state$824' from module `\cpu'.
      Removing unused output signal $0\state[5:0] [0].
        ......
      Removing unused output signal $0\state[5:0] [5].
      Removing unused output signal $procmux$425_CMP.
      Removing unused output signal $procmux$427_CMP.

최적 FSM의 상태 재배정,

    4.7.6. Executing FSM_RECODE pass (re-assigning FSM state).
    Recoding FSM `$fsm$\state$824' from module `\cpu' using `auto'     encoding:
      mapping auto encoding to `binary` for this FSM.
      existing encoding is already a packed binary encoding.

최적화 한 FSM의 정보를 보여준다. 비록 화려한 그림의 모습은 아니지만 FSM 합성기가 작동하고 있는 모습을 볼 수 있다.


    4.7.7. Executing FSM_INFO pass

    FSM `$fsm$\state$824' from module `cpu':
    -------------------------------------

      Information on FSM $fsm$\state$824 (\state):

      Number of input signals:   26
      Number of output signals:  53
      Number of state bits:       6

      Transition Table (state_in, ctrl_in, state_out, ctrl_out):
      0: 0 26'---...---0   ->  0  53'0001000000...000011111
      1: 0 26'---...---1   ->  25 53'0001000000...000011111
      2: 1 26'---...---0   ->  1  53'0000000000...000001111
        ......
    122:48 26'---...---0   ->  48 53'1000000000...000011111
    123:49 26'---...---1   ->   1 53'0000000000...000010111
    124:49 26'---...---0   ->  49 53'0000000000...000010111

FSM의 입출력 신호 비트 수, 상태 레지스터의 비트 폭 그리고 천이도(transition)를 보여준다. 최적화 전의 천이도에서 입력 비트수는 27비트에서 26로 줄었고 출력은 61비트에서 53비트로 줄었다. 총 천이 아크의 갯수는 124개다.

    4.7.8. Executing FSM_MAP pass (mapping FSMs to basic logic).
    Mapping FSM `$fsm$\state$824' from module `\cpu'.

FSM을 논리식으로 매핑한다.

IV-4. 합성 후 네트 시뮬레이션

합성(synthesis)은 행위를 기술한 하드웨어 언어 구문을 논리회로로 변환한다. 반도체 설계 과정에서 가장 극적인 추상화 낮춤에 해당한다. 추상화 수준 낮추기에 자동화 도구가 사용된다. 비록 인간의 간여 없이 이뤄 진다지만 적절하지 않은 도구 사용법에 더하여 자동화 도구가 가지고 있을 오류를 염려하지 않을 수 없다. 따라서 추상화 수준 낮춤이 있을 경우 반드시 교차 검증이 이뤄져야 한다.

                     +--------------------+     +-------------------+
                     | Source Codes       |     | 6502 C-Compiler & |
                     |       in          /----->|      Assembler    |
                     |   C & Assembly   |       +--------+----------+
                      \                 |                |
                       +----------------+        +-------V----------+
                                                 |  Machine Codes   |
                                                 |   over WozMon    |
+----------------+                               +-------+----------+
Verilog RTL    |                                       |
| ALU.v          |                               +-------V----------+
| cpu.v       ---|----------------+           +--| System Level TB  |
|                |                |           |  |    Memory model  |
+-----+----------+                |           |  +------------------+
      |              +------------V-----------V--------------+
      |              | Functional Simulation                 |
     (?)<<<<<<<<<<<<<<   VERILATOR: Verilog to C++ Converter |
      |              |              SystemC/C++ Testbench    |
      |              +------------------------+--------------+
+-----V-------------------------+             |
|Yosys: RTL Synthesis           |             |
|    -> SPICE Netlist for LVS   |             |
|    -> Verilog Netlist         |         [Testbench Re-Use]
|         for P&R and Post-Sim -|----+        |
+---------------+---------------+    |        |
                |                    |        |
      +---------+     +--------------V--------V------------------+
      |               |Post-Simulation: QuestaSim Co-Simulation  |
      |               |      HDL Netlist & SystemC Testbench     |
     (?)<<<<<<<<<<<<<<<  Syn. Netlist   : ./synthesis/cpu.v      |
      |               |  Std-Cell's Func: khu_etri05_stdcells.v  |
      |               +------------------------------------------+
      V
  Placement

Yosys 합성으로 얻은 논리소자 네트리스트는 두가지 형식으로 생성 된다. 자동 배치와 배선 도구에서 사용될 형식과 검증을 위한 베릴로그다. 합성으로 얻은 베릴로그 네트리스트를 기능검증에서 사용했던 시스템 수준 테스트 벤치에 동일하게 적용하여 합성 후 검증을 실시한다.

베릴로그 언어 변환기 베릴레이터가 표준 셀 행위기술에 사용된 베릴로그의 사용자 정의 프리미티브 테이블(user defined primitive table)을 지원하지 않는다. HDL 시뮬레이터 QuestaSim으로 병행 시뮬레이션(Co-Simulation)을 실시한다. QuestaSim 용 컴파일 스크립트는 다음과 같다.

    #*************************************************************
    # MTI simulation scrips for SystemC Co-Simulation with Verilog
    # Filename: mti_sim/compile_net.do
    #*************************************************************
    onbreak {resume}
    # create library
    if [file exists work] {
        vdel -all
    }
    vlib work

    # Verilog compile
    vlog -reportprogress 300 -work work \
             ../../../digital_ETRI/etri05_stdcells.v
    vlog -reportprogress 300 -work work ../synthesis/cpu.v

    # compile and link SC source files
    sccom -reportprogress -g -work work \
            ../simulation/sc_mem.cpp \
                -DCR_LF_LF -I ./mti_sim
    sccom -reportprogress -g -work work \
            ../simulation/sc_main.cpp \
                -I ./mti_sim
    sccom -link
    quit

디자인 킷의 표준 셀과 네트리스트 베릴로그를 컴파일 한다. SystemC 테스트 벤치는 기능 검증때 사용했던 것과 동일하다. Makefile 에 네트리스트 병행 시뮬레이션용 타깃이 포함되어 있다.

    # Filename: Makefile
    .......
    mti_net_build : a1_keyboard a1_display
        vsim -c -do ./mti_sim/compile_net.do

    mti_net_run : a1_keyboard a1_display
        xterm -T "Apple-1 Keyboard" ./a1_keyboard &
        xterm -T "Apple-1 Display" ./a1_display &
        sleep 1
        vsim -c -do ./mti_sim/simulate_net.do

Makefile의 타깃을 mti_net_build로 지정하여 네트리스트 베릴로그 컴파일과 SystemC 테스트벤치를 묶어 Apple-1를 구성한다.

    $ make mti_net_build

이어 QuestaSim의 시뮬레이션 환경에서 병행 시뮬레이션을 실시한다.

    $ make mti_net_run

애플 소프트 베이직 기계어 코드를 기능검증 때와 동일한 방법으로 Apple-1의 메모리에 적재하고 실행시켜 동일한 결과를 얻어 합성에 대한 검증을 실시한다. HDL 시뮬레이션은 사건 기반으로 수행된다. 합성전 행위 모델에서 사건 발생과 처리량에 비하면 합성 후의 네트리스트 모델의 사건 발생은 엄청나게 늘어난다. 모든 객체들이 비트 단위로 세분화 되었을 뿐만 아니라 게이트 단위 소자마다 사건에 감응되기 때문에 네트 시뮬레이션은 실행이 매우 느리다. 대규모 설계의 경우 네트리스트 시뮬레이션은 시간적으로 불가능에 가깝다. 하드웨어 가속기 또는 FPGA 고속 프로토 타이핑(FPGA Proto-typing)[바로가기]으로 대응한다[주].

[주] Fast Prototyping of a Deep Neural Network on an FPGA, IEEE Xplore[Link]

대규모 FPGA를 이용한 고속 컴퓨팅 장치들이 인공지능 분야에 널리 활용되고 있다. 단순 반복적인 계산이 집중된 인공지능, 기계학습 알고리즘의 특성은 고위합성 기법(High-Level Synthesis)[바로가기][바로가기]을 적용하기 좋다. 빠른 수행을 위해 파이프라인 구조 위주의 알고리즘(특히 신경망)으로 구현하고자 하는 경우 제어기의 부담(설계 난이도는 물론 실행에 소요되는 클럭수)이 현저히 줄어든다. 언재든 컴퓨팅 구조를 재구성 할 수 있는 FPGA를 사용하므로서 데이터 패스를 채택 하였을 때 지는 하드웨어 크기 부담도 적다[주].

[주] FINN: A Framework for Fast, Scalable Binarized Neural Network Inference [Link]
[주] Tutorial (ISFPGA'2021): Neural Network Accelerator Co-Design with FINN [Link]
[주] Machine Learning on FPGA [Youtube]

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

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


댓글 없음:

댓글 쓰기