1. 개요: CPU 성능을 무엇이 결정하나?

1.1. CPU 성능 3요소

  • Instruction count(명령어 개수): ISA/컴파일러가 좌우
  • CPI(명령어당 사이클 수), Cycle time(클록 주기): CPU 하드웨어가 좌우

1.2. 이번 장에서 다룰 구현

  • 단순(single-cycle) RISC-V 구현: 핵심 아이디어를 단순화
  • 파이프라인(pipelined) 구현: 현실적인 성능/해저드 처리

2. 명령어 실행의 큰 그림

2.1. 기본 실행 단계(개념적)

  1. PC로 명령어 메모리 접근 → instruction fetch
  2. 명령어 내 레지스터 번호로 레지스터 파일 읽기
  3. 명령어 종류에 따라 ALU로
    • 산술/논리 결과 계산
    • load/store 주소 계산
    • branch 비교(예: beq는 subtract 후 Zero 확인)
  4. load/store면 데이터 메모리 접근
  5. PC 업데이트: PC <- PC+4 또는 분기 타깃

3. 논리 설계 기초(데이터패스 이해의 전제)

3.1. 정보 표현과 회로 블록

  • 비트는 전압 레벨로 표현(0/1), wire 1개 = 1bit, 여러 비트는 bus

  • 조합논리(Combinational): 출력 = 입력의 함수(기억 없음)

    • AND, MUX, Adder, ALU
  • 순차논리(Sequential): 상태 저장(레지스터 등)

    • 엣지 트리거(클록 0→1에서 업데이트)
    • write enable이 있으면, enable=1일 때만 업데이트

3.2. 클로킹 방법론(중요)

  • 한 클록 사이에 조합논리가 계산을 수행하고, 다음 엣지에서 상태 레지스터에 저장
  • 최장 지연(critical path)이 클록 주기를 결정

4. 데이터패스(datapath) 설계: 단일 사이클 프로세서

4.1. Datapath란?

  • CPU 내부에서 데이터/주소를 실제로 흘려서 계산하는 블록들의 집합
  • 예: PC, instruction memory, register file, ALU, data memory, mux, adder…

4.2. Instruction Fetch(명령어 인출)

  • PC 레지스터(32-bit)가 instruction memory 주소로 들어감
  • 동시에 PC+4 계산(다음 명령어 기본 주소)

4.3. 명령어 클래스별 필요한 하드웨어 동작

(1) R-format (add/sub/and/or)

  • 레지스터 2개 읽기 → ALU 연산 → 결과를 목적 레지스터에 write-back

(2) Load/Store (lw, sw)

  • base 레지스터 + 12-bit immediate offset(sign-extend)로 주소 계산(=ALU)
  • lw: data memory read → 레지스터 갱신
  • sw: 레지스터 값을 data memory write

(3) Branch (beq)

  • 레지스터 2개 읽기 → ALU로 subtract → Zero면 분기
  • 타깃 주소: sign-extend displacement 후 1비트 좌시프트(halfword 단위)하고 PC에 더함

4.4. 합쳐서 하나의 단일 사이클 데이터패스 만들기

  • 한 사이클에 한 명령어를 끝내려면, 같은 자원을 동시에 두 용도로 못 씀

    • 그래서 instruction memory와 data memory를 분리(또는 I-cache/D-cache)
  • 서로 다른 명령어가 다른 입력을 필요로 하는 지점은 MUX로 선택

5. 제어(Control): 데이터패스를 명령어대로 움직이게 하는 신호

5.1. ALU Control(기능 선택)

  • ALU는 명령어에 따라 다음과 같이 쓰임

    • lw/sw: add(주소 계산)
    • beq: subtract(비교)
    • R-type: funct 필드 기반으로 연산 선택
  • 예시

    • AND=0000, OR=0001, add=0010, sub=0110

5.2. Main Control Unit(메인 컨트롤)

  • instruction opcode(및 형식)에 따라

    • RegWrite, MemRead, MemWrite, MemtoReg, ALUSrc, Branch, ALUOp … 같은 신호 생성
  • 핵심 아이디어

    • opcode → (ALUOp 포함) 큰 방향 결정
    • funct 필드 → ALU control 세부 확정

5.3. 단일 사이클 구현의 성능 한계

  • 클록 주기 = 가장 느린 명령어의 경로(critical path)에 맞춰야 함

  • 보통 lw가 최악 경로

    • instruction memory → regfile read → ALU → data memory → regfile write
  • 명령어마다 클록을 다르게 쓰는 건 일반적으로 부적절(설계 원칙 위반) → 파이프라이닝으로 해결