1. 개요: CPU 성능을 무엇이 결정하나?
1.1. CPU 성능 3요소
- Instruction count(명령어 개수): ISA/컴파일러가 좌우
- CPI(명령어당 사이클 수), Cycle time(클록 주기): CPU 하드웨어가 좌우
1.2. 이번 장에서 다룰 구현
- 단순(single-cycle) RISC-V 구현: 핵심 아이디어를 단순화
- 파이프라인(pipelined) 구현: 현실적인 성능/해저드 처리
2. 명령어 실행의 큰 그림
2.1. 기본 실행 단계(개념적)
- PC로 명령어 메모리 접근 → instruction fetch
- 명령어 내 레지스터 번호로 레지스터 파일 읽기
- 명령어 종류에 따라 ALU로
- 산술/논리 결과 계산
- load/store 주소 계산
- branch 비교(예: beq는 subtract 후 Zero 확인)
- load/store면 데이터 메모리 접근
- 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
-
명령어마다 클록을 다르게 쓰는 건 일반적으로 부적절(설계 원칙 위반) → 파이프라이닝으로 해결