지난 포스팅을 보지 않았다면 먼저 읽고 오자.
📚MIPS의 instruction들
MIPS의 명령어들은 다음 세가지 + jump 중 하나의 구조를 가지고 있다.
각 명령어의 필드와 일부 예시를 먼저 설명해보겠다.
R-type
필드
- opcode : 명령어의 종류를 나타내는 필드
- rs,rt,rd : 각각 source, source, destination 레지스터를 가리키는 필드
- sham : 시프트 연산 시 사용되는 시프트 횟수를 나타내는 필드
- funct : 명령어의 기능을 추가적으로 구체화해주는 필드
명령어 예시
- add
- subtract
- and
- or
- sll (shift left logical)
R-type의 모든 명령어는 연산 수행 결과를 rd 레지스터에 저장한다.
I-type (load/store)
필드
- opcode : Load의 경우 100011 (35) , Store의 경우 101011 (43) 이다.
- rs : 베이스 레지스터로, 타겟 메모리 주소는 rs의 값과 offset(address) 값을 조합하여 계산한다.
- rt :
- Load의 경우 타겟 메모리에서 데이터를 읽어와 rt 레지스터에 저장
- Store의 경우 rt 레지스터의 값을 타겟 메모리에 저장한다.
- address : 타겟 메모리 주소를 계산하기 위한 offset을 나타내는 필드. immediate 필드라고도 한다.
I-type (Branch)
필드
- opcode : 브랜치 명령어를 구분하는 역할
- rs : 조건을 평가할 source 레지스터
- rt : 조건에 따라 분기할지를 결정하는 타겟 레지스터
- address : 현재 명령어의 주소에 이 주소를 더해 분기 주소를 계산한다. 즉 offset
브랜치 명령어에 따라 rs, rt의 값이 조건에 맞는지 (크거나 같거나 작은지)를 판단하고,
조건에 맞을 경우 PC(현재 주소)에 offset을 더해 분기하고, 조건에 맞지 않을 경우 PC+4로 이동한다.
🛣️각 명령어 별 Datapath
R-type instruction
주어진 instruction : add t3 s1 s2
STEP
- 명령어를 PC에서 읽어오고 PC의 값을 4 증가시킨다.
- 두 레지스터 s1, s2를 레지스터 파일로부터 읽고, t3를 write address에 저장한다.
- ALU에서 Read Data1과 Read Data2를 통해 읽어들인 값에 대한 덧셈을 하여 t3에 저장할 값을 계산한다.
- ALU의 연산에서는 funct 코드를 사용하여 ALU 제어신호를 생성한다.
- ALU의 덧셈 결과는 메모리에 저장하지않고 바로 write data에 저장하고, write address에 기록한다.
- PC를 4 증가시킨다.
Load Word
주어진 instruction : lw t1 offset(s2)
STEP
- 명령어를 PC에서 읽어오고 PC의 값을 4 증가시킨다.
- 레지스터값 s2을 레지스터 파일로부터 읽는다.
- 레지스터값 t1을 write address에 저장한다.
- ALU는 Read Data 1을 통해 읽은 s2 값과 offset을 32비트로 확장한 값을 더해 메모리 주소를 구한다.
- 메모리에서 해당 주소에 존재하는 값을 write data에 저장한다.
- write address인 t1에 해당 값을 기록한다.
- PC를 4 증가시킨다.
주의할 점은, 목적지인 t1이 rt이고 메모리 주소 연산에 사용하는 s2가 rs이다.
Store Word
주어진 instruction : sw t1 offset(s2)
STEP
- 명령어를 PC에서 읽어오고 PC의 값을 4 증가시킨다.
- 레지스터값 t1,s2을 레지스터 파일로부터 읽는다.
- ALU는 Read Data 1을 통해 읽은 s2 값과 offset 값을 더해 메모리 주소를 계산한다.
- Read Data2에서 읽은 t1의 값을 3에서 계산한 메모리 주소에 기록한다.
- PC를 4 증가시킨다.
주의할 점은, 목적지 메모리 연산에 사용하는 s2가 rs이고, 값을 나타내는 t1이 rt 이다.
Branch instruction
주어진 instruction - beq t1, t2, offset
STEP
- 명령어를 PC에서 읽어오고 PC의 값을 4 증가시킨다.
- 두 레지스터 t1, t2를 레지스터 파일로부터 읽는다.
- ALU에서 Read Data1과 Read Data2를 통해 읽어들인 값에 대한 뺄셈을 하여 분기 여부를 결정한다.
- 이후 offset을 32비트로 확장한 뒤 shift left 2 연산을 수행하고, PC+4와 더해서 분기할 주소를 계산한다. (shift left 2를 하는 이유는 메모리 주소는 4의 배수로 계산되는데, 하위 2비트는 주소연산에서 필요가 없으므로 0으로 채워준다. 이렇게 함으로서 jump연산으로 나타낼 수 있는 범위가 더 커지게 된다.)
- ALU의 연산 결과를 zero로 출력하여 PC+4와 새로 구한 분기주소중 어느 것을 PC에 저장할 지 결정한다.
'🖥️CS > 📗컴퓨터구조' 카테고리의 다른 글
[CA] - 시스템 버스(Bus)란? (0) | 2024.06.14 |
---|---|
[CA] - MIPS의 Datapath 이해하기 (0) | 2023.06.16 |