"내 칩" 에뮬레이션 검증 키트: 조립과 시험(에뮬레이터 편)
"내 책상 위에서 내 칩 설계(MyChip-on-MyDesk)"
- "내 칩" 에뮬레이션 검증 키트: 자재 목록 [링크]
- "내 칩" 에뮬레이션 검증 키트: 조립과 시험 (측정기 편) [링크]
- "내 칩" 에뮬레이션 검증 키트: 조립과 시험 (칩 테스터 편) [링크]
CC-BY-NC
by GoodKook, goodkook@gmail.com
-----------------------------------------------------------------------------
목차:
1. 에뮬레이션 검증
2. PSCE-TRANS 회로도와 부품
3. PSCE-TRANS 보드 조립
3-1. 2열 40핀 직각 헤더 핀, 2열 5핀 직각 헤더 소켓 (3개)
3-2. 2열 24핀 헤더 소켓(2개)
3-3. FPGA 모듈 결합
4. PSCE-MI/TRANS 보드 점검
4-1. 보드 결합 및 전원 인가시 점검
4-2. 피코 모듈의 외장 디스크 인식
4-3. JTAG 다운로드 케이블 인식
4-4. FPGA 모듈 인식
5. PSCE-MI/TRANS 동작 시험
5-1. WSL 리눅스에서 윈도우즈 USB 장치 사용
5-2. 예제 "FIR_PE" 에뮬레이션 실행
-------------------------------------------------------------------------
1. 에뮬레이션 검증
반도체 설계의 검증으로 널리 사용되는 방법은 시뮬레이션이다. 앞으로 제작될 칩을 재구성 가능한 하드웨어(FPGA)로 구현하여 소프트웨어 테스트벤치에 연동시키는 에뮬레이션 기법도 널리 활용된다. 칩 에뮬레이션은 시뮬레이션 보다 빠른 동작속도를 거두기 위한 목적 이었으나 통신 채널의 병목으로 실제로 이를 달성하기는 어렵다. 차라리 인 써킷 에뮬레이션(ICE, In-Circuit Emulation)에 준하는 패스트 프로토 타이핑이 효과적이다. 그럼에도 에뮬레이션 방법이 활용되는 이유를 생각해 보자.
행위 수준에서 기술된 하드웨어 모형이 칩으로 제작되려면 설계 자동화 도구에 의한 합성의 과정을 거쳐야 한다. 높은 수준의 기능(행위) 모델을 디지털 회로의 네트리스트로 합성하면서 급격한 추상화 수준의 변화가 발생한다. 기능 시뮬레이션에서 검증 되었더라도 합성으로 얻은 네트리스트 검증은 필수다. 에뮬레이션은 기능 시뮬레이션에 사용되었던 시스템 수준 테스트 벤치를 합성으로 얻은 네트리스트의 검증에 그대로 적용하기(테스트벤치 재사용) 위한 방법 중 하나다. 계산상 많은 부담을 주는 네트리스트 시뮬레이션에 비해 효과적일 뿐만 아니라 실제 하드웨어를 구동하므로서 높은 검증 신뢰도를 확보할 수 있다[*]. 뿐만 아니라 에뮬레이션으로 구축된 검증 환경은 향후 칩이 출고되었을 때 테스트를 수행 할 수 있는 장치로 신속하게 전환될 수 있다.
[*] 시뮬레이터, 합성기, 컴파일러 등 설계 자동화 도구들은 매우 정교한 "소프트웨어"다. 수많은 테스트(regression test)를 거쳐 출시되었더라도 소프트웨어 "버그"로부터 자유롭지 못하다. 게다가 우리는 스스로 만들어 쓰는 '오픈-소스' 도구들을 사용하려고 한다. 따라서 "교차 검증"은 선택이 아닌 필수다.

- MI: Modeling Interface
- TRANS: Transactor
임의 입출력을 가진 "내 칩"의 검증용 하드웨어(에뮬레이터)를 구성하는 방법에 있어서 도구의 표준화가 필요하다(Custom I/O vs. Std. Emulation). 에뮬레이터는 '설계도구'로서 DUT 마다 상이한 입출력에 대응해야 하며 설계 과정에서 지속적으로 변경되는 입출력과 디버깅 신호의 추가 삭제가 용이해야 한다. PSCE-MI/TRANS는 칩 에뮬레이션을 위한 유연한(표준화된) 하드웨어 개발 체계(에뮬레이션 API)를 갖췄다. 고도의 검증 기법을 "내 책상 위"에서 수행 할 수 있다.


[참조1] SCE-MI(Standard Co-Emulation Modeling Interface) [link]
[참조2] RTL/pong_pt1: FPGA 에뮬레이션 [링크]
2. PSCE-TRANS 회로도와 부품

