본문 바로가기

RISC-V/RISC-V 개념

[RISC-V] RV32I ISA - Control Transfer

 지난 포스팅에서는 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 명령어들을 살펴보았습니다.

  1. Conditional Branch: 조건과 반복문을 만듦
  2. 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