오늘은 I-Type에 이어 B-Type에 대해서 진행하겠습니다.
B-Type의 경우에는 비교 연산을 진행하도록 설계 되어 있습니다.
Register File에서 출력되는 두개의 RD1, RD2를 비교하여 조건에 맞다면 PC의 값에 imm값을 더하라고 설명 되어 있습니다.
그래서 저는 기존에 사용하던 ALU 모델이 비교를 위한 비교기를 넣어 비교를 한 후, 비교에 대한 결과로 1,0을 출력하도록 합니다.
1,0의 출력값은 곧 바로 PC에 4를 더해서 다음 주소지를 찾아주는 값과 imm의 Select 신호가 되도록 하였습니다.
그래서, 비교를 하여 조건이 맞다면 sel은 1이 되며 imm의 값이 PC와 함께 결합되어 최종적으로 ROM에 들어가고,
조건이 맞지 않다면 sel은 1이되며 pc값은 기존의 4가 더해져 ROM의 Addr로 들어가게 됩니다.
여기서 제가 조금 헤맸던 부분은 ALU를 통해 나온 연산 값이 기존의 Type들과 섞여서 출력되어 값이 안나오는 결과가 있었습니다. 이를 해결하기 위해, B-Type은 OPCode[6]은 모든 OPCode[6]과 다른 1값을 가지고 있어, 이 부분을 활용하여 B-Type에 대한 동작을 고유하게 동작할 수 있도록 구현하였습니다.
이 방법은 제가 만든 B-Type에 대한 방법입니다.
주요 코드는 다음 Github에서 확인하시면 감사하겠습니다!
Code_Verilog_SystemVerilog/workspace/250410_MCU_I-Type_prof/250410_MCU_I-Type_prof.srcs/sources_1/new at main · Heeju99/Code_Ve
Contribute to Heeju99/Code_Verilog_SystemVerilog development by creating an account on GitHub.
github.com
아래는 B-Type을 확인하기 위한 ROM의 Script 입니다.
ROM[5]를 보면, rs1 = x2(12) 와 rs2 = x2(12)의 값을 비교하게 되고. BEQ 동작이기 때문에 두 값이 동일하다면 PC+= imm의 결과를 나타냅니다. 그리하여, imm의 값이 8로 설정하였기 때문에 기존에 PC 값이 4씩 자동 증가했다면, ROM[5] 동작 후에는 PC의 값이 8 증가함을 나타낼 것입니다.
아래는 결과입니다.
ROM[5]만 수행했을 때, PC의 값이 0에서 8로 증가함을 볼 수 있습니다.
위에서 작성한 전체 ROM 스크립트를 수행한 결과 입니다. PC의 q (PC가 ROM에 보내는 다음 addr)을 보게 되면 B-Type의 비교 연산 후, imm의 값 (8 or 12) 또는 자동 증가 값인 4의 값만큼 증가하게 되는 것을 확인할 수 있습니다.
아래는 교수님의 방식입니다.
ALU 내부에서 비교 연산을 수행하도록 합니다. 비교의 결과를 btaken이라는 1비트 신호로 만들어 내게 됩니다. 또한, Branch라는 MUX Sel 신호를 만들어주어, btaken과 branch의 결과를 AND하여 자동으로 증가하는 PC + 4 값 또는 PC + imm 값을 Select하도록 합니다. 그래서, 최종 출력 PC로 들어가기 전 branch 신호에 대한 제어와 비교 연산으로 인한 두번의 검증을 거치게 됩니다.
교수님의 결과도 제가 했던 설계와 동일하게 나옵니다.
ROM[2]의 동작으로 PC값에 대해 branch를 내어 PC의 값을 5로 변경합니다. ROM[5]의 동작으로, Register file에 1의 값을 넣고, 다음 ROM[6]의 동작에서 1이라는 값을 2번 Shift하도록 설계 하였습니다.
이를 통해, btaken이라는 신호가 들어옴을 확인할 수 있고, PC값에 대한 branch에 대해서도 잘 이루어졌다고 확인할 수 있습니다.
과제로, B-Type에 이어 LUI, AUIPC도 설계하였습니다. LUI의 경우 rd = imm <<12, AUIPC는 rd = PC + (imm << 12)의 동작을 수행하게 됩니다. 두개의 동작이 매우 흡사하다는 것을 알 수 있고, 32bit의 데이터 형태도 동일함을 확인할 수 있었습니다.
그리하여, 저는 기존의 교수님의 Block Diagram에서 imm을 sel신호를 통해 shift 12 하거나 imm을 출력하는 MUX를 설계하였고, 이를 PC에 들어가기 전의 Adder에 물려주었습니다.
그래서 아래 그림의 1번이 shift << 12를 제어하여 출력하는 값이고, 2번이 shift << 12한 값을 PC에 더하여 출력하는 값 입니다.
이 두 값을, 기존에 register file의 Write Data로 들어가는 MUX에 추가하여 MUX를 확장하였습니다.
확장된 4x1 MUX에 대해 신호를 제어하여, 원하는 값을 출력할 수 있도록 하였습니다.
*설계와 테스트를 모두 끝내고 안 사실로는, 굳이 imm을 12shift 하기 위해 MUX를 사용할 필요가 없었습니다. 어차피 LUI와 AUIPC 모두 사용을 할 것이기 때문에, MUX를 통한 제어가 없어도 실행이 잘 됩니다.
이를 확인하기 위한 ROM Script입니다. ROM[7]과 ROM[8]의 동작을 수행하도록 하였습니다.
ROM[7]: Register File 7번지에 imm(1)을 왼쪽으로 12번 Shift 동작
ROM[8]: Register File 8번지에 imm(1)을 왼쪽으로 12번 Shift 동작하고 PC(36)을 더한 값을 저장하라
아래의 결과를 Binary로 확인하면, register file 7번지에는 최하위에 있던 1이 12번 왼쪽 Shift함을 확인할 수 있고,
register file 8번지에는 Binary로 나와있지만, Decimal로 확인하면 원하는 값이 잘 출력됨을 확인할 수 있었습니다.
Code_Verilog_SystemVerilog/workspace/250410_b-type_prof/250410_b-type_prof.srcs/sources_1/imports/new at main · Heeju99/Code_Ve
Contribute to Heeju99/Code_Verilog_SystemVerilog development by creating an account on GitHub.
github.com
'[HARMAN] 세미콘 아카데미 > SystemVerilog' 카테고리의 다른 글
[Harman 세미콘 아카데미] Day_51(System Verilog) (0) | 2025.04.16 |
---|---|
[Harman 세미콘 아카데미] Day_48(System Verilog) (0) | 2025.04.11 |
[Harman 세미콘 아카데미] Day_46(System Verilog) (0) | 2025.04.09 |
[Harman 세미콘 아카데미] Day_45(System Verilog) (0) | 2025.04.08 |
[Harman 세미콘 아카데미] Day_44(System Verilog) (0) | 2025.04.08 |