* PSCE-MI 보드 회로도[링크]
** FPGA 모듈 회로도[링크]

3. PSCE-TRANS 보드 조립
3-1. 2열 40핀 직각 헤더 핀, 2열 5핀 직각 헤더 소켓 (3개)
- 좌측의 2열 40핀 직각 헤더는 "My Chip" 테스트 용
- 우측 2열 5핀 직각 헤더 소켓은 PSCE-MI에 연결

3-2. 2열 24핀 헤더 소켓(2개)
- FPGA 모듈 결합용 헤더 소켓

3-3. FPGA 모듈 결합

보드 결합:
a. 피코(Pico) 모듈을 에뮬레이션 모델링 인터페이스(PSCE-MI) 쪽 헤더 소켓에 꼽는다.
b. 조립한 PSCE-TRANS 보드에 FPGA 모듈을 결합한다.
* FPGA는 인텔/알테라의 싸이클론 IV로서[링크],
- 약 6천개의 로직 엘리먼트
- 270Kbit 내장 메모리를 가지고 있다.
c. PSCE-MI 보드와 PSCE-TRANS 보드를 결합한다.
* 3개의 2열 5핀 헤더가 엇나가지 않도록 주의
USB 포트 연결:
d. PSCE-MI에 장착된 피코 모듈의 USB-C는
- 테스트벤치 소프트웨어와 DUT 하드웨어 사이의 통신을 처리한다.
- 피코 모듈의 RP2040 칩에 내장된 USB 시리얼 통신 장치다.
e. PSCE-TRANS에 장착된 FPGA 모듈의 USB-C는
- FPGA의 전원 공급용이다.
- FPGA 모듈 상에 시리얼 통신 칩(CH340)을 가지고 있으나 사용하지 않는다.
f. JTAG 다운로더 케이블을 FPGA 모듈에 연결한다.
- JTAG 다운 로더는 FT232H 칩을 사용한 시리얼 통신 장치다.
- JTAG 케이블 명칭은 digilent_hs2 다.
전원 확인:
g. FPGA 모듈의 전원 스위치(Power S/W)를 눌러 전원 LED가 켜짐을 확인한다.
h. FPGA에 다운로드 되지 않았으므로 Conf_Done은 꺼져 있다.
4. PSCE-MI/TRANS 보드 점검
4-1. 보드 결합 및 전원 인가시 점검
위의 3-3 절차에 따라 PSCE-MI 와 PSCE-TRANS 보드를 결합하고 USB를 통해 전원 인가 후 상태를 점검한다.
- 3개의 USB 장치(PSCE-MI의 피코, PSCE-TRANS의 FPGA 전원, JTAG 케이블)가 PC와 연결되어야 한다.
- PSCE-MI의 피코 모듈 상의 "Emulation Ready"는 켜지지 않을 수 있다.
- PSCE-TRANS의 FPGA 모듈의 "Conf_Done"은 꺼져 있어야 한다.
4-2. 피코 모듈의 외장 디스크로 인식
피코 모듈에 응용 프로그램(에뮬레이션 인터페이스)을 적재하려면 외장 드라이브로 인식 되어야 한다.

응용 프로그램이 적재되지 않았을 경우(공장 출하 상태) 운영체제는 피코 모듈을 외장 드라이브로 인식한다. 운영체제의 파일 탐색기에서 "RPI-RP2" 드라이브가 보이지 않을 경우 피코 모듈의 boot(피코의 흰색 버튼)와 동시에 PSCE-MI 보드의 리셋(좌측 적색 버튼)을 누른다.
4-3. JTAG 다운 로드 케이블 인식
윈도우즈의 파워쉘(또는 명령창)을 관지자 권한으로 실행한 후 프롬프트에서 list 명령을 주고 usbipd 를 실행 한다. JTAG 다운로드 케이블 장치의 VID:PID 는 0403:6014, DEVIDE 명은 USB Serial Converter 다. 시리얼 통신 장치로 인식되는 이유는 FT232H 칩을 사용하여 제작되었기 때문이다. BUSID는 컴퓨터의 USB 포트 인식 번호다. USB 허브의 사용에 따라 달라진다. 하지만 USB 장치의 벤더 번호(VID)와 프로덕트 번호(PID)는 고유하다.

