PULP Platform 에서는 다음과 같이 3종류의 프로세서를 지원합니다.
- 32 bit 4-stage core CV32E40P (formerly RI5CY)
- 64 bit 6-stage Ariane
- 32-bit 2-sage Ibex (formerly Zero-riscy)
이중에서 CV32E40P 프로세서와 간단한 firmware를 이용하여 RTL 시뮬레이션을 진행해 보겠습니다. 시뮬레이션 모델은 CV32E40P 에서 제공되는 verilator-model을 기본으로 이용하였으며, 시뮬레이션 환경은 다음 그림과 같습니다.
1. 환경 준비
- CV32E40P 다운로드
- PULP GNU toolchain 설치
- Verilator 및 GTKWave 설치
2. 시뮬레이션 환경 구성
1) basic_pulp/Makefile 에서 설치한 CV32E40P 의 경로를 설정합니다. ex) CV32E40P = /home/myskan/Work/pulp-platform/cv32e40p
# Tools CV32E40P = /home/myskan/Work/pulp-platform/cv32e40p VERILATOR = verilator VDIR = obj_dir CPPFLAGS = -I$(VDIR) `pkg-config --cflags verilator` CXXFLAGS = -Wall -Werror -std=c++11 -Wno-aligned-new CXX = g++ LD = g++
2) basic_pulp/program/base_test/Makefile 에서 설치한 GNU toolchain 경로를 설정합니다. ex) PREFIX = /opt/pulp-riscv32/bin/riscv32-unknown-elf-
#=============================================================================== # Compiler Path #=============================================================================== PREFIX = /opt/pulp-riscv32/bin/riscv32-unknown-elf- CC = $(PREFIX)gcc AS = $(PREFIX)gcc LD = $(PREFIX)ld -v CP = $(PREFIX)objcopy OD = $(PREFIX)objdump SZ = $(PREFIX)size NM = $(PREFIX)nm PROJECT = pulp
3) basic_pulp/program/Makefile 를 실행하여 Firmware 컴파일하고 test_vector를 추출합니다.
myskan@TP-P72:~/Work/pulp-platform/test/basic_pulp/program$ make cd ./base_test; make clean all make[1]: Entering directory '/home/myskan/Work/pulp-platform/test/basic_pulp/program/base_test' rm -f -f ./obj/*.o rm -f -f ./obj/*.d rm -f -f ./out/pulp.* compile src/entry.S compile src/init.c compile src/uart.c compile src/main.c linking ./out/pulp.elf generating ./out/pulp.bin generating ./out/pulp.lst generating ./out/pulp.nm text data bss dec hex filename 588 0 300 888 378 ./out/pulp.elf make[1]: Leaving directory '/home/myskan/Work/pulp-platform/test/basic_pulp/program/base_test' ./bin2hex.pl 8 ./base_test/out/pulp.bin ./base_test/out/from8m.dat ------------------------------------------------------------------------- Sucessfully converted bin to ASCII file ( with hexadecimal patterns ) - 8-bit Rom file created ------------------------------------------------------------------------- cp ./base_test/out/from8m.dat ../test_vector.txt myskan@TP-P72:~/Work/pulp-platform/test/basic_pulp/program$
4) basic_pulp/Makefile 를 실행하여 verilator로 부터 시뮬레이션 실행 화일을 생성합니다.
myskan@TP-P72:~/Work/pulp-platform/test/basic_pulp$ make verilator -O3 -CFLAGS "-O3 -g3 -std=gnu++11" \ -Wno-CASEINCOMPLETE -Wno-LITENDIAN -Wno-UNOPT \ -Wno-UNOPTFLAT -Wno-WIDTH -Wno-fatal -Wno-BLKANDNBLK \ --top-module top \ --Mdir obj_dir --trace -DPULP_FPGA_EMUL -cc \ ......... g++ testbench.o verilated.o verilated_dpi.o verilated_vcd_c.o Vtop__ALL.a -o Vtop -lm -lstdc++ make[1]: Leaving directory '/home/myskan/Work/pulp-platform/test/basic_pulp/obj_dir' g++ -Wall -Werror -std=c++11 -Wno-aligned-new -Iobj_dir `pkg-config --cflags verilator` -c -o testbench.o testbench.cpp g++ -o testbench testbench.o obj_dir/Vtop__ALL.a obj_dir/verilated.o obj_dir/verilated_vcd_c.o myskan@TP-P72:~/Work/pulp-platform/test/basic_pulp$
3. 시뮬레이션
위에서 생성한 testbench 를 실행하여 firmware 의 실행 결과 확인 및 waveform 을 이용하여 동작을 분석 할 수 있습니다.
myskan@TP-P72:~/Work/pulp-platform/test/basic_pulp$ ./testbench [STD]: Wave Dump: ./testbench.vcd [STD]: === Init @0ns [STD]: irq_i = 0 [STD]: debug_req_i = 0 [STD]: fetch_enable_i = 0 [CORE] Core settings: PULP_SECURE = 0, N_PMP_ENTRIES = 16, N_PMP_CFG 4 [STD]: === Start Sim @50ns [STD]: rstn_i = 0 [STD]: fetch_enable_i = 1 [VUART] Hello PULP !!! [STD] Simulation Finish for Virtual UART myskan@TP-P72:~/Work/pulp-platform/test/basic_pulp$
[CORE] 와 함께 출력된 메세지는 CV32E40P RTL 에서 생성한 메세지이고, [STD] 와 함께 출력되는 메세지는 testbench 에서 생성되는 메세지입니다. [VUART] 와 함께 출력된 메세지가 firmware 의 print 함수를 통하여 생성된 메세지 입니다.
4. WaveForm 확인
gtkwave를 통하여 위의 프로세서의 동작을 waveform 과 함께 분석 할 수 있습니다.
myskan@TP-P72:~/Work/pulp-platform/test/basic_pulp$ gtkwave testbench.vcd &
5. 작성된 환경 및 코드
덧붙임
- 2020년 05월 24일: riscv_core 의 in/out port 변경에 의한 컴파일 오류 수정
'SoC > RISC-V' 카테고리의 다른 글
ISA (Instruction Set Architecture) 에 대한 재미있는 관점 (0) | 2020.10.21 |
---|---|
RISC-V 와 ARM의 코드 사이즈 비교 (0) | 2020.09.19 |
RISC-V에 대한 ARM의 대응 (0) | 2019.10.14 |
RISC-V 의 전망 (2) | 2019.01.23 |
[RISC-V] Chisel Tutorial (0) | 2018.09.16 |