2024년 1월 17일 수요일

ETRI 0.5um CMOS Std-Cell DK 예제: CPU 6502 [2]/시스템 수준 테스트벤치 (1/3)

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

II. 시스템 수준 테스트 벤치 [1부]

    II-1. Apple-1 컴퓨터 시스템 모델
    II-2. 6502 CPU의 베릴로그 RTL

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


II. 시스템 수준 테스트 벤치 [1부]

넥슨 박물관의 Apple-1 시연 동영상 1분 7초께[바로가기] 해설자는 이런말은 한다.

    "지금은 당연하지만 (1976년) 당시 컴퓨터로는 (대화형은) 파격적인 기능이었죠."

키보드 입력에 대해 곧바로 화면으로 반응하는 컴퓨터가 등장한 것을 두고 '파격'이라는 평가에 기꺼이 동의한다. 전문 운영자 없이도 누구나 즉각 대화 할수 있게 되자 컴퓨터는 전산실의 설비에서 생활가전이 되었다. 언재든 무슨 일이든 시킬 수 있다는 컴퓨터는 CPU와 주변장치라는 전자부품을 가지고 하드웨어를 꾸몄다. 그리고 외부의 사건에 반응하여 소프트웨어로 구현된 정해진 작업을 수행한다. 하드웨어와 소프트웨어가 결합되어 컴퓨터라는 시스템이 되었다. 범용성을 가진 컴퓨터 시스템은 주어질 사건에 적절히 반응해야 한다. 사건을 받아들이고 그에 대응할 준비가 되어 있어야 한다. 하지만 시스템을 만들 때 어떤 사건이 언재 입력되리라는 예정이 없었다. Apple-1이라는 컴퓨터가 "파격"적이라고 하는 이유가 여기에 있다. 바로 '언재든' 명령만 내리면 반응하는 '대화형' 이라는 점이다. 물론 능력이 않되면 못하겠다고 서슴없이 들이대는 당돌함도 있다. 사용자의 실수나 무지를 즉시 지적하는 싸가지는 덤이다. 위의 동영상에서 화면에 누군가의 얼굴이 문자로 찍히자 호들갑 스러운 환호가 들린다. 오래된 컴퓨터가 다시 작동하는데 감동하는 것일게다. 수억을 들여 경매로 구입 했다하니 그럴만도 하다. 어쨌든 그 환호는 컴퓨터의 CPU보다 워즈니액의 모니터 프로그램에 보내는 찬사로 들린다.

CPU를 설계 하였지만 이 하드웨어가 어떤 구성의 컴퓨터 시스템이 될지 정의되지 않았다. 비록 그렇더라도 CPU 하드웨어 검증은 '시스템' 수준으로 이뤄져야 한다. 실제로 이 하드웨어가 소프트웨어와 어울려 컴퓨터 시스템으로 구성되었을 때를 상정하여 검증이 이뤄져야 한다. 즉 '대화형' 테스트 벤치를 꾸며야 한다는 뜻이다. CPU라는 반도체가 공장에서 출시될 때까지 기다렸다가는 제품 출시의 시기를 놓칠 수 있고 서둘러 제조하기에는 반도체 공정비용이 너무 높기 때문에 반도체 설계물은 철저히 검증 되어야 한다.

80년대에 들어 하드웨어 기술 언어(HDL, Hardware Description Language[바로가기])가 등장하자 모두가 열광했다. 하지만 하드웨어 기술 언어는 시스템 수준 검증에 매우 미흡하다. 설계 후 반드시 거처야 하는 검증용 테스트 벤치를 작성하기에 추상화 수준이 턱없이 미치지 못한다.  하드웨어 언어로 시스템 수준 테스트 벤치를 작성하기 위해 엄청난 공을 들여야 했다[주].

주] 문자열 출력 조차 눈물 겨웠다 C/UNIX Functions for VHDL Testbenches [바로가기].

C/C++ 언어가 추상화 수준을 높이며 발전하자 운영체제를 비롯하여 각종 시스템 프로그래밍에 사용되었고 컴퓨터 시스템은 비약적인 발전을 이뤘다. 하드웨어 언어도 진화해 왔으나 언어 자체의 발전보다 설계기법과 합성기(RTL Synthesizer) 같은 전자설계 자동화(Electronics Automation Tools) 도구에 치중 되었다. 반도체 설계 규모가 증가하자 등장한 하드웨어 설계 도구로서 전용 언어는 단시일 내에 디지털 반도체 설계의 주류가 되었다. 하지만 검증은 반도체 설계에서 항상 걸림돌이었다. 설계비용에서 검증이 차지하는 비율이 점점 작아지고 있긴 하지만 절반을 차지한다.

[출처] OpenROAD: Toward a Self-Driving,Open-Source Digital Layout Implementation Tool Chain[Link]

하드웨어 설계 언어가 검증의 검림돌이 된 이유는 언어가 가진 추상성 수준의 한계 때문이다. 하드웨어 기술 언어의 탄생 목적이 디지털 회로의 설계인데 객체의 비트폭과 클럭 마다 행위를 명확히 해야하는 레지스터 전송 수준(RTL, Register-Transfer Level)으로는 설계의 검증에 사용하기 곤란하다. 게다가 추상성을 높이는 방향으로 발전하기엔 자동화 도구들이 따라오기 어렵다.

