[CA] Chapter 6-1: Processor(1-1)
⚙ Computer Architecture 공부
DataPath 요소 -Instruction Fetching
프로세스가 작업을 수행하려면 어떤 명령어를 실행해야 하는지 알아야 함
- Instruction memory: 프로그램의 명령어들을 저장하는 memory unit
- address를 input으로 받으면, 해당 주소에 있는 instruction을 output으로 제공
- → 이 output이 메모리의 일부분(Text Segment)
- Program Counter ,PC: 현재 실행 중인 instruction의 address를 저장하는 register
- 프로세서는 PC가 가리키는 address의 instruction을 실행
- Adder: PC를 증가시켜 다음 명령어의 주소를 가리키도록 하는 logic
- 프로세스가 한 명령어를 실행한 후, 다음 명령어로 넘어가기 위해 필요
명령어의 크기가 4bytes(32bits)임을 알 수 있다
즉, 일반적으로 PC는 4씩 증가
✅DataPath 작동 과정:
- 명령어 가져오기(Fetch):
- PC가 가리키는 주소가 명령어 메모리에 전달됨
- 명령어 메모리는 해당 주소에 저장된 명령어를 출력
- PC Update
- 동시에, PC의 값은 Adder에 의해 4만큼 증가
- 증가된 값
PC+4는 다음 명령어의 주소를 나타냄 → 이 값이 다시 PC에 저장됨
DataPath Elements: R-type
📚R-type instruction: 두 개의 register를 읽음 → 읽은 내용에 대한 arithmetic(산술)/logical operation을 수행 → 결과를 register에 기록하는 명령어
Ex:
add,sub,and,or,sltetcRegister file: 프로세서의
32개 범용 register collection, CPU 내부에 있는 매우 빠른 임시 저장소Reading data: 두 개의 register number 입력(Read registers 1,2)을 받아서 해당 레지스터의 값 출력(Read data 1,2)Writing data: 쓸 레지스터 number(Write register)와 쓸 데이터(Write data)를 입력으로 받음- Writing은
control signal(RegWrite)에 의해 제어됨, 이 신호가 활성화(1)되어야 쓰기가 발생 - register input은
5bits wide(32개 레지스터를 나타내기 위함), data input/output buses는32bits wide
✅add 명령어 예시: add $t0, $t1, $t2
- 레지스터 파일은
$t1의 번호를Read register 1로 받고, 그 값을Read data 1으로 출력 - 동시에,
$t2의 번호를Read register 2로 받고, 그 값을Read data 2로 출력 ALU가 두 값을 더함- 결과는
Write data를 통해 레지스터 파일로 돌아오고,$t0의 번호는Write register로 지정됨 RegWrite 신호가 1로 설정되어, 결과 값이 $t0에 기록됨
ALU(Arithmetic Logic Unit)
ALU: 다양한 arithmetic/logic operation을 수행하는 장치
ALU 구조 및 기능
- Input
two 32-bit operands(피연산자)를 입력으로 받음- Control Signal:
4-bit control signal(ALU operation)가 ALU가 수행할 연산을 결정
- Output
32-bit result(ALU result)를 출력으로 생성- Zeor Flag: 결과가 0인 경우
1bits signal(참), 아닌 경우0bits signal(거짓)생성
그림 하단 표는 4bits ALU 제어 코드 및 연산기능
예를 들어 add연산이면 명령어 해독기가0010을 ALU control signal로 설정
DataPath Elements: Load/Store
load/store instruction: memory address를 계산하기 위해 base register와 명령어에 포함된 16bits offset field를 더함
- E.g.,
lw %t1, offset_value($t2)$t2값에 offset_value를 더한 주소에서 데이터를 읽어$t1에 저장
- E.g.,
sw %t1, offset_value($t2)$t1값을$t2값에 offset_value를 더한 주소에 저장
load/store instruction 계산 과정
- base register 값 읽기:
$t2의 값을 레지스터 파일에서 읽음
- offset 추출:
- 명령어에서 16bits offset value를 추출
- memory address 계산:
- ALU가 base register값과 offset을 더해 memory address 계산
$t2 + offset_value = memory address
lw와 sw 데이터 흐름 차이에 주의!!
lw- 계산된 주소의 메모리(
$t2)에서 데이터를 읽음 - 이 데이터를
$t1레지스터에 기록
- 계산된 주소의 메모리(
sw$t1레지스터에서 데이터를 읽음- 이 데이터를 계산된 주소의 메모리(
$t2)에 기록
✅ALU는 32bits operation을 수행하므로, 16bits offset도 32bits로 확장해야한다
Sign Extension Unit(부호 확장 유닛)
📚Sign Extension Unit: 16bits offset field를 32bits로 확장
✅작동 방식:
- 최상위 비트(부호 비트)가 0인 경우: 양수 값은 앞에 0을 채움
- 최상위 비트(부호 비트)가 1인 경우: 음수 값은 앞에 1을 채움
1
2
0XXXXXXXXXXXXXXX → 0000000000000000 0XXXXXXXXXXXXXXX
1XXXXXXXXXXXXXXX → 1111111111111111 1XXXXXXXXXXXXXXX
Data Memory
📚Data Memory: 실제 데이터를 저장하고 읽어오는 memory unit
- Interface:
Address: 계산된 메모리 주소를 입력으로 받음Read data: 주소에서 읽은 데이터를 출력Write data: 메모리에 기록할 데이터를 입력으로 받음
- Control Signal:
MemRead: 메모리 읽기 작업을 활성화하는 Control SignalMemWrite: 메모리 쓰기 작업을 활성화하는 Control Signal
DataPath 통합(R-type+Load/Store)
- Mux(Multiplexers): 여러 입력 중 하나를 선택하여 출력으로 내보내는 회로
ALUSrc Mux: ALU의 두 번째 입력이 레지스터 파일에서 오는지(0) 또는 Sign Extension Unit에서 오는지(1) 선택MemtoReg Mux: 레지스터 파일의 쓰기 데이터가 ALU 결과에서 오는지(0) 또는 데이터 메모리에서 오는지(1) 선택
✅Data flow control signal 정리:
ALUSrc: ALU의 두 번째 입력 선택 (0: 레지스터 값, 1: extensioned offset)MemtoReg: 레지스터에 쓸 데이터 선택 (0: ALU 결과, 1: 메모리에서 읽은 값)RegWrite: 레지스터 파일에 쓰기 작업 활성화MemRead: 데이터 메모리 읽기 작업 활성화MemWrite: 데이터 메모리 쓰기 작업 활성화
lw/sw 명령어 실행 과정
lw $t1, 100($t2)- 레지스터 파일에서
$t2의 값을 읽음 - 명령어에서 offset(100)을 추출
- Sign Extension Unit이 16bits offset을 32bits로 확장
- ALU가
$t2값과 확장된 offset을 더해 메모리 주소를 계산 - 계산된 주소를 데이터 메모리의 주소 입력으로 제공
MemRead신호가 활성화되어 메모리 읽기 작업을 수행- 데이터 메모리가 해당 주소의 데이터를 출력
- 이 데이터가 레지스터 파일의 Write data input으로 전달됨
RegWrite신호가 활성화되어 데이터가$t1레지스터에 기록됨
- 레지스터 파일에서
sw $t1, 100($t2)- 레지스터 파일에서
$t1(저장할 data),$t2(base register)의 값을 읽음 - 명령어에서 offset(100)을 추출
- Sign Extension Unit이 16bits offset을 32bits로 확장
- ALU가
$t2값과 확장된 offset을 더해 메모리 주소를 계산 - 계산된 주소를 데이터 메모리의 주소 입력으로 제공
$t1의 값을 데이터 메모리의 Write data input으로 제공MemWrite신호가 활성화되어$t1의 값이 계산된 메모리 주소에 기록됨
- 레지스터 파일에서
R-Type 명령어 실행 과정
add $t1, $t2, $t3
R-type 명령어 실행을 위한 Control Signal 설정
ALUSrc = 0: 레지스터 파일의 Read data 2를 ALU의 두 번째 입력으로 선택MemtoReg = 0: ALU 결과를 레지스터 파일의 쓰기 데이터로 선택
✅과정:
- 명령어 해독:
- 명령어가 R-type임을 식별
- 첫 번째 소스 레지스터(
$t2), 두 번째 소스 레지스터($t3), 목적지 레지스터($t1)를 식별 - ALU 연산을
add로 설정
- register value 읽기:
- 레지스터 파일에서
$t2값을Read data 1로 읽음 - 레지스터 파일에서
$t3값을Read data 2로 읽음
- 레지스터 파일에서
- ALU 연산:
ALUSrc = 0설정 → 두 번째 ALU 입력으로 레지스터Read data 2($t3 값)를 선택- ALU가 두 값(
Read data 1과Read data 2)을 더함 - 결과는
ALU result로 출력됨
- 결과 저장:
MemtoReg = 0설정 → ALU 결과를 레지스터 Wrtie data로 선택- RegWrite 신호가 활성화되어 결과 값이
$t1레지스터에 기록됨
❌R-타입 명령어 실행 중에는 다음 구성 요소들이 사용되지 않는다
Sign Extension Unit: R-Type Instruction은 immediate value을 사용하지 않음Data Memory: R-Type Instruction은 메모리 접근을 수행하지 않음
하지만 lw/sw는 레지스터 파일, ALU, Sign Extension Unit, 데이터 메모리 모두 사용!!