4-4. FPGA 모듈 인식
PSCE-TRANS의 FPGA는 USB-C를 통해 전원 공급 받는다. 시리얼 통신 칩 CH340과 연결되어 있지만 사용하지 않는다. 적색 LED가 켜져 FPGA에 전원이 인가 되었는지 확인한다.
5. PSCE-MI/TRANS 동작 시험
디자인 킷에 준비된 예제를 실행 하여 에뮬레이션 키의 조립을 점검한다. 아래에 설명하는 절차는 윈도우즈 WSL에 우분투 리눅스 24.04를 기준으로 한다. 아울러 오픈-소스 설계 도구와 알테라 FPGA용 쿼터스가 설치된 경우다.
5-1. WSL 리눅스에서 윈도우즈 USB 장치 사용
윈도우즈 운영체제에 얹어진 WSL에서는 USB 장치를 직접 접근 할 수 없다. usbipd는 본 운영체제(Host OS)와 가상 머신(Guest OS) 사이의 장치 공유를 가능케 해주는 유틸리티다. 참고로, 두 운영 체제 사이의 장치 공유는 IP 네트워크를 통한다(Socket-IPC로 IP 데몬과 클라이언트).
a. USB 장치 공유
usbipd의 list 명령으로 장치 목록을 나열해 본다. 만일 JTAG 케이블의 상태가 "Not shared"라면 이를 공유 시켜야 한다. 공유 절차는 아래와 같다.

b. USB 장치를 WSL의 리눅스에 연결
장치를 공유 시키기 위한 bind 는 관리자 권한을 가져야 하지만 연결 attach는 일반 권한의 명령 프롬프트에서도 가능하다. 장치 연결할 WSL 리눅스가 먼저 실행 중이어야 한다.

c. WSL 리눅스에서 USB 장치 확인
장착된 USB 장치들을 나열하는 리눅스 명령은 lsusb 다. JTAG 케이블이 VID와 PID가 0403:6014인 FT232H USB-UART/FIFO IC로 나열되었음을 확인할 수 있다 .

5-2. 예제 "FIR_PE" 에뮬레이션 실행
디자인 킷의 예제 "FIR_PE"를 수행하여 조립한 에뮬레이션 키트을 점검한다. 에뮬레이터의 작동(조립 상태)을 점검하기 위한 목적이므로 예제의 설계 내용은 설명하지 않는다.
a. 예제 디렉토리로 이동 후 프로젝트 환경변수 설정
$ cd ~/ETRI050_DesignKit/Projects/RTL/FIR_PE
$ source env_settings
$ make
b. C/C++ 알고리즘과 RTL의 병합 시뮬레이션 수행
$ make csim
$ make co-sim
c. 에뮬레이션 준비(MI 펌웨어 및 TRANS 빌드)
에뮬레이션 환경 구축을 위해 아래와 같이 make 를 실행한다.
$ make emulation
이어서 모델링 인터페이스 빌드(피코 펌웨어 컴파일)하고,
$ make build-mi
DUT와 트랜잭터를 빌드(FPGA 용 베릴로그 합성과 배선) 한다.
$ make build-trans
d. 모델링 인터페이스(MI) 펌웨어 업로드
모델링 인터페이스 펌웨어를 올리려면 피코 모듈은 외장 드라이브로 인식되어야 한다(위의 4-2절 참조). 윈도우즈에서 외장 드라이브로 인식된 피코 모듈을 다시 리눅스 드라이브 장치로 마운트 시킨다. 아래의 예는 피코 모듈이 윈도우즈 운영체제에서 F: 드라이브로 인식된 경우다.
$ sudo mount -t drvfs f: /dev/f
모델링 인터페이스 펌웨어를 피코로 업로드,
$ make upload-mi

펌웨어가 업로드 되면 피코는 즉시 리부팅 되어 외장 디스크에서 사라지고 시리얼 포드로 인식된다. 파워 쉘 프롬프트에서 usbipd list 명령으로 인식된 장치를 확인 할 수 있다. 피코의 VID와 PID는 2e8a:000a다. 처음 연결이라면 bind 한 후 모델링 인터페이스 장치로 부팅된 피코를 WSL 리눅스에 연결 attach 한다.

리눅스의 lsusb 명령으로 USB 장치들을 나열하면 다음과 같다. JTAG 케이블과 Raspberry Pi Pico 가 연결되어있는 것을 확인 할 수 있다.

e. FPGA를 DUT를 감싼 트랜잭터로 구성
FPGA에 DUT 트랜잭터를 구성(configure)한다.
$ make config-trans

f. 에뮬레이터 실행
$ make co-emu

에뮬레이션을 실행 하면서 ERROR 를 보게 되더라도 당황하지 말자. 에뮬레이션 하드웨어가 작동하지 않았다면 이 메시지가 나오지도 않는다.

이로써 에뮬레이터의 모델링 인터페이스(PSCE-MI)와 트랜잭션 장치(PSCE-TRANS)가 잘 작동 하는 것으로 확인 되었다. 다음은 MPW 를 통해 제작된 "내 칩"의 테스트를 해보기로 한다.