본문 바로가기

Background

I-Type

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 명령어의 동작 과정

  1. 명령어 디코딩:
    • CPU는 I-type 명령어를 디코딩할 때, opcode, funct3 필드를 사용해 명령어의 종류를 판별합니다. 예를 들어, opcode가 0010011이고 funct3가 000이면 ADDI 명령어임을 알 수 있습니다.
  2. 레지스터 및 즉시값 접근:
    • rs1 필드로 지정된 소스 레지스터의 값을 읽고, imm[11:0] 필드에 있는 즉시값을 부호 확장하여 ALU(Arithmetic Logic Unit)로 전달합니다.
  3. 연산 수행:
    • ALU는 rs1 값과 부호 확장된 즉시값을 사용해 산술, 논리 연산을 수행하거나, 메모리 접근의 경우 rs1 + imm으로 주소를 계산합니다.
  4. 결과 저장:
    • 연산 결과는 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