본문 바로가기

Background

B-Type

B-type은 RISC-V 아키텍처에서 조건부 분기(branch) 연산을 수행하는 명령어 형식입니다. B-type 명령어는 두 레지스터 값의 비교 결과에 따라 프로그램의 제어 흐름을 변경합니다. 이를 통해 조건문(예: if-else)이나 반복문(예: for, while)을 구현할 수 있습니다. B-type 명령어는 특정 조건이 만족될 때 지정된 오프셋만큼 점프하여 다른 명령어로 분기합니다.

B-type 명령어의 구조

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

| imm[12], imm[10:5] | rs2    | rs1     | funct3 | imm[4:1], imm[11] | opcode |
| 1 bit,       6 bits        | 5 bits | 5 bits | 3 bits  | 4 bits,      1 bit       | 7 bits    |

 

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

  • imm[12], imm[10:5], imm[4:1], imm[11]: **즉시값(immediate)**으로, 12비트의 분기 오프셋을 나타냅니다. 이 즉시값은 부호 확장(sign extension)되며, 현재 명령어의 PC(Program Counter)에 더해져 분기 주소를 계산합니다. 비트들이 분할되어 저장되며, 명령어 디코딩 시 결합됩니다.
  • rs1 (5 bits): 첫 번째 소스 레지스터입니다. 분기 조건을 평가할 때 사용되는 값 중 하나가 저장된 레지스터입니다.
  • rs2 (5 bits): 두 번째 소스 레지스터입니다. 분기 조건을 평가할 때 사용되는 두 번째 값이 저장된 레지스터입니다.
  • funct3 (3 bits): 분기 조건을 결정하는 필드입니다. 예를 들어, 두 값이 같은지, 다른지, 크거나 같은지 등을 판별합니다.
  • opcode (7 bits): 명령어의 유형을 나타내는 필드로, B-type 명령어는 1100011이라는 고정된 opcode를 가집니다.

B-type 명령어의 예시

B-type 명령어는 다양한 조건부 분기 명령어로 구성됩니다. 주요 B-type 명령어와 그 구조는 다음과 같습니다:

  • BEQ (Branch if Equal):
    • rs1과 rs2의 값이 같으면 지정된 오프셋만큼 분기합니다.
    • 구조: funct3 = 000, opcode = 1100011
    • 예: beq rs1, rs2, offset
beq x5, x6, label  # x5와 x6가 같으면 label로 분기

 

  • BNE (Branch if Not Equal):
    • rs1과 rs2의 값이 다르면 지정된 오프셋만큼 분기합니다.
    • 구조: funct3 = 001, opcode = 1100011
    • 예: bne rs1, rs2, offset
bne x5, x6, label  # x5와 x6가 다르면 label로 분기

 

 

  • BLT (Branch if Less Than):
    • rs1의 값이 rs2의 값보다 작으면 지정된 오프셋만큼 분기합니다 (부호 있음 비교).
    • 구조: funct3 = 100, opcode = 1100011
    • 예: blt rs1, rs2, offset
blt x5, x6, label  # x5가 x6보다 작으면 label로 분기

 

 

  • BGE (Branch if Greater or Equal):
    • rs1의 값이 rs2의 값보다 크거나 같으면 지정된 오프셋만큼 분기합니다 (부호 있음 비교).
    • 구조: funct3 = 101, opcode = 1100011
    • 예: bge rs1, rs2, offset
bge x5, x6, label  # x5가 x6보다 크거나 같으면 label로 분기

 

 

  • BLTU (Branch if Less Than, Unsigned):
    • rs1의 값이 rs2의 값보다 작으면 지정된 오프셋만큼 분기합니다 (부호 없음 비교).
    • 구조: funct3 = 110, opcode = 1100011
    • 예: bltu rs1, rs2, offset
