목표: Processor의 내부 구조를 이해하자
Introduction
- CPU 성능의 요소(factor)
- Instruction count(명령어 수)
- ISA(Instruction set Architecture)와 컴파일러에 의해 결정
- CPI(Cycle Count per Instruction)와 Cycle Time
- CPU 하드웨어에 의해 결정
- MIPS 구현방식을 2가지의 형태로 배워볼 것
- 간소화된 버전
- 그보다는 좀 더 현실적인 pipeline화된 버전
- 구현에 실제 MIPS의 모든 명령어를 사용하진 않고, 일부분을 사용할 것임.
- (하지만, 주로 사용되는 명령어들이고, 대부분의 동작을 구현 가능하므로..)
- 메모리 참조(memory reference): lw, sw
- 산술/논리(arithmetic/logical): add, sub, and, or, slt
- 제어 이동(control transfer): beq, j
Instruction Execution
- PC(Program Counter, 현재 실행하는 명령어의 메모리 주소를 가짐(정확히는 다음번)) ↔ instruction memory.
- PC에 담긴 주소로 instruction memory에서 instruction을 읽어오는 것을, fetch instruction이라고 함.
- 레지스터 번호 ↔ 레지스터 뭉치
- instruction에서 레지스터 번호($at, $t0, $s0, ...)를 통해 레지스터에 접근하여 값을 읽어오는 것을 read register.
- instruction 종류(class)에 따라..
- 계산에 ALU를 사용하기도 함.
- 산술 계산
- load/store를 위한 메모리 주소 계산
- branch 대상 주소 계산(offset)
- 메모리에 접근하여 데이터를 load/store하는 명령어.
- PC ← 대상주소(점프류) / PC+=4(순차적 진행)
Multiplexer
- Control
- 각각의 하드웨어 모듈(레지스터, 메모리, …) 이 어떻게 동작하는지를 제어해주는 컨트롤을 만들어주는 회로
- 명령어를 읽어서 해당하는 제어 신호를 만들어냄.
Logic Design Conventions
- 정보는 binary(0, 1)로 인코딩된다.
- 저전력 = 0, 고전력 = 1
- 하나의 비트 표현마다 한 개의 선(wire)이 필요하다.
- 따라서, 멀티비트 데이터는 multi-wire bus들로 인코딩됨
- combinational element(조합 요소)
- 데이터(목표)에 동작함
- output은 input의 조합
- state(sequential) element(상태/순서적 요소)
- 정보를 저장(store)
Combinational Elements
Sequential Elements
- 레지스터: 데이터를 회로에 저장(store)
- clock 신호(signal)를 사용하여 언제 저장된 값이 업데이트 되는지 결정
- Edge-triggered: clock이 0에서 1로 변할 때(rising-edge) 업데이트
- (※ falling-edge에서 업데이트시킬 수도 있음. 정하기 나름. 여튼 edge에서.)
- Combinational Elements는 input과 규칙에 의해 output이 결정되었으나, Sequential Elements는 현재값과 input, clock 타이밍에 의해 output이 결정.
- 레지스터, 메모리 등에 사용.
Clocking Methodology
- Combinational logic은 clock cycle동안 데이터를 변형(transform) 한다.
- clock edge간에. 그 사이에.
- state element들로부터 input이 되고, output은 또 state element가 된다.
- 가장 지연이 긴 시간(longest delay, 가장 느린 logic)이 clock period(클럭 주기)를 결정한다.
Different Implementations
- 덧셈을 위한 1-bit ALU
- add, and, or를 위한 1-bit ALU는 어떻게 만드는가?
- 32-bit ALU는 어떻게 만드는가?
Building a 32 bit ALU
a-b 구현
- 2의 보수 관점으로 접근해라: b를 negate (0을 1, 1을 0)을 취하고 1을 더하면 된다.
- 어떻게 negate 시키는가?
Tailoring the ALU to the MIPS
- slt (set-on-less-than) instruction 구현?
- 기억할 점: slt는 산술 연산이다.
- rs < rt일 경우 1, 아닐 경우 0을 만들어라
- 뺄셈을 이용: (a-b) < 0 implies a < b
- beq (branch equal) instruction 구현?
- 뺄셈을 이용: (a-b) = 0 implies a = b
ALU Extension
Register File
Read Register
Writer Register
Register File
Building a Datapath
- Datapath
- 데이터가 흐르는 경로
- 연산을 위한 데이터든, 그 결과든 흘러서 어디론가 전달되거나 저장되거나 해야함.
- CPU에서 프로세스 데이터와 주소들의 요소가 전달되는 길
- 레지스터, ALU, MUX, 메모리… 등의 모듈들이 연결되는 통로
- 우리는 MIPS datapath를 순차적으로 만들어 볼 것임.
- 개략도의 디자인을 좀 더 정제할 것임.
Fetching Instructions
- Instruction Memory로부터 instruction을 읽어 온다.
- 다음의 sequential한 instruction의 주소를 PC 값으로 업데이트 한다.
- PC는 모든 clock cycle마다 업데이트 되기 때문에, PC write 작업이 필요하지 않다.
- instruction memory에서 읽기는 combination activity이기 때문에, 명시적인 읽기 제어 신호가 필요하지 않다.
Decoding Instruction
- fetch된 instruction의 opcode, function field bits들을 control unit으로 전송한다.
- 또한 Register File로부터 두 개의 값을 읽는다.
- Register File 주소들은 instruction에 포함되어있다.
Executing R Format Operations
- R format operations ( add, sub, slt, and, or )
- rs, rt의 값에 대해서 연산(op 및 funct)을 수행한다.
- 결과를 Register File(rd)에 다시 저장
- Register File은 모든 cycle마다 write operation이 작동되지 않는다.
- 그렇기 때문에 Register File에 control signal을 write 해야한다.
Executing Load and Store Operations
- Load, Store operations
- 대상 레지스터에서 읽음(read)
- 16-bit의 offset을 이용하여 주소를 계산
- 주소 계산에 ALU를 사용
- ALU는 32-bit이기 때문에, 32-bit로 확장해서 사용.
- (offset은 -/+가 있으므로, sign-extend로 부호를 유지한 채 확장)
- Load: 메모리를 읽고, 레지스터를 업데이트 (메모리에서 레지스터로. 메모리 기준 read. 빠르게 쓰려고 불러오기)
- Store: 레지스터의 값을 메모리에 기록. (레지스터에서 메모리로. 메모리 기준 write. 영구용으로 저장)
Branch Instructions
- 대상 레지스터에서 읽음(read)
- 이 두 값을 비교
- 피연산자(operand)를 비교
- ALU를 사용. 두 개를 뺀 결과를 Zero와 검사하여 output을 발생시킴
- Zero와 같으면 뺀게 0이니, output은 1(같다)
- Zero와 다르면 뺀게 0이 아니니, output은 0(다르다)
- 점프한다면 대상 주소(target address)도 계산해야 함.
- I-format instruction의 address 부분에 담긴
- 16비트의 정보(displace 얼마나 위(+) 아래(-)로 움직일지)를
- 32비트로 확장하기 위해 sign-extend로.
- 그리곤 2번 shift left함(*4) (word(32-bit) displacement)
- 원래 PC + offset * 4 형태의 PC-relative addressing 방식임.
- 주소가 4-byte씩이니.. 즉, 위에서 구한건 몇 “칸”이지 몇 byte가 아니다.
- 계산된 결과를 PC에 더함(PC-relative addressing)
- 참고로, PC에는 이미 현재 명령어의 다음 주소인 PC+4 상태이므로 (instruction fetch에 이미 더해진), +4를 감안하여 주소를 계산한다.
Executing Jump Operations
- Jump operations은
- PC의 하단 28비트를 fetch된 instruction의 2-bit shift left된 하단 26비트로 교체합니다.
Creating a Single Datapath from the Parts
- 각 요소들을 통합하여 한 clock cycle에 동작할 수 있도록 한다.
- 한 clock cycle에 하나의 instruction만 실행한다.
- 각 datapath 요소는 한 번에 하나의 기능만을 수행할 수 있다.
- 그러므로, data memory와 instruction들을 분리해야 한다.
- (그렇지 않으면 하나의 명령어가 동시에 접근하려고 함)
- data source가 교차하는 곳에서는 multiplexor(MUX)를 사용하여 다른 instruction에 다른 경로로 대응할 수 있도록 한다.
R-Type/Load/Store Datapath
Full Datapath
The Main Control Unit
- control 신호는 instruction으로부터 얻어진다 (instruction에 의해 도출된다.)
Single Cycle Datapath with Control Unit
R-Type Instruction
R-type Instruction Data/Control Flow
Load Word Instruction Data/Control Flow
Branch Instruction Data/Control Flow
Implementing Jumps
- word address(직접 주소)를 사용한 점프
- concatenation(이어붙이기) 방식으로 PC(Program Counter)를 업데이트
- 26-bit의 address
- 위에 left shift를 두번하여 *4의 결과(28-bit)
- 현재 PC(Program Counter)의 상위 4비트를 뒤에 위를 합쳐서 (”old PC” & “address*4”), 총 32-bit
- opcode로부터 해석된(decode) 추가적인 control 신호(signal)이 필요하다.
Datapath With Jumps Added
Control Signal의 효과
Control
Control Function
Control Function Implementation
- 간단한 combinational logic
ALU Control
- ALU는 다음에 쓰인다.
- Load/Store: F = add
- Branch: F = subtract
- R-type: F는 funct field에 따라 다르다.
ALU control | Function |
0000 | AND |
0001 | OR |
0010 | add |
0110 | subtract |
0111 | set-on-less-than |
1100 | NOR |
- opcode로 부터 2-bit 부분(전체X)를 가져와서 ALUOp로 도출한다.
- combinational logic을 사용해서 ALU control을 만들어낸다.
OP code | ALU op | Operation | funct | ALU function | ALU control |
lw | 00 | load word | xxxxxx | add | 0010 |
sw | 00 | store word | xxxxxx | add | 0010 |
beq | 01 | branch equal | xxxxxx | subtract | 0110 |
R-type | 10 | add | 100000 | add | 0010 |
R-type | 10 | subtract | 100010 | subtract | 0110 |
R-type | 10 | AND | 100100 | and | 0000 |
R-type | 10 | OR | 100101 | or | 0001 |
R-type | 10 | set on less than | 101010 | set on less than | 0111 |