Semiconductor, Embedded/0. RTL, Synthesis, PnR, Simulation

컴퓨터 구조 및 CPU 동작 원리 (3) - 32 Bit RISC CPU(Pipeline) Simulation 분석

잇(IT) 2024. 10. 17. 15:02

https://insoobaik.tistory.com/719

 

컴퓨터 구조 및 CPU 동작 원리 (3) - 32 Bit RISC CPU(Pipeline) RTL 설계

https://insoobaik.tistory.com/717 컴퓨터 구조 및 CPU 동작 원리 (1) - 기본 개념목차컴퓨터의 구성요소 5가지Absractions and ISADefining PerformanceInstruction SetMIPS Arithmetic OperationRegister OperandsMemory OperandsImmediate Ope

insoobaik.tistory.com

RTL 설계에 이어서 Simulation 분석을 해 볼 것이다.


Schematic

빨간색은 D/FF Reference를 포함한 InstMem, Control, RegFile, ALUControl, ALU, DataMem와 같이 실제 동작을 위한 Module에 해당한다.

파란색은 Pipelining을 위해 Data를 저장하기 위한 D/FF에 해당한다.


Simulation 분석

 

Control

input으로 들어오는 Instruction의 상위 6bit를 보고 각 opcode의 Type에 맞게 ALUOp[1:0] 2bit를 포함하여 각 FLAG의 값을 0 또는 1로 지정한다.


Registers

Registers Module의 경우 Data Memory를 통해 값을 저장하거나 불러오게 된다.

 

특정 Address의 Data Memory의 값을 불러오거나 저장하기까지 Address의 주소가 Registers -> Data Memory -> Registers까지 전달하는데 3개의 D/FF를 거쳐 전달된다.

Simulation을 보게되면 3번의 Clock Edge가 발생한 뒤 Address 값이 전달되어 해당 Memory에 있는 값이 output으로 출력되는 것을 확인할 수 있다.

addi r1,r0,1
addi r2,r0,2
addi r3,r0,3
addi r4,r0,4
		
add r5,r0,r1
add r6,r1,r2
add r7,r2,r3
add r8,r3,r4

sw r5,1(r0)
sw r6,2(r1)
sw r7,3(r2)
sw r8,4(r3)

CPU에서 위의 8단계의 명령어를 실행 시키는 Code의 Simulation을 확인해보게 되면

(노란색) Opcode에 맞게 R-Type, LW, SW, addi, andi가 결정된다.

 

처음 (노란색) Opcode에 의해 addi 명령어가 4번 실행되게 되면, 3번의 D/FF를 거쳐서 Address가 전달되고, rt(Target)에 값이 저장된 것을 확인 할 수 있다.

 

두번째 (노란색)  Opcode에 의해 R-Type add 명령이 실행되게 되면 (보라색) rt(Target)의 Memory의 값이 계산되어 결과가 저장되어 있는 것을 확인할 수 있다.

 

위와 같이 D/FF가 추가된 만큼 Latency가 증가되었지만 1 Clock 당 Throughput 또한 증가한 것을 확인할 수 있다.


ALUControl

ALUControl Module은 input으로 전달받은 ALUOp(R-Type, LW, SW...), opcode, funct를 기반으로 ALU Module에 실제 연산 명령을 전달하는 Module이다.

 

ALUOp, opcode, funct의 값이 변경되어도 현재 Instruction Memory에 있는 명령들은 대부분 add이기 때문에 ALUCtrl은 00(add)값을 output로 내보낸다.

 

...
mem[17]={6'h04,5'd5,5'd9,-16'd18};		 //beq r5,r9,-72 //goto 0
...

하지만 빨간색 네모와 같이 Branch에 의해 PC 값이 특정 위치로 옮겨질 때 01(sub) 명령어를 보내는 것을 Simulation을 확인할 수 있다.


ALU

ALU Module의 경우 간단하게 전달받은 명령어 (add, sub, and...)를 기반으로 source1, source2를 연산한다.

 

ALUCtrl이 0인 경우 현재 add이기 때문에 result를 통해 add한 결과가 나오는 것을 확인할 수 있다.

 

result가 0인 경우 zero 신호가 High가 되고, 이 신호는 Branch를 위한 신호에 해당한다.


 

Data Memory

Data Memory Module의 경우에도 단순하게 MemRead, MemWrite Flag 신호에 맞게 동작한다.

 

MemWrite Flag가 High일 경우 전달받은 Address에 Data를 저장하게 되고, ReadData는 Write 상태이기 때문에 x를 output으로 전달한다.

MemRead Flag가 High일 경우 전달받은 Address의 Data를 ReadData( output)을 통해 Data Memory에 저장된 값을 전달한다.

Data Memory Module까지 Address가 전달되어 출력된 Data의 경우 Registers Module의 Write Data 값으로 다시 전달되어 계속해서 CPU 내부에서 연산되어 값을 계산하게 된다.

 

전체 대략적인 Simulation은 위와 같다.

728x90