본문 바로가기

RISC-V/RISC-V 설계

[RISC-V] Single Cycle CPU 직접 설계하고 구현하기 1편

 CPU의 동작 원리와 명령어가 실행되는 경로를 깊이 이해하는 가장 좋은 방법은 Verilog HDL을 이용해 직접 설계해 보는 것입니다. 이론으로만 접했던 데이터패스(Datapath)와 제어 장치(Control Unit)가 실제 하드웨어로 어떻게 결선되고 상호작용하는지 단일 사이클 CPU 구조를 통해 정리해 보겠습니다.

 

1. Single Cycle CPU 개요

단일 사이클 CPU는 하나의 명령어를 단 한 개의 클럭 사이클 안에서 완전히 실행 완료하는 구조입니다.

  • 실행 단계: Instruction Fetch $\rightarrow$ Instruction Decode $\rightarrow$ Execute $\rightarrow$ Memory Access
  • 특징: 구조가 매우 직관적이고 단순하여 학습용으로 가장 적합하지만, 가장 긴 경로(Critical Path)에 클럭 주기가 맞춰지므로 높은 클럭 속도를 달성하기 어렵다는 단점이 있습니다.

 

2. 전체 데이터패스(Datapath) 구조 및 모듈별 역할

전체 아키텍처는 크게 데이터를 처리하는 데이터패스와 이를 통제하는 컨트롤러로 나뉩니다.

 

파란 라인: PC/주소

빨강 라인: 데이터 경로

초록 라인: 명령어 비트

검은 라인: 제어 신호

 

2.1. Instruction Fetch 및 Decode 유닛

  • Program Counter (PC): 현재 실행 중인 명령어의 주소를 저장하는 순차 논리 레지스터입니다. PCSel 신호에 따라 일반적인 순차 실행(PC + 4) 주소와 분기 성공 시의 Branch Target 주소 중 하나를 MUX를 통해 입력받아 업데이트합니다.
  • Instruction Memory (IMEM): PC 주소에 해당하는 32비트 명령어를 출력하여 레지스터 파일, 즉시값 생성기, 컨트롤러로 분산 전달합니다.
  • Immediate Generator: 명령어 내부에 포함된 상수(Immediate) 비트들을 컨트롤러의 immSel 신호에 맞춰 추출하고, 32비트 크기로 부호 확장(Sign Extension)합니다.

 

2.2. 연산 및 제어 상태 유닛

  • Register File: RV32I 규격에 따른 32개의 범용 레지스터(x0~x31) 집합입니다. rs1, rs2 주소로 피연산자를 동시에 읽고, Write Back 단계에서 RegWEn 신호에 따라 rd 레지스터에 결과 데이터를 기록합니다. 하드웨어 규격상 x0는 항상 0으로 유지되는 보호 로직이 적용됩니다 .
  • Branch Comparator: 두 레지스터 데이터 값을 실시간으로 비교하여 BrEq(같음), BrLT(작음) 플래그를 생성합니다. BrUn 신호에 따라 부호 있는 연산과 부호 없는 연산을 모두 지원합니다 .
  • ALU (Arithmetic Logic Unit): ALUSel 신호에 제어되어 ADD, SUB, AND, Shift 등의 실질적인 산술/논리 연산을 수행합니다. 입력단에 위치한 MUX인 ASel과 BSel을 통해 레지스터 데이터뿐만 아니라 현재 PC 주소나 즉시값을 유연하게 피연산자로 선택할 수 있습니다.

 

2.3. Memory Access 및 Write Back 유닛

  • Data Memory (DMEM): Load/Store 명령어 수행 시 접근하는 대용량 메모리입니다. MemRW 신호로 읽기/쓰기를 제어하며, WordSizeSel 신호를 통해 Byte, Halfword, Word 단위의 가변 크기 접근을 지원합니다.
  • Write-Back 구조 (WB MUX): 최종 연산 결과 데이터를 레지스터 파일에 되돌려 쓰기 위한 멀티플렉서입니다. WBSel 제어 신호에 의해 아래 중 하나를 선택하여 최종 타겟 레지스터에 저장합니다 .
    • 00 = DMEM Read Data
    • 01 = ALU Result
    • 10 = PC + 4 (Jump 복귀 주소)

 

   

3. 핵심 제어 장치 (Controller)의 역할

