RV32I - 비교기

손은상·6일 전

RISC-V

목록 보기
4/5

RV32I의 각 B-type 종류 구현 방식을 정리한다.

Input : rs1, rs2 (32비트)
output : branch_flag (1비트)

1-1 BEQ

논리식 : rs1==rs2

구현 과정

  1. result=rs1-rs2 계산

  2. result의 포함된 비트를 서로 모두 OR 연산한다.

  3. 만약 result=0 이면 모든 비트를 or했을때 0이 도출될 것임.

  4. 만약 result =1 이면 모든 비트를 or 했을 때 1이 도출될 것임.

  5. 이후 result에 부정을 취해 1이면 True, 0이면 False

	branch_flag=~(|(rs1-rs2);

1-2 BNE

논리식 : rs1!=rs2

구현 과정
BEQ 과정과 동일하게 계산 후 Branch_flag에 not 연산을 추가한다.
1. result=rs1-rs2 계산
2. result의 포함된 비트를 서로 모두 OR 연산한다.
3. 만약 result=0 이면 모든 비트를 or했을때 0이 도출될 것임.
4. 만약 result =1 이면 모든 비트를 or 했을 때 1이 도출될 것임.

  1. 위 결과를 flag에 저장한다.
	branch_flag=(|(rs1-rs2);

2-1 BLT

논리식 : rs1 < rs2

구현 과정

  1. result = rs1-rs2 계산
  2. result가 overflow 되었을 수도 있음으로 계산
  3. overflow를 고려해 MSB 계산

Signed 연산시 Overflow 발생 조건


1. rs1 : 양(MSB=0), rs2 : 양(MSB=0)
이때 result의 MSB가 1이면 overflow 발생함.

2. rs1 : 음(MSB=1), rs2 : 음(MSB=1)
이때 result의 MSB가 0이면 overflow 발생함.

overflow = (rs1[31]==rs2[31]) && (result[31]!=rs1[31])
3. 따라서 branch_flag는 다음과 같이 구분할 수 있다.
branch_flag = result[31]^overflow

2-2 BGE

위 BLT 계산 결과에 부정을 취한 값.

branch_flag = ~(result[31]^overflow)

3-1 BLTU

부호를 신경쓰지 않으니 그냥 result의 MSB로 branch_flag 결정

  1. result = rs1-rs2
  2. branch_flag = result[31]

3-2 BGEU

BLTU에 부정을 취한다.

  1. result = rs1-rs2
  2. branch_flag = ~result[31]
profile
1렙 대학생

0개의 댓글