LiteX용 데모 번들 펌웨어

이 LiteX용 펌웨어에는 작은 데모 프로그램들을 묶은 ROM이 들어 있으며, 이를 사용하여 여러 코어를 테스트하고 벤치마크할 수 있습니다. 그중 일부는 SSD1331 OLED 디스플레이가 연결되어 있고 설정되어 있으면 그 디스플레이에 그래픽 효과를 표시합니다. 다른 일부(tinyraytracer와 mandebrot)는 결과를 OLED 화면(설정된 경우)과 콘솔(ANSI 색상 코드를 사용하므로 픽셀이 아주 큽니다!)에 표시합니다.
| 데모 | 설명 | 비고 |
|---|---|---|
| tinyraytracer | Dmitry Sololov의 레이트레이서 | 텍스트 모드(설정된 경우 + OLED) |
| 망델브로 | 고정 소수점 망델브로 집합 | 텍스트 모드(설정된 경우 + OLED) |
| raystones | 레이트레이서 성능 테스트 | 코어 벤치마크에 사용할 수 있습니다 |
| oled_test | OLED 화면을 테스트합니다 | OLED가 설정된 경우에만 |
| oled_riscv_logo | 90년대풍 로토줌 데모 | OLED가 설정된 경우에만 |
| oled_julia | Sylvain Lefebvre의 애니메이션 쥘리아 집합 | OLED가 설정된 경우에만 |
tinyraytracer / raystones
이것은 Dmitry Sokolov의 tinyraytracer를 LiteX에 맞게 옮긴 C 버전입니다. LiteX에서 실행되는 여러 코어를 벤치마크하는 데 사용할 수 있습니다. 레이트레이싱은 소프트웨어로 구현되었든 FPU로 구현되었든 부동소수점 연산을 대량으로 사용하므로 코어를 벤치마크하는 데 흥미로운 대상입니다.
0단계: 합성하기
여기의
안내를 따르십시오. ULX3S에 소형 OLED 디스플레이(모델명
SSD1331)를 연결했다면 명령줄에 --with-oled
옵션을 추가할 수 있습니다.
1단계: 컴파일
$ make LITEX_DIR=<path where you synthesized LiteX>
LEARN_FPGA_DIR=<path where you installed learn-fpga> LITEX_PLATFORM=<platform>
(platform은 사용하는 FPGA 보드에 해당하며, 예를 들어 radiona_ulx3s일 수 있습니다.)
또는 Makefile을 편집하여 LITEX_DIR,
LEARN_FPGA_DIR, LITEX_PLATFORM을 직접 지정할
수도 있습니다.
모든 것이 잘 진행되면 demo.bin이 생성됩니다.
2단계: 실행
$ lxterm --kernel demo.bin /dev/ttyUSBnn
litex> reboot
litex-demo-bundle> tinyraytracer
결과는 프레임버퍼에 표시됩니다(HDMI 비디오 커넥터에 모니터를 연결하십시오). SoC를 프레임버퍼 지원 없이 합성했다면 터미널 창에 표시됩니다(이 경우 픽셀이 아주 크게 나옵니다!). 이는 텍스트 모드이며, 이스케이프 시퀀스로 배경색을 바꿉니다. 소형 OLED 디스플레이를 연결하고 설정했다면 그 화면에서도 이미지를 볼 수 있습니다.
또는 다음을 사용할 수도 있습니다.
litex-demo-bundle> raystones
이 명령은 터미널에 렌더링하지 않고 이미지만 계산합니다(터미널 렌더링은 어떤 이유에서인지 시간이 걸리는데, 코어들의 성능을 비교하려면 시간 측정이 최대한 정확해야 합니다).
성능은 "raystones" 단위로 측정합니다. 즉, MHz당 초당 픽셀 수입니다(공식 단위는 아닙니다!).
ULX3S에 소형 SSD1331 OLED 화면을 연결했고 이를 지원하는
플래그(--with-oled)를 붙여 LiteX를 합성했다면, 펌웨어에
다른 그래픽 데모도 포함되어 있습니다. help를 입력하면
목록을 볼 수 있습니다.
여러 코어를 테스트할 때에는 소프트웨어를 다시 컴파일하는 것을 잊지 마십시오.
$ make clean all
컴파일 플래그는 설정된 코어에 맞게 조정됩니다(예: RV32I, RV32IM, RV32IMC, RV32IMFC 등). 크래시가 발생한다면 설정된 코어가 지원하지 않는 플래그로 컴파일한 코드를 실행했기 때문일 수 있습니다(예를 들어 RV32IMFC를 지원하는 femtorv32-petitbateau를 사용하다가 femtorv32-quark로 바꾸었는데, petitbateau용으로 컴파일한 소프트웨어를 로드한 경우입니다).
FPU가 있는 다른 코어
VexRiscV는 더 효율적인 코어이며, 선택적으로 FPU를 포함할 수 있습니다. FPU를 포함한 VexRiscV로 LiteX를 생성하려면 코어 정의 파일을 약간(조금의 비트만큼) 수정해야 하지만(현재는 FPU 생성 옵션을 전달할 방법이 없기 때문입니다), 어렵지 않습니다:
litex/litex/soc/cores/cpu/vexriscv_smp/core.py를 편집합니다dcache_width와icache_width를64로 설정합니다(52행과 53행)with_fpu를True로 설정합니다(57행)
그런 다음 vexriscv_smp 프로세서로 LiteX를
생성합니다(사용하는 장치와 SDRAM 모듈에 맞게 조정하십시오).
python3 -m litex_boards.targets.radiona_ulx3s --cpu-type=vexriscv_smp --build --load --device LFE5U-85F --sdram-module AS4C32M16 --with-oled
펌웨어를 다시 컴파일하고(make clean all)
로드합니다(make terminal 후 reboot).
여러 코어의 RayStones 성능
아래 표는 여러 코어의 "raystones" 점수(픽셀/s/MHz)를 보여 줍니다. LUT와 FF는 ULX3S(ECP5)에서 다음 명령으로 측정했습니다.
python3 -m litex_boards.targets.radiona_ulx3s --cpu-type=xxxx --cpu-variant=yyyy --build --load --device LFE5U-85F --sdram-module AS4C32M16
TODO: 프레임버퍼를 활성화하고 AS4C16M16을 사용한 상태로 통계를 다시 계산해야 합니다
| 코어 | 명령어 집합 | raystones | 총 LUT 수 | 총 FF 수 |
|---|---|---|---|---|
| serv | rv32i | 0.111 | 3381 | 2664 |
| picorv32-minimal | rv32i | 1.45 | 4333 | 3320 |
| picorv32-standard | rv32im | 2.352 | 5974 | 4632 |
| femtorv-quark | rv32i | 1.99 | 3721 | 2898 |
| femtorv-electron | rv32im | 3.373 | 4874 | 3270 |
| femtorv-gracilis | rv32imc | 3.516 | 5416 | 3528 |
| femtorv-petitbateau | rv32imfc | 45.159 | 8677 | 4234 |
| vexriscv imac | rv32imac | 7.987 | 6348 | 5804 |
| vexriscv_smp | rv32imafd | 124.121 | 9792 | 10024 |
ULX3S에서의 (거의) 베어 코어:
| 변형 | LUT | FF |
|---|---|---|
| quark | 1226 | 430 |
| electron | 2150 | 802 |
| gracilis | 2799 | 1018 |
| petitbateau | 6197 | 1724 |
LiteX 수치와 비교하면, LiteX SOC가 대략 2500 LUT와 2500 FF를
차지한다고 추론할 수 있습니다. 그러면 "raystones 밀도", 즉
raystones/(LUT+FF)*10^6를 측정할 수 있습니다:
| 코어 | 명령어 집합 | raystones | 코어 LUT | 코어 FF | raystones 밀도 |
|---|---|---|---|---|---|
| serv | rv32i | 0.111 | 881 | 164 | 106 |
| picorv32-minimal | rv32i | 1.45 | 1833 | 820 | 546 |
| picorv32-standard | rv32im | 2.352 | 3474 | 2132 | 419 |
| femtorv-quark | rv32i | 1.99 | 1221 | 398 | 1229 |
| femtorv-electron | rv32im | 3.373 | 2364 | 770 | 1076 |
| femtorv-gracilis | rv32imc | 3.516 | 2916 | 1028 | 891 |
| femtorv-petitbateau | rv32imfc | 45.159 | 6177 | 1734 | 5708 |
| vexriscv imac | rv32imac | 7.987 | 3848 | 3304 | 1116 |
| vexriscv_smp | rv32imafd | 124.121 | 7292 | 7524 | 8377 |
(참고: SOC가 차지하는 비중을 추정하여 뺐기 때문에 이 수치들은 아마 정확하지 않을 것입니다. 특히 매우 작은 SERV의 경우가 그러하며, 제가 예상하기로는 SERV의 raytsones 밀도가 적어도 200은 될 것입니다.)