소프트웨어를 위해 탄생한 프로그래밍 언어는 하드웨어의 특성을 표현할 수 없었다. 다행히 소프트웨어 언어의 추상성 폭이 매우 넓어지면서 하드웨어 모델링도 가능해졌다. 이종 언어간 혼합 실행 기법이 널리 활용되는 지금 굳이 어렵게 하드웨어 언어로 테스트 벤치 작성하는 일은 줄어들고 있다. 하드웨어 시뮬레이터는 결국 프로그래밍언어 이용해 만들어진 소프트웨어라는 점에 주목하자. SystemC는 하드웨어를 표현할 수 있도록 C++ 언어 크래스를 구축하고 병렬성을 모의실행 시킬수 있는 라이브러리를 묶은 시스템 모델링 도구다[바로가기]. SystemC는 이미 IEEE의 표준으로 등재되어 있고 오픈 소스다[바로가기]. SystemC는 새로운 언어가 아니기에 이미 널리 사용되는 모든 C++ 컴파일러(GNU C/C++, Microsoft Visual C/C++)를 써서 설계 검증 환경의 구축이 가능하다. 이에 덧붙여 현대 컴퓨팅 운영체제에서 제공하는 쓰레딩(POSIX 같은)과 프로세스간 통신(IPC, named pipe 또는 FIFO 같은)을 활용하여 시스템 모델을 작성 할 수 있다[주].

주] 리눅스 커널 API 프로그래밍을 다룬다. The Linux Programming Interface: A Linux and UNIX System Programming Handbook[바로가기][E-Book pdf]

하드웨어 언어는 설계에 집중하고 시스템 수준 검증도구로 C/C++를 활용하는 추세로 설계 방법론이 발전하는 덕분에 설계 비용에서 검증이 차지하는 비중이 줄어들고 있다[4]. 미래의 반도체 설계 언어로 C/C++가 도입되기 시작 했고 이를 RTL로 변환하는 자동화 도구 HLS (Hihg-Level Synthesis[Link])들이 상용화 되었다[5][6]. 이제 하드웨어 설계자 들도 RTL의 HDL에서 벗어날 때가 되었다. 오늘날 어셈블리 언어로 소프트웨어를 개발하는 사례를 찾아볼 수 없듯이 하드웨어 설계도 곧 그런 시대가 될 것이다.

주4] C/C++ 모델을 HDL과 연결 하려는 시도, Integrating SystemC Models with Verilog and SystemVerilog Models Using the SystemVerilog Direct Programming Interface [바로가기]

주5] Towards Automatic High-Level Code Deployment on Reconfigurable Platforms: A Survey of High-Level Synthesis Tools and Toolchains [link]

주6] HLS 블로그, "고위합성 튜토리얼"[바로가기]


[출처] High-Level Synthesis Blue Book [link]

본 예제에서는 C/C++ 언어로 6502 CPU를 채택한 컴퓨터 시스템을 테스트 벤치로 구성하여 베릴로그 RTL을 검증한다.

II-1. Apple-1 컴퓨터 시스템 모델

6502 CPU의 검증을 위해 메모리 그리고 입출력 장치를 갖춘 Apple-1 컴퓨터 시스템을 모델링 한다. 이 시스템을 구성하는 각 프로세스(CPU와 입력장치 그리고 표시장치)의 행위는 SystemC/C++로 기술하고 프로세스 간 통신은 운영체제(리눅스 또는 윈도우즈)의 IPC(명명된 파이프, named pipe 또는 FIFO)를 활용한다. 1976년 발매당시 Apple-1에 적재되었던 워즈니액의 모니터 롬 코드(Wozniac Monitor ROM code[바로가기])를 수정 없이 실행 시킬 수 있다.

8비트 CPU 6502의 예제의 묶음 파일 내려받을 수 있다[download]. 디자인 킷의 하위 폴더에 예제의 압축을 풀면 다시 여러 하위 폴더를 가진 구조를 취하는데 이 구조를 유지하면 관리에 유리하다.

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

위의 폴더 구조에서 베릴로그 파일들은 source 에, 테스트벤치 C++와 헤더 파일은 simulation에, 그리고 최종적으로 제작도면 GDS 는 layout 폴더에 있다. CPU를 설계하고 있으므로 이를 작동 시키기 위한 소프트웨어가 필요하다. 소프트웨어 개발 도구로 6502 어셈블러와 C 컴파일러를 사용한다. simulation 폴더 아래에 Apple-1 폴더는 6502 어셈블러와 C 컴파일러[바로가기], 워즈니액 모니터 wozmon.bin 를 비롯한 예제가 있다. 6502 CPU용 응용 프로그램명은 program.bin 또는 program.hex 로 고정되었다.

