Show GN: basic_RV32s: 오픈소스 RISC-V RV32I CPU 설계 길잡이
(github.com/RISC-KC)4가지 CPU와 2개의 SoC 설계를 통한 실습으로 RISC-V CPU 설계의 기초를 익힐 수 있는 basic_RV32s 를 소개합니다.
basic_RV32s 요약
- 군복무중 6개월동안 만든 FPGA 동작 가능한 softcore RISC-V RV32I CPU
- Dhrystone 1.11 DMIPS/MHz, Coremark 1.10 Coremark/MHz 성능 달성
국내에서 설계된 RV32I기반 CPU 논문들 중 최상위권 성능.
(RISS 126편의 논문 중 RV32I benchmark 가 포함된 11편 참조, 작성일기준)
(@50MHz 구동) - 점진적인 CPU 설계 과정과 SoC 설계
- 3개의 싱글사이클 코어, (37F, 43F, 46F)
- 1개의 5단계 파이프라인 코어, (46F5SP)
- 파이프라인 코어를 탑재한 2가지 SoC 설계
(46F5SP_SoC - Debug, Benchmark)
- 직관적으로 이해하기 쉬운 하이레벨 수준 모듈 추상화 및 설계
- RISC-V CPU 설계를 학습 할 수 있는 여러 문서 제공
- RV32I Cheatsheet 액셀
- 개발일지, 디버그 기록
- 아키텍처 설계 가이드라인
- 모든 아키텍처 및 모듈별 로직 설명 문서
- 베어메탈 포팅 가이드라인
- RISC-V GNU GCC Toolchain RV32I 빌드 가이드라인
- Dhrystone 벤치마크 RV32I 베어메탈 구동 가이드라인 등
- 주석 없는 클린코드와 주석이 포함된 듀얼 포맷 구조 코드 제공
- 신호 수준 아키텍처 블럭 다이어그램 제공
- 학부생 2학년 두명이 단독으로 논문 투고하여 ISOCC 2025에 학회 발표
- RISC-V 공식 학습 레포지토리 riscv/learn 등재
- Learning Resources - Intermediate-Level Resource
개발 배경
2024년 12월 15일, 군 복무중 동기 한 명과 함께 CPU 를 직접 만드는 프로젝트를 시작했었습니다. 얼마 전에 1주년이었네요!
기초적인 컴퓨터 구조론에 입각한 RISC-V CPU 를 만드는 것은 이론이 매우 풍부하고, 교재들도 많아 비교적 쉽게 익힐 수 있었습니다. 하지만 키보드 앞에 서니 이는 다른 문제로 다가왔습니다.
학교에서 얕게 배운 VerilogHDL 로 제대로된 프로젝트를 시작하는 것은 처음이었지만, 코딩능력을 넘어 RISC-V CPU 를 만들기 위한 문서와 매뉴얼, 가이드라인이 포함된 실제 오픈 소스 RISC-V 예제가 거의 없다는 것을 알게 되었습니다. (riscv/learn - open implementations 기준.)
물론, NEORV32 나 DarkRISCV 등 이미 구현된 코어들을 분해하고 분석하는 것이 학습하기에 좋은 방법이지만, 설계 철학, 개발기록 등 설계 문제에 있어서 그 설계를 한 근거나 이유를 정확히 이해하고 찾는 것이 꽤나 힘들었습니다.
그래서 저는 단순히 이 프로젝트를 오픈소스 RISC-V CPU 의 구현뿐만 아니라, RISC-V RV32I CPU 를 만들기 위한 전체 오픈 소스 가이드라인으로 확장하기로 했습니다. 초보가 성장하는 기록을 담은게 다음 초보들에게 좋은 발자취가 되지 않을까 싶었습니다.
basic_RV32s 소개
위 요약에 적힌 것 처럼, 개발 로그와 코어 설계에 관한 문서, RISC-V CPU 제작에 대한 오답노트 등이 포함되어 있으며, 패터슨-헤네시 방법론을 기반 아키텍처로 하여 저와 같은 RISC-V 하드웨어 설계 초보자들을 타겟하였습니다.
핵심 설계는 RV32I에서 37개의 명령어를 지원하는 37F 아키텍처로 시작하여 다음과 같이 확장되는 점진적 형태로 제공됩니다.
- 37F : 베이스 아키텍처, 싱글사이클.
- 43F : 6개 Zicsr 확장 명령어 지원
- 46F : EBREAK, ECALL, mret 명령어 지원
- 46F5SP : 데이터 포워딩과 2비트 FSM 동적 분기 예측기를 갖춘 5단계 파이프라인 확장
코어를 FPGA에 구현하기 위해 46F5SP_SoC 를 설계했고, 두가지 버전으로 만들었습니다.
- 디버깅 버전
명령어를 디버깅하며 단계별로 수행과정을 버튼을 눌러 UART 통신으로 볼 수 있습니다. - 벤치마킹 버전
Dhrystone이나 Coremark 등을 실행하여 UART 를 통해 직접 결과를 얻을 수 있습니다.
최근 업데이트된 46F5SP_MMIO_SoC는 UART 출력을 지원하는 MMIO를 구현해 printf 기능을 지원합니다. 이 SoC는 적합하게 링커, 부트 스크립트, syscall 등 BSP 파일들 등을 통해 컴파일되면 Dhrystone 2.1이나 Coremark 등 여러 C 프로그램들의 결과를 직접 얻을 수 있습니다.
마치며
RISC-V 에 대한 저희의 열정이 초보자들이 시작하는 데 도움이 되길 바랍니다. 그리고 가장 중요한 부분은 이 전체 프로젝트가 오픈 소스라는 점입니다!
이 프로젝트를 활용하여 RISC-V 커뮤니티에 더 나은 학습 튜토리얼과 문서, 프로세서 디자인을 만들어 누구나 자유롭게 기여할 수 있다는 뜻입니다.
저는 이 프로젝트의 목적을 위해 더 많은 것이 필요하다고 느낍니다. 프로젝트를 수행하며 검증엔 끝이 없다는 걸 알게 되었고, 저는 전문가가 아니기에 여러 해저드를 포함하여 제가 모르는 오류가 많이 포함되어 있을 수 있습니다. 때문에 레포는 frozen 되지 않았고 계속 열려있습니다! 부디 고수분들께서 부디 저희의 작품을 봐주시고 피드백해주시면 큰 도움이 될 것입니다. 저희 뿐만 아니라 이 프로젝트를 보고 학습하는 모두에게도요.
이후
지금은 RV32I 이후 RV64I 확장을 마쳐 RV64IM으로의 확장과 더 나아가 원래 꿈이었던, 대한민국의 범용 CPU(RVA23)를 만들고자하는 목표를 향해 정진하고 있습니다. ima_make_rv64라는 레포지토리로 현재 RV64IMA 확장까지의 개발에 전념하고 있습니다. 지켜봐주시면 정말 감사하겠습니다.
과거에 '복무중에 진행중'이라 쓰인 프로젝트를 본 기억이 나는데, 그 분이신지 모르겠네요. 그 프로젝트의 연장인지 몰라도 정말 감탄이 나옵니다. 당연해 보이는 전제에 대해서 조차 "왜?"라는 질문을 던지는 모습은 이학의 근간이고, 정말로 멋지고 응원합니다.
특히나 오픈소스라는 점이 멋지네요. 과학은 누구보다도 모두의 것이여야 하니깐요. 완전히 오픈소스의 하드웨어가 있다면 어떨까 생각해 초기부터 RISC-V에 관심이 많았는데, 점점 회로쪽과 멀어지기도 했고, 관련된 정보도 글쓴이분 말씀처럼 찾기가 어려워 고이 닫아두었습니다. 저도 다시 공부해 보고픈 마음이 들고, 또 보면서 도움이 될 것 같습니다. 본인의 시행착오와 얻은 지식을 모두와 공유하고, 기여해주셔서 감사합니다. 앞으로의 하시는 바 또한 응원하겠습니다.
저도 그분 프로젝트를 읽어보곤 조금 놀랐습니다. 군대에서 CPU를, ASIC 프로젝트에 탑승해서 제작한 사례가 그것도 같은 시기에 있었다는 것에 말이죠 ㅎㅎ..
소중한 댓글 잘 읽어보았습니다. 저도 말씀하신 부분에서 답답함을 많이 느껴 이 프로젝트를 시작하게 되었던게 가장 컸던 것 같아요. 그리고 '왜' 라는 질문에서 더 나아가 '다른 더 좋은 방법은 없을까?' 라는 것이 자연스레 뒤따라오더라구요.
이번 RV64를 마치고나면 설계 철학을 어느정도 조정하여 새로운 마이크로아키텍처를 구상해보려고 합니다.
응원 정말 감사드립니다. 앞으로도 잘 해보겠습니다.!
궁금하신 점 있으시면 언제든지 말씀해주세요!!