에피소드 I: 프로세서 설계에 대한 전반적인 이해
프로세서 설계를 이해하려고 제가 가장 먼저 읽은 것은 Stackoverflow의 이 답변이었는데, 많은 영감을 받았습니다. @mithro가 추천해 준 이 글도 있습니다. 체계적인 강의로는 MIT의 이 강의를 적극 추천합니다. 이 강의는 제가 여기서 다룬 것보다 훨씬 더 나아가기 위한 원리(파이프라인 등)도 알려 줍니다.
Verilog 기초와 문법은 Verilog by example by Blaine C. Readler로 공부했는데, 이 책 역시 짧고 핵심만 담고 있습니다.
Stackoverflow 답변에는 좋은 점이 두 가지 있습니다.
- 본질에 곧바로 다가가며, 본질적인 것 외에는 아무것도 담지 않습니다
- 예로 든 것이 RISC 프로세서인데, RISC-V와 여러 면에서 비슷합니다(다만 RISC-V에는 없는 상태 플래그가 있다는 점은 다릅니다).
여기서 배울 수 있는 것은, 이른바 범용(general-purpose)
레지스터를 저장하는 레지스터 파일(register file)이 있다는
점입니다. 범용이라는 말은, 명령어가 레지스터를 읽을 때마다 그 레지스터가
어느 것이든 될 수 있고, 명령어가 레지스터에 쓸 때마다 그 레지스터 역시
어느 것이든 될 수 있다는 뜻입니다. 이는 특수(specialized)
레지스터를 가진 x86(CISC)과 다른 점입니다. 가장 일반적인
명령어(register <- register OP register)를 구현하기
위해, 레지스터 파일은 매 사이클마다 레지스터 두 개를 읽고, 선택적으로
레지스터 하나에 결과를 다시 씁니다(write-back).
두 값에 대한 연산을 계산하는 ALU가 있습니다.
또한 현재 명령어의 비트 패턴으로부터 필요한 모든 내부 신호를 생성하는 디코더(decoder)도 있습니다.
RISC-V 프로세서를 직접 설계하고 싶다면, Stackoverflow 답변을 깊이 살펴보고, 더 나아가기 전에 직접 회로도를 몇 개 그려 보면서 전반적인 개념을 모두 머릿속에 넣어 두기를 권합니다.
좋습니다. 이제 이것을 RISC-V 명령어를 이해하는 무언가로 어떻게 옮길 수 있는지 살펴봅시다.