본문 바로가기

Background

R-Type

R-type은 RISC-V 아키텍처에서 레지스터 간의 연산을 수행하기 위한 기본적인 명령어 형식입니다. RISC-V 명령어 집합에서 산술 연산, 논리 연산, 시프트 연산, 비교 연산 등 여러 중요한 연산이 R-type으로 구현됩니다. R-type 명령어는 레지스터만을 사용하여 연산을 수행하며, 즉시값(immediate)을 사용하지 않습니다.

R-type 명령어의 구조

R-type 명령어는 다음과 같은 필드로 구성됩니다:

| funct7 | rs2    | rs1     | funct3  | rd      | opcode |

| 7 bits  | 5 bits | 5 bits | 3 bits   | 5 bits | 7 bits    |

 

각 필드의 역할은 다음과 같습니다:

  • funct7 (7 bits): 특정 연산의 종류를 지정하는 필드로, 연산을 세분화하는 역할을 합니다. 예를 들어, ADD와 SUB는 같은 opcode를 사용하지만, funct7 값으로 구분됩니다.
  • rs1 (5 bits): 첫 번째 소스 레지스터를 지정합니다. 이 레지스터는 연산에 사용될 첫 번째 피연산자를 담고 있습니다.
  • rs2 (5 bits): 두 번째 소스 레지스터를 지정합니다. 이 레지스터는 연산에 사용될 두 번째 피연산자를 담고 있습니다.
  • funct3 (3 bits): 연산의 세부적인 종류를 지정하는 필드입니다. 예를 들어, 산술 연산과 논리 연산, 시프트 연산 등을 구분하는 데 사용됩니다.
  • rd (5 bits): 연산 결과가 저장될 목적 레지스터를 지정합니다. 이 레지스터는 연산의 결과를 담게 됩니다.
  • opcode (7 bits): 명령어의 유형을 지정하는 필드입니다. R-type 명령어는 0110011이라는 고정된 opcode를 가집니다.

R-type 명령어의 예시

다음은 대표적인 R-type 명령어와 그 구조입니다:

  • ADD (덧셈 연산)
    • 두 레지스터의 값을 더하여 결과를 rd 레지스터에 저장합니다.
    • 구조: funct7 = 0000000, funct3 = 000, opcode = 0110011
    • 예: add rd, rs1, rs2
add x3, x1, x2  # x3 = x1 + x2
  • SUB (뺄셈 연산)
    • 첫 번째 레지스터 값에서 두 번째 레지스터 값을 빼서 결과를 rd 레지스터에 저장합니다.
    • 구조: funct7 = 0100000, funct3 = 000, opcode = 0110011
    • 예: sub rd, rs1, rs2
sub x3, x1, x2  # x3 = x1 - x2

 

  • SLL (Shift Left Logical, 논리적 좌측 시프트)
    • rs2의 하위 비트만큼 rs1의 값을 좌측 시프트하고, 결과를 rd에 저장합니다.
    • 구조: funct7 = 0000000, funct3 = 001, opcode = 0110011
    • 예: sll rd, rs1, rs2
sll x3, x1, x2  # x3 = x1 << x2

 

 

  • AND (논리적 AND 연산)
    • 두 레지스터의 값을 AND 연산하여 결과를 rd 레지스터에 저장합니다.
    • 구조: funct7 = 0000000, funct3 = 111, opcode = 0110011
    • 예: and rd, rs1, rs2
and x3, x1, x2  # x3 = x1 & x2

 

R-type 명령어의 동작 과정

  1. 명령어 디코딩:
    • CPU가 R-type 명령어를 디코딩할 때, opcode, funct3, 그리고 funct7 필드를 이용해 명령어의 종류를 판별합니다. 예를 들어, opcode가 0110011이고 funct3와 funct7 값에 따라 ADD, SUB, AND 등으로 구분합니다.
  2. 레지스터 접근:
    • rs1과 rs2 필드로 지정된 소스 레지스터들의 값을 읽어옵니다. 이 값들은 ALU(Arithmetic Logic Unit)로 전달되어 연산에 사용됩니다.
  3. 연산 수행:
    • ALU는 명령어의 종류에 따라 연산을 수행합니다. 예를 들어, ADD 명령어일 경우 두 레지스터의 값을 더하고, SUB일 경우 첫 번째 값에서 두 번째 값을 뺍니다.
  4. 결과 저장:
    • 연산의 결과는 rd 필드로 지정된 목적 레지스터에 저장됩니다. 이로써, R-type 명령어는 레지스터 간의 값을 읽고, 연산하고, 결과를 저장하는 일련의 과정을 마칩니다.

R-type의 특징과 장점

  • 일관된 형식: R-type 명령어는 고정된 형식을 가지므로, 디코딩과 실행이 간단하며 하드웨어 구현이 용이합니다.
  • 레지스터 간 연산 최적화: 메모리 접근 없이 레지스터 간 연산을 수행하므로, 속도가 빠르고 효율적입니다.
  • 확장성: 다양한 연산을 R-type으로 정의할 수 있으며, funct3와 funct7을 조합하여 다양한 명령어를 추가할 수 있습니다.

R-type의 설계 철학

RISC-V 아키텍처의 설계 철학은 단순함과 효율성을 강조합니다. R-type은 이러한 철학에 맞춰 설계되었으며, 간단한 형식을 통해 다양한 연산을 수행할 수 있도록 합니다. 레지스터 간의 연산에 최적화된 구조 덕분에 R-type은 CPU의 성능을 극대화하는 데 중요한 역할을 합니다.

결론

R-type 명령어는 RISC-V ISA의 중요한 구성 요소로, 레지스터 간의 다양한 연산을 수행하기 위해 설계되었습니다. 간단하고 일관된 형식을 가지고 있으며, 하드웨어 구현과 최적화에 유리합니다. 이를 통해 RISC-V 프로세서는 빠르고 효율적인 연산을 수행할 수 있으며, 다양한 연산을 유연하게 처리할 수 있습니다.

'Background' 카테고리의 다른 글

S-Type  (0) 2024.10.20
I-Type  (0) 2024.10.20
x28~x31(Temporaries) register  (0) 2024.10.20
x18-x27 (callee-saved) register  (0) 2024.10.20
x12-x17 (caller-saved) register  (0) 2024.10.20