I-type은 RISC-V 아키텍처에서 레지스터와 즉시값(immediate)을 사용하는 연산을 수행하기 위한 명령어 형식입니다. I-type 명령어는 즉시값을 피연산자로 사용하여 산술, 논리, 메모리 접근 및 제어 흐름 등 다양한 작업을 수행합니다. I-type은 RISC-V 명령어 집합에서 매우 중요한 부분을 차지하며, 프로그램의 효율성과 간결성을 극대화하는 역할을 합니다.
I-type 명령어의 구조
I-type 명령어는 다음과 같은 필드로 구성됩니다:
| imm[11:0] | rs1 | funct3 | rd | opcode |
| 12 bits | 5 bits | 3 bits | 5 bits | 7 bits |
각 필드의 역할은 다음과 같습니다:
- imm[11:0] (12 bits): 즉시값을 나타내는 필드로, 12비트의 값을 사용하여 레지스터와의 연산을 수행합니다. 부호 확장(sign extension)을 통해 음수와 양수 모두 표현할 수 있습니다.
- rs1 (5 bits): 첫 번째 소스 레지스터를 지정합니다. 이 레지스터는 연산의 피연산자 또는 메모리 주소의 기준이 됩니다.
- funct3 (3 bits): 연산의 종류를 지정하는 필드입니다. 산술, 논리 연산, 메모리 접근 등을 구분하는 역할을 합니다.
- rd (5 bits): 연산 결과가 저장될 목적 레지스터를 지정합니다.
- opcode (7 bits): 명령어의 유형을 지정하는 필드입니다. I-type 명령어는 다양한 opcode를 가질 수 있으며, 각 명령어의 종류에 따라 다릅니다.
I-type 명령어의 예시
다양한 I-type 명령어와 그 구조는 다음과 같습니다:
- ADDI (Add Immediate):
- rs1의 값에 즉시값을 더하여 rd에 저장합니다.
- 구조: funct3 = 000, opcode = 0010011
- 예: addi rd, rs1, imm
addi x5, x1, 10 # x5 = x1 + 10
- SLTI (Set Less Than Immediate):
- rs1의 값이 즉시값보다 작으면 rd에 1을, 그렇지 않으면 0을 저장합니다.
- 구조: funct3 = 010, opcode = 0010011
- 예: slti rd, rs1, imm
slti x5, x1, 20 # x5 = (x1 < 20) ? 1 : 0
- ORI (OR Immediate):
- rs1의 값과 즉시값을 논리 OR 연산하여 rd에 저장합니다.
- 구조: funct3 = 110, opcode = 0010011
- 예: ori rd, rs1, imm
ori x5, x1, 0xF # x5 = x1 | 0xF
- LW (Load Word):
- 즉시값과 rs1을 더한 주소에서 32비트 데이터를 로드하여 rd에 저장합니다.
- 구조: funct3 = 010, opcode = 0000011
- 예: lw rd, offset(rs1)
lw x5, 4(x1) # x5 = Memory[x1 + 4]
- JALR (Jump And Link Register):
- rs1 + 즉시값의 주소로 점프하고, 현재 PC + 4를 rd에 저장합니다.
- 구조: funct3 = 000, opcode = 1100111
- 예: jalr rd, imm(rs1)
jalr x1, 8(x2) # x1 = PC + 4, PC = x2 + 8
I-type 명령어의 동작 과정
- 명령어 디코딩:
- CPU는 I-type 명령어를 디코딩할 때, opcode, funct3 필드를 사용해 명령어의 종류를 판별합니다. 예를 들어, opcode가 0010011이고 funct3가 000이면 ADDI 명령어임을 알 수 있습니다.
- 레지스터 및 즉시값 접근:
- rs1 필드로 지정된 소스 레지스터의 값을 읽고, imm[11:0] 필드에 있는 즉시값을 부호 확장하여 ALU(Arithmetic Logic Unit)로 전달합니다.
- 연산 수행:
- ALU는 rs1 값과 부호 확장된 즉시값을 사용해 산술, 논리 연산을 수행하거나, 메모리 접근의 경우 rs1 + imm으로 주소를 계산합니다.
- 결과 저장:
- 연산 결과는 rd 필드로 지정된 목적 레지스터에 저장되거나, 메모리 접근 명령어의 경우 해당 레지스터에 데이터를 로드하여 저장합니다.
I-type의 특징과 장점
- 즉시값 지원: I-type 명령어는 레지스터와의 연산에서 즉시값을 사용하므로, 메모리를 참조하지 않고도 빠르게 연산을 수행할 수 있습니다.
- 다양한 연산 지원: I-type은 산술 연산, 논리 연산뿐만 아니라, 메모리 로드 및 제어 흐름 명령어(JALR) 등 다양한 연산을 지원하여 유연성을 제공합니다.
- 고정된 형식: RISC-V의 설계 철학에 맞춰 I-type은 고정된 형식을 사용하여 디코딩과 실행이 간단하며, 하드웨어 구현이 용이합니다.
I-type의 설계 철학
I-type은 RISC-V의 단순함과 효율성을 극대화하기 위한 설계입니다. 레지스터와 즉시값을 활용하여 메모리 접근 없이 빠르게 연산을 수행할 수 있도록 하고, 다양한 명령어를 유연하게 정의할 수 있는 구조를 가집니다. 특히, 레지스터 기반 연산과 메모리 접근 명령어를 일관된 형식으로 처리할 수 있어, CPU의 구현과 최적화가 간단해집니다.
결론
I-type 명령어는 RISC-V 아키텍처에서 즉시값을 사용한 연산과 메모리 접근, 제어 흐름 처리를 담당하는 핵심적인 명령어 형식입니다. 고정된 형식과 부호 확장을 통해 다양한 연산을 지원하며, 프로그램의 효율성과 단순성을 유지합니다. 이를 통해 RISC-V는 CPU의 성능을 극대화하고, 코드의 일관성을 유지하며, 하드웨어 설계를 간소화할 수 있습니다.
'Background' 카테고리의 다른 글
| B-Type (0) | 2024.10.20 |
|---|---|
| S-Type (0) | 2024.10.20 |
| R-Type (0) | 2024.10.20 |
| x28~x31(Temporaries) register (0) | 2024.10.20 |
| x18-x27 (callee-saved) register (0) | 2024.10.20 |