본문으로 바로가기

[RISC-V] CV32E40P 을 이용한 RTL simulation

category SoC/RISC-V 2020. 5. 16. 18:35
반응형

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. 환경 준비


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. 작성된 환경 및 코드 

basic_pulp.zip


덧붙임 

  • 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