6502 CPU의 베릴로그 RTL을 검증하기 위해 구축한 Apple-1의 컴퓨터 시스템의 구성은 아래와 같다. 6502 CPU의 메모리와 주변장치 그리고 입출력 장치 프로세스들은 SystemC와 C++로 작성되었다. 컴퓨터의 모든 동작은 어떤 언어(베릴로그든 파이썬이든)를 사용하든 결국 C/C++를 통한다.

|<--------System Level Testbench-------->|<---IPC--->|<---I/O Dev-->|
                                          (named PIPE)  Interactive
+----------+  +-------------------------+
| 6502 CPU |  | sc_mem.h (
SystemC)      |            +--------------+
| (Verilog)|  |    +----------------+   |            a1_diaplay   |
|          |  |   0000   (RAM)      |   |            +--------------+
|          |  |    |...-------------+   |            |\             |
|          |  |    |     (PIA I/O)  |   |            |0:A9 00 AA .. |
|         <<DI<<  D011    weite(...)~~~~~~[FIFO]~~~~>|_             |
|          |  |    |                |   display.pipe |              |
|         >>DO>>  D012 KBD_Buf[]    |   |            +--------------+
|          |  |    |      |         |   |            +-------------+
|         >>AB>>   |    +-PThread---.-+ |            | a1_keyboard |
|          |  |    |    | thread_kbd()| |            +-------------+
|         >>WE>>   |    |   read(...)<~~~~[FIFO]~~~~~|:_           |
|          |  |    |    |             |keyboard.fifo |             |
|       <<clk |    |    +-----------.-+ |            +-------------+
+----------+  |    |                |   |
+-----------+ |    |                |   | +----+      Interactive
|        >clk>>   FF00--------------+   | |    |    Dynamic Stimulus
|           | |    |  Woz. Monitor  |   | |    |
|           | |    |    ...(ROM)... |   | |    |
|           | |   FFFE Reset Vector |   | |    |
|           | |    +----------------+   | |    |
|           | +-------------------------+ |    |
|           +-----------------------------+    |
| sc_CPU_6502_Top.h (SystemC)                  |
+----------------------------------------------+

예제를 내려받아 압축을 풀어보면 Apple-1 컴퓨터 시스템 모델의 소스 코드가 매우 단촐 하다는 것에 놀랄 것이다. 이렇게 되기까지 상당한 시간과 수고가 들긴 했다. 늘 그렇듯이 알고나면 별거 아니다.

II-2. 6502 CPU의 베릴로그 RTL

6502 CPU가 역사적인 의미를 가지고 있는 만큼 RTL 베릴로그가 다수 공개되어 있다. 본 예제는 그중 Arlet의 Verilog-6502를 깃허브를 통해 입수하여 활용한다[바로가기]. 이 모델은 2개의 베릴로그 파일로 구성되었다.

1. cpu.v: 6502 CPU의 내부 레지스터들과 명령 디코더 및 제어 기능을 기술한다.
2. ALU.v: CPU 내부의 산술논리연산 부분을 기술한다.

+---------------------------------------------------------+
cpu.v                                                   |
|      +=============+=========================+==========> DI[7:0]
|      |             |                         |          |
|   +--V--+       +--V--+                      |          |
|    \     \     /     /                +------V------+   |
|     \     +---+     /  +--------+     |             |   |
|      \     ALU.v   /   |  ACC   |     | Instruction |   |
|       \           /    +--------+     |  Decoder    |   |
|        +----+----+     |   X    |     |             |   |
|             | +--------+--------+     +....(FSM)....+   |
|             | |  Flag  |   Y    |     |             |<--- IRQ
|             | +--------+--------+     |  Control    |<--- NMI
|             | |   PCH  |  PCL   |     |   Unit      |<--- RDY
|             | +---+----+---+----+     +------+------+   |
|             |     |        |                 |          |
|             +=====:========:=================*==========> DO[7:0]
|                   +========+=================:==========> AB[15:0]
|                                              +----------> WE
|   6502 CPU                                             |
|                                                       <----- RESET
|                                                       <----- CLK
+---------------------------------------------------------+   

6502 CPU를 RTL로 기술한 베릴로그 파일들은 합성을 거쳐 반도체 칩 제작을 위한 레이아웃 생성으로 이어진다. 하드웨어 설계자라면 RTL 구문이 어렵지 않을 것이기 때문에 6502 CPU의 베릴로그 소스를 자세히 다루지 않겠다. 레지스터 전송 수준(RTL, Register-Transfer Level)의 베릴로그는 따로 다루기로 한다[주].

주] 베릴로그 학습, Verilog Tutorial 으로 검색하면 하루만에 배울 수 있다는 페이지들이 많이 검색된다. 컴퓨팅 언어를 이해하고 있다면 사실 그렇다고 단언 한다. 다만 검색되는 페이지들늬 수준이 문제다. 동영상 강좌도 많다. RTL 위주로 설명된 강좌글이나 동영상을 권한다. 기왕이면 익히 들어본 회사들의 컨텐츠를 고르자. Verilog는 Verilog HDL Basic, Intel , SystemC는 Learn SystemC, Forte DS 를 추천한다. 하루에 끝낸다면서 정말 하루를 채우는 동영상 [Verilog HDL 입문 8시간 완성]

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


댓글 없음:

댓글 쓰기