bltu x5, x6, label  # x5가 x6보다 작으면 label로 분기 (부호 없음)

 

 

  • BGEU (Branch if Greater or Equal, Unsigned):
    • rs1의 값이 rs2의 값보다 크거나 같으면 지정된 오프셋만큼 분기합니다 (부호 없음 비교).
    • 구조: funct3 = 111, opcode = 1100011
    • 예: bgeu rs1, rs2, offset
bgeu x5, x6, label  # x5가 x6보다 크거나 같으면 label로 분기 (부호 없음)

 

B-type 명령어의 동작 과정

  1. 명령어 디코딩:
    • CPU는 B-type 명령어를 디코딩할 때, opcode와 funct3 필드를 사용하여 명령어의 종류(BEQ, BNE, BLT 등)를 식별합니다.
  2. 레지스터 값 비교:
    • rs1과 rs2로 지정된 소스 레지스터의 값을 읽어옵니다. ALU(Arithmetic Logic Unit)는 이 두 값의 비교를 수행하여 조건을 평가합니다.
  3. 분기 조건 확인:
    • 비교 결과가 명령어에 정의된 조건(funct3 값)에 맞으면, 즉시값(imm)을 부호 확장하여 PC(Program Counter)에 더합니다. 이를 통해 새로운 분기 주소로 점프합니다.
    • 조건이 맞지 않으면, PC는 단순히 다음 명령어로 이동합니다.

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

  • 조건부 제어 흐름 지원: B-type 명령어는 조건부 분기를 통해 프로그램의 제어 흐름을 동적으로 변경할 수 있습니다. 이를 통해 조건문, 반복문 등 다양한 제어 구조를 구현할 수 있습니다.
  • 효율적인 메모리 사용: B-type 명령어는 레지스터 간 비교와 짧은 분기만을 수행하므로, 메모리 사용이 적고 빠른 연산이 가능합니다.
  • 고정된 형식: B-type은 고정된 형식을 유지하여 하드웨어 디코딩이 단순하고, 명령어 실행이 일관되게 이루어집니다.

B-type 명령어의 활용 예시

  • 조건문 구현:
    • if-else 구조를 구현할 때, B-type 명령어를 사용하여 조건이 참일 경우 특정 코드 블록으로 분기하고, 거짓일 경우 다른 코드 블록으로 이동할 수 있습니다.
beq x5, x0, label_true  # x5가 0이면 label_true로 분기

 

  • 반복문 구현:
    • while 또는 for 루프를 구현할 때, B-type 명령어를 사용하여 조건을 평가하고 루프가 계속될지 종료할지 결정할 수 있습니다.
loop:
    addi x5, x5, -1  # x5 값을 감소
    bne x5, x0, loop # x5가 0이 아니면 loop로 다시 분기

 

B-type의 설계 철학

B-type은 RISC-V의 간단함유연성을 반영하여 설계되었습니다. 레지스터 간 비교를 통해 프로그램의 흐름을 제어할 수 있도록 하여, 프로그램이 다양한 분기 구조를 간단하게 표현할 수 있습니다. 또한, 고정된 형식으로 디코딩과 실행이 간단하여, 하드웨어 구현이 용이하고 성능이 최적화됩니다.

결론

B-type 명령어는 RISC-V 아키텍처에서 조건부 분기 연산을 수행하는 핵심적인 명령어 형식입니다. 레지스터 간의 비교 결과에 따라 프로그램의 제어 흐름을 변경할 수 있으며, 이를 통해 조건문과 반복문 같은 제어 구조를 구현할 수 있습니다. B-type은 고정된 형식과 간결한 조건 평가 방식을 통해 RISC-V의 성능과 효율성을 극대화하는 역할을 합니다.

'Background' 카테고리의 다른 글

J-Type  (0) 2024.10.20
U-Type  (0) 2024.10.20
S-Type  (0) 2024.10.20
I-Type  (0) 2024.10.20
R-Type  (0) 2024.10.20