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