컨트롤러(Controller)는 인출된 명령어의 opcode와 funct 필드를 분석하여 CPU 전역으로 제어 신호를 뿌려줍니다 . 이 제어 신호들이 각각 데이터패스의 MUX 방향을 바꾸거나 모듈의 활성화 여부를 결정하게 됩니다. 이번 설계에 사용된 10가지 핵심 제어 신호의 역할은 다음과 같습니다.

 

3.1. 프로그램 카운터 및 레지스터 제어 신호

  • PCSel: 다음 명령어 주소를 연산 결과(Branch/Jump 타겟 주소)로 사용할지, 아니면 순차적으로 바로 다음 명령어(PC + 4)로 넘어갈지 결정하는 신호입니다 .
  • RegWEn (Register Write Enable): Register File에 최종 연산 결과 값을 적을 수 있는 쓰기 권한을 주는 신호입니다. (0일 때는 레지스터 값이 변하지 않습니다.)
  • immSel: 명령어 타입(I, S, B, U, J)에 따라 Immediate Generator가 추출할 즉시값의 형식을 결정하는 신호입니다 .

 

3.2. 연산 및 비교 제어 신호

  • BrUn (Branch Unsigned): Branch 명령어 구동 시, 두 레지스터의 값을 비교할 때 부호 없는(Unsigned) 비교를 할지 부호 있는(Signed) 비교를 할지 결정하는 신호입니다 .
  • ASel (ALU MUX A Select): ALU의 첫 번째 입력(Operand A)으로 레지스터 출력값(dataA)을 쓸지, 아니면 현재 PC 주소 값을 쓸지 결정하는 MUX 선택 신호입니다.
  • BSel (ALU MUX B Select): ALU의 두 번째 입력(Operand B)으로 레지스터 출력값(dataB)을 쓸지, 아니면 확장된 즉시값(immOut)을 쓸지 결정하는 MUX 선택 신호입니다 .
  • ALUSel: ALU 내부에서 실제로 어떤 연산(ADD, SUB, AND, OR, Shift 등)을 수행할지 결정하는 신호입니다.

 

3.3. 메모리 및 Write-Back 제어 신호

  • MemRW (Memory Read/Write): 데이터 메모리(DMEM)의 동작을 결정하는 신호입니다. 0일 때는 읽기(Read), 1일 때는 쓰기(Write) 모드로 동작합니다.
  • WBSel (Write-Back Select): 모든 실행을 끝마치고 레지스터 파일에 최종적으로 되돌려 쓸(Write-Back) 데이터 소스를 선택하는 신호입니다 .
  • WordSizeSel: RISC-V의 다양한 가변 크기 메모리 접근 명령어들(lb, lh, lw, sb, sh, sw)을 처리하기 위해, 데이터 메모리에 접근할 변수 크기(Byte / Halfword / Word) 및 부호 확장 여부를 지정하는 신호입니다 .

 

4. 명령어별 실행 흐름 예시

  • ADD 명령어:
    • 레지스터 rs1, rs2 로드 
    • ALU ADD 연산
    • 결과를 ALUOUT을 통해 rd 레지스터에 기록 (WBSel = 01) .
  • LW 명령어:
    • 레지스터 rs1 로드 및 즉시값 생성
    • ALU에서 메모리 주소 계산
    • DMEM 데이터 인출
    • 결과를 rd 레지스터에 기록 (WBSel = 00) .
  • BEQ 명령어:
    • 레지스터 rs1, rs2 로드
    • Branch_Comp 조건 평가
    • 일치 시(BrEq = 1) PCSel을 가동하여 PC를 분기 타겟 주소(PC_jump)로 변경.

 

5. Single-Cycle CPU의 한계와 발전 방향

단일 사이클 구조는 하드웨어 제어 흐름을 명확하게 파악하고 설계 방식을 연습하는 데 가장 적합합니다. 그러나 모든 명령어의 실행 속도가 가장 무겁고 긴 경로(Critical Path)인 Load 명령어 주기에 강제되므로 전체 시스템의 성능과 주파수를 끌어올릴 수 없다는 뚜렷한 한계가 존재합니다.

이러한 한계를 극복하기 위해 실제 산업계와 고성능 아키텍처에서는 단계를 쪼개어 병렬 처리하는 Multi-Cycle, Pipeline(파이프라이닝), Out-of-Order 구조 등으로 발전해 나가게 됩니다.

다음 포스팅 부터는 본 도면 구조들을 바탕으로 구현한 각 모듈별 상세 Verilog HDL 소스 코드 분석 및 시뮬레이션 검증 방법에 대해 본격적으로 다루어 보겠습니다.