공부방/Verilog_vivado

CPU 설계 두 번째 발자국 RV32I_ISA : R, IL

맘스터치보단파파이스 2024. 6. 1. 16:56
R  - TYPE : RS1 , RS2 연산

 

ROM : Instruction Memory CPU_CORE를 동작시킬 명령어를 넣어주는 곳이다.

명령어를 넣어주고 PC를 통해 ROM의 주소값을 + 4  씩 해주면 ROM이 ROM[0] ROM[1] 씩 명령어를 출력한다.

ROM에서 보낸 명령어는 REG File과 CONTROL UNIT으로 들어간다.

 

RegisterFile : CPU의 기본값이 저장되어 있다.

 

Waddr로 주소를 지정한 위치에 RegFile[Waddr]로 값이 저장된다.

Rdata를 통해 지정된 RAddr에 맞는 RegFile[RAddr]이 출력된다.

 

CONTROL UNIT : 명령어가 들어왔을 때 OP, FUN3, FUN7로 INPUT되어 CPU를 동작시킨다. 

 

INPUT 된 OP, FUNT3, FUNT7 를 받아 regFileWe, AluSrcMuxSel, RFWriteDataSrcMuxSel, dataMemWe 로 OUPUT 한다. OP값에 따라 INSTRUCTION SET의 TYPE를 결정한다.

w_AluOP값인 controls의 뒷 두자리를 받아 case문 동작한다. 이는 ALU를 동작시키는 aluControl로 output한다.

funct3, funct7의 값을 추가로 확인하여 ALU를 동작시키는 코드를 전달한다.

 

 

R은 ALU를 통해 RAM의 addr로 입력된다.

R type는 rd = rs1 + rs2 등등 rd 값으로 들어간다.  rd는 RAM의 addr이다.

 

 

IL-TYPE : 

 

RAM을 추가하고 IL을 동작시킬 수 있게 회로를 추가했다.

ROM :

 

 

RegisterFile : .

 

 

 

CONTROL UNIT

 

IL이 추가되며 CONTROL_UNIT에서 필요한 코드만큼 증가시켰다.

IL을 사용하기 위해 MUX 두개와 RAM이 추가되었다. 

AluSrcMux와 RFSrcMux를 추가하여 ALU와 RegFile에 들어가는 입력이 두가지인 것을 하나만 선택하여 들어갈 수 있게 해주었다. 

 

R-TYPE  :

regFileWe는 동작해야하니 1을 항상 입력.

AluSrcMuxSel 은 RD1와 MUX로 들어가는 RD2 값을 사용하기 때문에 0 을 사용한다.

RFWriteDataSrcMuxSel 도 Alu에서 나온 값을 다시 WD로 넣었기 때문에 0을 사용한다.

dataMemWe는 RAM을 사용하지 않기 때문에 0을 입력한다.

1_0_0_0 까지 나오고 추가되는 _01은

이 always의 case를 동작시키기 위한 코드이다.

 

IL-TYPE

추가되는 IL의 경우 RAM의 rdata를 사용하고 RegFile에서 나오는 RD1, RD2가 바로 들어가지 않고 RD2가 I-TYPE에 맞게 바뀌어서 입력된다. 

AluSrcMuxSel =1  Extend 된 값을 받아 ALU에 넣기 위해 1.

RFWriteDataSrcMuxSeld = 1  RAM에서 나온 rdata를 사용하기 때문에 1.

dataMemWe = 0  RAM의 값은 수정하지 않기 때문에 0이 된다.

 

 

IL은 R과는 달리 imm 이 추가된 Extend를 추가한 기능이 들어가야하고 그에따라 다른값이 ALU에 들어가야한다. AluSrcMux를 통해 1이 들어가게 해준다.

IL은 rd = M[rs1 + imm] 이다. 

Simulation

 

 

ROM에서 나온 MachineCode에서 나온 코드를 통해 나온 OP,FUNC3,FUNC7에 의해 AluSrcMuxSel, RFWriteDataSrcMuxSel, dataMemWe를 출력시켜 CPU를 동작시킨다. 

ROM의 값에는 MachineCode가 적혀있다.

addr은 32bit를 받기 위해 4씩 증가하고 그에따라 data가 변화한다.

ROM에서 나온 data값은 machineCode로 받아 RegFile과 ControlUnint으로 들어간다.

RegFile에 저장된 값을 확인하여 값이 올바르게 나오고 있는지 확인한다.

원하는 명령어는

6에는 X4 +X5  //  9 = 4 + 5

7에는 X3 - X1  //  2 = 3 - 1

8에는 X1 & X2 // 0000 0000  = 0000 0001 & 0000 0010 

9에는 X1 | X2 // 0000 0011 = 3

10에는 4+ X1값의 주소를 넣는다.

 

'공부방 > Verilog_vivado' 카테고리의 다른 글

AXI4-Lite Read Address _ Read Data  (0) 2024.06.15
CPU 세번째 발자국 + I, S, B, U, J, JA  (0) 2024.06.01
CPU_설계 첫걸음.SV Register File & ALU  (0) 2024.05.30
FIFO.SV  (0) 2024.05.24
코드를 짜는 방식  (0) 2024.05.08