Load 명령어 실행 과정
레지스터 파일은 프로세서에서 레지스터를 저장하는 저장소입니다. 각 명령어를 실행할 때 CPU는 레지스터 파일에 접근하여 데이터를 읽거나 씁니다.
Load 명령어는 메모리에서 데이터를 읽어와 레지스터에 저장하는 작업을 수행합니다. 이 과정에서 Register File에 두 번 접근하게 됩니다.
1. 첫 번째 접근
- load 명령어는 메모리 주소값이 저장된 레지스터를 읽어야 합니다.
- Register File에서 해당 레지스터를 읽는 것이 첫 번째 접근입니다.
2. 두 번째 접근
- 메모리에서 읽어온 데이터를 Register File의 특정 레지스터에 저장해야 합니다.
- 이 과정에서 Register File에 다시 접근하여 데이터를 씁니다.
다른 유닛들은 1번 접근하는 반면 Register File에는 2번 접근하게 됩니다. Instruction Memory 같은 경우에도 1번 접근하며 ALU도 1번, Data memory도 1번 접근하지만 Register File은 데이터의 읽기와 쓰기 모두 필요하기에 2번 접근합니다.
Load 명령어에서 각 유닛 순서
1. Instrucion Memory
- CPU가 프로그램 명령어를 가져오기 위해 Instruction Memory로 접근합니다.
- load $t0, 4($t1) 에서 메모리에서 $t1+4 주소를 데이터에서 읽어와 $t0에 저장하는 과정을 생각
2. Register File & Sign-Extend
- Register File : 메모리 주소 계산을 위해 기준 주소가 저장된 레지스터 값을 읽습니다.
- 명령어에 포함된 16비트의 offset을 32비트로 확장합니다.
3. ALU
- ALU를 사용해 기준 주소와 확장된 offset을 더하여 메모리 주소를 계산합니다.
- 계산된 결과는 메모리 주소입니다.
4. Data Memory
- 계산된 메모리 주소로 Data Memory에 접근하여 데이터를 읽어옵니다.
5. Register File
- Data memory에서 읽어온 데이터를 Register File의 목적 레지스터에 저장합니다.
- Instruction Memory에서 명령어를 읽음
- Register File에서 base 주소를 읽고, Sign-Extend를 통해 offset을 확장
- ALU에서 메모리 주소를 계산
- Data Memory에서 데이터를 읽음
- Register File에 데이터를 저장
MUX
MUX는 여러 개의 입력 중 하나를 선택해서 출력하는 장치입니다. 여기서 MUX는 두 개의 입력이 연결되어 있다고 가정합니다.
a : Register File에서 나온 또 다른 레지스터의 값
b : Sign-Extend된 즉시 값(immediate)
MUX는 특정 명령어에 따라 a(레지스터의 값), 혹은 b(immediate)를 고를지 결정해야 합니다.
immediate가 필요한 경우는
addi가 대표적으로 볼 수 있습니다.
addi $t1, $t2, 10 같은 경우 $t1에 $t2 + 10을 저장하는 것입니다. 여기서 $t2는 Register File에서 가져온 값이고 10은 명령어에 직접 적혀 있는 즉시값입니다.
add 같은 경우 a에 속합니다.
add $t1, $t2, $t3 는 $t1에 $t2 + $t3를 저장합니다. 이 두 값 모두 Register File에서 나오기에 a를 선택합니다.
bne $t1, $t2, offset
이 명령어의 경우 $t1과 $t2가 다를 경우 프로그램의 실행 위치가 바뀝니다. $t1과 $t2모두 register file에서 온 값이기에 a를 선택합니다.
store
sw $t1, 4($t2)
이거 같은 경우 $t1값을 메모리 주소 $t2 + 4에 저장합니다. 메모리 주소를 저장하려면 4 (즉시값)이 필요하기에 이 같은 경우도 immediate 경우라고 볼 수 있습니다.
정리: 명령어 분류
add, sub, and, or | a (레지스터 값) | 레지스터 값 | add $t1, $t2, $t3 |
bne, beq | a (레지스터 값) | 레지스터 값 | bne $t1, $t2, offset |
addi, andi, ori | b (즉시값) | Sign-Extend 값 | addi $t1, $t2, 10 |
load (lw), store (sw) | b (즉시값) | Sign-Extend 값 | lw $t1, 4($t2) |
PC 값에 대한 설명
PC(Program Counter)란?
- PC는 현재 실행 중인 명령어의 주소를 저장하는 레지스터
- CPU가 다음에 실행한 명령어를 가져오기 위해서 PC값 업데이트 해야함
- 일반적으로 PC + 4 수행
명령어를 실행한 후, 대부분의 PC는 현재 명령어 위치에서 다음 명령어의 위치로 이동합니다. 모든 명령어는 다음 주소로 이동하기 위해 PC+4를 계산합니다
.
bne, beq는 조건이 참일 때 PC+4 + EXTEND * 4한 값으로 이동합니다.
Jump의 경우 절대적 점프 명령어로 pc의 상위 4비트와 명령어의 26비트 jump target을 합쳐 계산됩니다. Jump Target값은 명령어 안에 포함된 값으로, 2비트 왼쪽으로 쉬프트되어 실제 점프할 주소를 만듭니다.
jr의 경우는 레지스터에 저장된 값을 pc로 사용하는 명령어로 jr $ra 즉 레지스터의 값으로 pc가 설정됩니다.
RegWrite
RegWrite 란?
- RegWrite는 CPU의 ControlUnit에서 생성되는 신호입니다.
- 이 신호가 1이면 레지스터 파일에 데이터를 쓰기할 수 있습니다.
- 이 신호가 0이면 레지스터 파일에 데이터를 쓰지 않습니다.
레지스터 파일에 값을 저장해야 하는 명령어들에서만 RegWrite는 활성화됩니다. 즉 이런 명령어에는 Load명령어와 R-type 명령어 즉 (add, sub) 명령어 등이 있습니다.
RegWrite가필요 없는 것은 레지스터에 값을 쓰지 않는 명령어로 store같은 경우 메모리에 저장하는 것이므로 데이터를 쓰지 않으므로 0입니다. 또한 Branch(bne, beq) 명령어도 값을 비교하는 것이므로 레지스터에 저장하지 않으니 사용하지 않습니다. 또한 Jump 명령어도 사용하지 않습니다.
명령어 종류RegWrite 신호설명
load | 1 | 메모리 값을 레지스터에 저장. |
R-type | 1 | 연산 결과를 레지스터에 저장. |
store | 0 | 데이터를 메모리에 저장하므로 레지스터 쓰기 없음. |
branch (bne, beq) | 0 | 조건만 확인하므로 레지스터 쓰기 없음. |
jump (j, jr) | 0 | 점프만 수행하므로 레지스터 쓰기 없음. |
즉 RegWrite는 load, R-type 일때 실행된다고 생각하시면 됩니다.
제어신호
제어 신호는 cpu의 Control Unit에서 생성되어 명령어의 종류에 따라 데이터의 흐름과 동작을 결정합니다. R-type 명령어는 레지스터 연산을 수행하는 명령어로, 제어 신호가 이에 맞게 설정됩니다.
MemWrite
메모리에 데이터를 쓰기 위해 사용됩니다.MemWrite는 store명령어에서만 활성화됩니다. R-type에서는 메모리를 전혀 사용하지 않으므로 MemWrite는 0입니다.
MemRead
이는 메모리를 읽기 위해서 사용되며 load 명령어 (lw)에서만 사용됩니다.
ALUSrc : ALU의 두 번째 입력을 선택하는 신호
- R-type 명령어에서는 두 입력이 모두 레지스터 값
- 따라서 ALUSrc = 0(레지스터 값 선택)으로 결정됩니다.
PCSrc : 다음 명령어 주소를 선택하는 신호
- R-type 명령어는 분기(branch)나 점프(jump)를 수행하지 않으므로, 기본적으로 PC+4가 선택됩니다.
- 따라서 PCSrc : 0이 설정됩니다.
제어신호 R-type 명령어
RegWrite | 1 | 결과값을 레지스터에 저장하기 위해 활성화. |
ALUSrc | 0 | ALU 입력으로 레지스터 값을 선택. |
MemWrite | 0 | 메모리를 쓰지 않으므로 비활성화. |
MemRead | 0 | 메모리에서 읽지 않으므로 비활성화. |
PCSrc | 0 | 기본적으로 PC + 4를 선택. |
MIPS 명령어별 제어 신호 정리
명령어 | MemRead | MemWrite | RegWrite | ALUSrc | PCSrc | Branch | Jump |
R-type | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
lw (Load) | 1 | 0 | 1 | 1 | 0 | 0 | 0 |
sw (Store) | 0 | 1 | 0 | 1 | 0 | 0 | 0 |
beq (Branch if Equal) | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
bne (Branch if Not Equal) | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
j (Jump) | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
jal (Jump and Link) | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
addi (Immediate Add) | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
subi (Immediate Subtract) | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
Store instruction의 동작 과정
store 명령어는 레지스터 두 개의 값을 읽어야 합니다. 하나는 기준 주소로 사용될 $t2와 같은 값이고 다른 하나는 메모리에 저장할 값으로 사용될 $t1 같은 레지스터 값입니다.
따라서 store 명령어는 두 개의 레지스터 값을 읽어야 하므로, 하나의 레지스터 값만 읽는 것은 잘못된 것입니다.
ALU는 기준 주소와 오프셋을 더하여 실제 메모리 주소를 계산합니다.
데이터 메모리에 register에서 읽은 값 저장하는 것도 옳은 것입니다. store 명령어는 계산된 주소에 레지스터에서 읽은 값을 메모리에 저장합니다. .
16-bit-offset을 32-bit으로 확장하기 (sign-extension) : store 명령어에서 오프셋은 16-bit 상수로 주어지기 때문에, 이를 32-bit 확장하여 주소 계산에 사용합니다.
ALU 동작과정
먼저 R-type 명령어는 function field에 의해서 연산 종류가 결정됩니다.
load 와 store에서는 ALU는 주소 계산을 위해 덧셈을 수행합니다.
예 ) lw $t0, 4($t1) 같은 경우 $t1에 4를 더하여 메모리 주소를 계산합니다.
beq bne : 뺄셈 사용
beq와 bne 명령어에서는 ALU는 두 레지스터 값을 빼는 연산을 수행하여 그 결과 0인지 아닌지 확인합니다. beq는 두 값이 같을 때 분기하고, bne이 두 값이 다를 대 분기합니다.
예시
beq $t0, $t1, label
- 동작: $t0와 $t1의 값을 비교하여 같으면 label로 분기합니다.
- ALU 연산: ALU는 $t0 - $t1을 수행하고, 결과가 0이면 분기합니다.
예시 1:
- $t0 = 5, $t1 = 5일 경우:
- ALU는 5 - 5 = 0을 계산합니다.
- 결과: 두 값이 같으므로 분기가 발생합니다.
예시 2:
- $t0 = 10, $t1 = 5일 경우:
- ALU는 10 - 5 = 5를 계산합니다.
- 결과: 두 값이 다르므로 분기하지 않습니다.
slti : 뺄셈
slti 명령어에서는 주어진 즉시값과 레지스터 값을 빼서 음수이면 1, 아니면 0을 수행합니다.
예) slti $t0, $t1, 5는 $t1-5가 음수이면 $t0에 1을 저장합니다.
MIPS 프로세서 R-format instruction
R-format instruction
연산을 수행하는 명령어로 보통 산술 연산이나 논리 연산을 포함합니다. add, sub, and, or 같은 명령어들이 R-format에 해당합니다. 연산에 필요한 두 개의 레지스터 값을 읽고, 그 결과를 레지스터 파일에 다시 저장하는 형태입니다.
R-format에서는 두 개의 레지스터 값을 읽어서 산술/논리연산을 수행합니다.
ALU를 이요하여 두 레지스터 값을 산술 / 논리 연산을 하며 ALU에서 연산된 결과를 목표 레지스터에 저장됩니다.
R-format은 데이터 메모리에 접근하지는 않습니다. 메모리에 접근하는 것은 load나 store에서 하는 것으로 R-format에서는 레지스터에 접근하는 기능은 없습니다.
'IT 프로그래밍 > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] (0) | 2024.12.18 |
---|---|
[컴퓨터구조] Processor1 (0) | 2024.12.17 |
[컴퓨터구조] Dapapath (1) | 2024.12.11 |
[컴퓨터구조] CPU 구조 (0) | 2024.12.11 |
[단국대 강의] MIPS 컴퓨터 구조 instruction (0) | 2024.09.29 |