본문 바로가기

Background

S-Type

S-type은 RISC-V 아키텍처에서 메모리 저장(store) 연산을 수행하기 위한 명령어 형식입니다. S-type 명령어는 레지스터의 데이터를 메모리에 저장하는 작업을 수행하며, 주로 변수나 배열의 값을 메모리에 쓰는 데 사용됩니다. 이 명령어는 메모리 주소를 계산하기 위해 **기준 레지스터(base register)**와 **즉시값(offset)**을 사용합니다.

S-type 명령어의 구조

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

css
코드 복사
| imm[11:5] | rs2     | rs1     | funct3 | imm[4:0] | opcode |
| 7 bits        | 5 bits  | 5 bits | 3 bits  | 5 bits      | 7 bits    |

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

  • **imm[11:5] (7 bits)**와 imm[4:0] (5 bits): 즉시값(immediate)의 상위 및 하위 비트를 나타냅니다. 이 두 필드는 합쳐져 12비트의 부호 확장된 offset으로 사용되며, 메모리 주소를 계산할 때 rs1 레지스터의 값에 더해집니다.
  • rs1 (5 bits): 기준 레지스터로, 메모리 주소 계산의 기준이 되는 레지스터입니다.
  • rs2 (5 bits): 저장할 데이터가 있는 소스 레지스터를 지정합니다. rs2에 있는 값이 메모리에 저장됩니다.
  • funct3 (3 bits): 연산의 종류를 지정하는 필드로, 주로 데이터 크기(예: 바이트, 하프워드, 워드)를 구분합니다.
  • opcode (7 bits): 명령어의 유형을 나타내는 필드로, S-type 명령어는 0100011이라는 고정된 opcode를 가집니다.

S-type 명령어의 특징과 장점

  • 효율적인 메모리 접근: S-type 명령어는 기준 레지스터와 offset을 사용하여 메모리 주소를 계산하므로, 메모리 공간을 효율적으로 사용할 수 있습니다. 기준 레지스터는 베이스 주소를 제공하고, offset을 통해 다양한 메모리 위치를 쉽게 참조할 수 있습니다.
  • 다양한 데이터 크기 지원: SB, SH, SW와 같은 다양한 명령어를 통해, 바이트 단위, 하프워드 단위(2바이트), 워드 단위(4바이트)의 데이터를 저장할 수 있어 메모리 접근의 유연성을 제공합니다.
  • 고정된 형식: RISC-V의 설계 철학에 따라, S-type 명령어는 고정된 형식을 가지고 있어 명령어 디코딩과 실행이 간단하며, 하드웨어 구현이 용이합니다.

S-type 명령어의 동작 과정

  1. 명령어 디코딩:
    • CPU가 S-type 명령어를 디코딩할 때, opcode와 funct3 필드를 통해 명령어의 종류(SB, SH, SW 등)를 판별합니다. 예를 들어, opcode가 0100011이고 funct3가 010이면, 이 명령어는 SW임을 알 수 있습니다.
  2. 메모리 주소 계산:
    • rs1 필드로 지정된 기준 레지스터의 값과, imm[11:0] 즉시값을 더하여 메모리 주소를 계산합니다. imm는 imm[11:5]와 imm[4:0]을 합쳐서 부호 확장(sign extension)됩니다.
  3. 데이터 저장:
    • rs2 필드로 지정된 소스 레지스터의 값을 메모리 주소에 저장합니다. 예를 들어, SW 명령어의 경우 rs2의 32비트 값을 메모리 주소에 저장하게 됩니다.

S-type 명령어의 제한

  • 단방향 접근: S-type 명령어는 **저장(store)**에만 사용되며, 데이터를 **로드(load)**하는 데는 사용할 수 없습니다. 데이터 로드를 위한 명령어는 I-type(LW, LH 등)을 사용해야 합니다.
  • 즉시값의 크기 제한: S-type은 12비트의 즉시값을 사용하므로, 메모리 주소 범위가 제한적일 수 있습니다. 큰 주소 범위를 다루기 위해서는 다른 명령어(U-type 등)와 결합하여 주소를 확장해야 합니다.

S-type 명령어의 예시

  • SB (Store Byte):
    • rs2의 하위 8비트를 메모리 주소(rs1 + offset)에 저장합니다.
    • 구조: funct3 = 000, opcode = 0100011
    • 예: sb rs2, offset(rs1)
sb x5, 4(x1)  # x5의 하위 8비트를 x1 + 4 주소에 저장

 

  • SH (Store Halfword):
    • rs2의 하위 16비트를 메모리 주소(rs1 + offset)에 저장합니다.
    • 구조: funct3 = 001, opcode = 0100011
    • 예: sh rs2, offset(rs1)
sh x5, 8(x1)  # x5의 하위 16비트를 x1 + 8 주소에 저장

 

 

  • SW (Store Word):
    • rs2의 32비트를 메모리 주소(rs1 + offset)에 저장합니다.
    • 구조: funct3 = 010, opcode = 0100011
    • 예: sw rs2, offset(rs1)
sw x5, 12(x1)  # x5의 32비트를 x1 + 12 주소에 저장

 

 

  • 변수 저장:
    • 함수가 로컬 변수를 메모리에 저장할 때, 기준 레지스터(sp 등)를 사용하여 변수가 저장될 메모리 주소를 계산하고, SW 명령어를 통해 데이터를 메모리에 기록할 수 있습니다.
sw x10, -4(sp)  # 스택 포인터 기준 -4 위치에 x10의 값을 저장

 

  • 배열 요소 업데이트:
    • 배열의 특정 요소를 업데이트할 때 기준 레지스터와 offset을 사용하여 배열의 인덱스에 해당하는 주소를 계산하고, 값을 저장할 수 있습니다.

 

sb x11, 0(x12)  # x12의 주소에 x11의 하위 8비트를 저장 (배열 요소 업데이트)

S-type의 설계 철학

S-type은 RISC-V의 간단함효율성을 강조한 설계를 반영합니다. 메모리 접근의 기준으로 레지스터와 즉시값을 사용하는 방식은 메모리 주소 계산을 단순화하고, 메모리 접근 시의 유연성을 제공합니다. 이를 통해 RISC-V는 다양한 메모리 연산을 간결하고 일관된 방식으로 처리할 수 있습니다.

결론

S-type 명령어는 RISC-V 아키텍처에서 메모리 저장 연산을 수행하는 핵심적인 명령어 형식입니다. 고정된 형식과 레지스터-즉시값 조합을 사용하여 메모리 접근의 효율성을 극대화하며, 다양한 데이터 크기를 유연하게 지원합니다. 이러한 특성 덕분에, S-type은 RISC-V의 단순하고 일관된 메모리 관리 구조를 구현하는 데 중요한 역할을 합니다.

'Background' 카테고리의 다른 글

U-Type  (0) 2024.10.20
B-Type  (0) 2024.10.20
I-Type  (0) 2024.10.20
R-Type  (0) 2024.10.20
x28~x31(Temporaries) register  (0) 2024.10.20