지난 포스팅에서는 RV32I를 하드웨어와 소프트웨어라는 두 가지 관점에서 분류해 보았습니다. 이전 내용이 궁금하시다면 아래 글을 참고해주세요. 아울러 소프트웨어적 분류를 바탕으로 연재 중인 다른 포스팅들도 확인하실 수 있습니다.
https://idkihg.tistory.com/143
[RISC-V] RV32I ISA
RV32I ISA(Instruction Set Architecture)는 최소한의 명령어로 모든 계산을 수행한다는 RISC-V의 철학을 보여줍니다. 전체 명령어는 총 47개 뿐이며, 모든 명령어 길이는 32비트로 고정되어 있습니다. 1. 하드
idkihg.tistory.com
1) ISA Computation
https://idkihg.tistory.com/146
[RISC-V] RV32I ISA - Computation
지난 포스팅에서는 RV32I를 하드웨어와 소프트웨어라는 두 가지 관점에서 분류해 보았습니다. 이전 내용이 궁금하시다면 아래 글을 참고해주세요.https://idkihg.tistory.com/143 [RISC-V] RV32I ISARV32I ISA(Inst
idkihg.tistory.com
2) ISA Loads & Stores
https://idkihg.tistory.com/147
[RISC-V] RV32I ISA - Loads & Stores
지난 포스팅에서는 RV32I를 하드웨어와 소프트웨어라는 두 가지 관점에서 분류해 보았습니다. 이전 내용이 궁금하시다면 아래 글을 참고해주세요.https://idkihg.tistory.com/143 [RISC-V] RV32I ISARV32I ISA(Inst
idkihg.tistory.com
4) ISA Miscellaneous Instructions
https://idkihg.tistory.com/149
[RISC-V] RV32I ISA - Miscellaneous Instructions
지난 포스팅에서는 RV32I를 하드웨어와 소프트웨어라는 두 가지 관점에서 분류해 보았습니다. 이전 내용이 궁금하시다면 아래 글을 참고해주세요. 아울러 소프트웨어적 분류를 바탕으로 연재 중
idkihg.tistory.com
이번 글에서는 프로그램의 흐름을 결정짓는 핵심, Control Transfer 명령어들을 하나씩 파헤쳐 보겠습니다.
1. Control Transfer 명령어의 분류
RV32I의 Load & Store 명령어는 데이터를 읽어오는 I-Type과 데이터를 메모리에 저장하는 S-Type으로 나뉩니다. RISC-V는 오직 이 명령어들을 통해서만 메모리에 접근할 수 있는 'Load/Store 구조'를 가집니다.

✔ B-type(Conditional Branch): 조건이 맞으면 특정 주소로 점프합니다. (if문 역할)
- beq(branch equal)
- bne(branch not equal)
- blt(branch less than)
- bge(branch greater than or eqaul)
- bltu(branch less than unsigned)
- bgeu(branch greater than or eqaul unsigned)
✔ J-type(Unconditional Jump): 조건 없이 특정 주소로 점프하며, 돌아올 주소를 저장합니다.
- jal(jump and link): 함수를 호출할 때 사용(돌아올 주소를 rd에 저장)
✔ I-type(Unconditional Jump): 조건 없이 특정 주소로 점프하며, 돌아올 주소를 저장합니다.
- jalr(jump and link register): 레지스터에 저장된 주소로 점프
2. 조건 분기 (Conditional Branch)
비교 결과에 따라 PC값을 업데이트 합니다. RISC -V느 효율성을 위해 주소의 마지막 비트(0)을 생략하고 imm[12:1]만 인코딩 합니다. 종류는 beq, bne, blt, bge, bltu, bgeu 총 6가지 입니다. 아래는 조건 분기 명령어의 하드웨어 비트 필드 구조입니다.

- beq rs1, rs2, imm[12:1] => if(rs1 == rs2) pc += sign-extended(imm[12:0])
- bne rs1, rs2, imm[12:1] => if(rs1 != rs2) pc += sign-extended(imm[12:0])
- blt rs1, rs2, imm[12:1] => if(rs1 < rs2) pc += sign-extended(imm[12:0])
- bge rs1, rs2, imm[12:1] => if(rs1 >= rs2) pc += sign-extended(imm[12:0])
(unsigned comparison)*
- bltu rs1, rs2, imm[12:1] => if(rs1 < rs2) pc += sign-extended(imm[12:0])
- bgeu rs1, rs2, imm[12:1] => if(rs1 >= rs2) pc += sign-extended(imm[12:0])
(unsigned comparison)
*Unsigned comparison은 최상위 비트를 부호 비트로 생각하지 않고 비교하는 것을 의미합니다.
예를 들어 0b1000, 0b0100을 비교한다고 하면
signed comparison에서는 0b1000 < 0b0100이고
unsigned comparison에서는 0b1000 > 0b0100입니다.
3. 무조건 분기 명령어 (Unconditional Branch)
함수 호출과 복귀에 사용됩니다. 현재 PC + 4 주소를 rd에 저장하는 것이 특징입니다. 종류는 jal, jalr 2가지 입니다. 아래는 무조건 분기 명령어의 하드웨어 비트 필드 구조입니다.

- jal rd, imm[20:1] => x[rd] = pc + 4; pc += sign-extended(imm[20:1])
- jalr rd, imm[11:0](rs1) => t = pc + 4; pc = (sign-extended(x[rs1]+imm[11:0]))&(~1)**; x[rd] = t;
**계산된 주소의 최하위 비트(LSB)를 0으로 강제 변환하여 정렬을 맞춥니다.
RISC-V의 모든 명령어는 메모리에서 2바이트 또는 4바이트 단위로 정렬되어 있어야 하므로, 표준 RV32I에서 명령어 주소는 항상 짝수여야 합니다.
4. 요약 및 마무리
지금까지 RV32I의 메모리 접근 핵심인 Branch 명령어들을 살펴보았습니다.
- Conditional Branch: 조건과 반복문을 만듦
- Unconditional Branch: 함수의 구조를 만들 수 있음
이 명령어들이 있기에 위에서 아래로 흐르던 코드가 복잡한 로직을 가진 소프트웨어가 될 수 있습니다.
'RISC-V > RISC-V 개념' 카테고리의 다른 글
| [RISC-V] RV32I ISA - Miscellaneous Instructions (0) | 2026.03.12 |
|---|---|
| [RISC-V] RV32I ISA - Loads & Stores (0) | 2026.03.09 |
| [RISC-V] RV32I ISA - Computation (0) | 2026.03.08 |
| [RISC-V] RV32I ISA (0) | 2026.03.05 |
| [RISC-V] RV32I 레지스터 (0) | 2026.03.05 |