본문 바로가기
지식/컴퓨터아키텍쳐

Single-Cycle Processor(2)

by 칙칙폭폭 땡땡 2025. 10. 16.
반응형

ALU

N비트의 A oeprand와 N비트의 B operand를 받아 N비트의 reuslt를 출력한다.

ALUContorl 시그널을 외부에서 줘서 ALU의 동작을 우리가 바꿀 수 있다.

이 값에 따라서 위에 제시된 표의 연산을 수행한다.

add

add인 경우 ALUControl이 000이다.

그래서 Sum에서 A를 그대로 받고 B에 달려있는 Mux에서도 ALUControl 의 LSB가 0이기 때문에 B를 그대로 받는다.

또한 여기에 ALUControl의 LSB를 다시 더하는데 이 값은 0이기 때문에 결과적으로 그냥 A와 B를 더한다.

subtract

이 경우에는 ALUControl의 값이 001이다.

그래서 Sum에서는 A를 그대로 받아 더하고 ALUControl의 LSB가 1이기 때문에 B의 비트들을 모두 반전시킨 후, 여기에 ALUControl의 LSB인 1를 더하면서 B까지 더한다.

B의 비트들을 모두 반전시킨 후 1을 더했기 때문에 이는 B를 2의 보수를 했다고 생각할 수 있다.

그래서 A와 B를 뺄 수 있다.

and, or

and의 경우 단순히 A의 N비트와 B의 N 비트들을 각 자리마다 and 연산을 해준 뒤, N 비트를 출력한다.

or도 마찬가지도. 각 자리마다 or연산을 해준 뒤. N 비트를 출력한다.

SLT

이 상황은 set less than이다.

일단 돌아가는 방식은 subtract와 유사하다.

ALUControl의 LSB가 1이기 때문에 일단 A와 B를 뺀다고 할 수 있다.

그 다음에 [N-1]번 비트를 확인한다.

비트는 0번부터 N-1번까지 있기 때문에 [N-1]번 비트는 sign bit다.

이 값을 ZeroExt(Zero Extension)해서 결과를 반환한다.

제로 익스텐션은 만약에 [N-1]번 비트가 1이었으면 앞에 모든 비트들을 0으로 채운 것을 말한다.

반대도 마찬가지다.

ALUControl signal 만들기

ALUDecoder는 func3, func7, ALUOp를 조합해서 구체적으로 어떤 ALU 연산을 해야 하는지 결정한다.

ALUOP는 MainDecoder에서 결정된다. MainDecoder가 opcode만 보고 큰 틀의 연산을 구분한다.

Instruction 종류
opcode
ALUOp[1:0]
의미
Load / Store
0000011 / 0100011
00
무조건 ADD (주소 계산용)
Branch
1100011
01
비교 연산용 (SUB 등)
R-type (ALU)
0110011
10
funct 필드 기반으로 결정
기타 (e.g. LUI, JAL 등)
다양
00 or X
상황에 따라 다름

Single-Cycle Process Control

여기서는 다양한 예시를 통해서 컨트롤 유닛의 값들이 어떻게 결정되는지 알아본다.

lw

lw는 I-type이다.

ALUControl의 값은 add 인 상황이기 때문에 000이 된다.

그리고 ImmSrc는 I-type의 경우 00이다.

Instruction Memory를 거치면서 instruction이 부분 별로 쪼개진다. 그래서 rs1은 A1, rd는 A3로 들어간다.

또한, ImmSrc가 00이기 때문에 아래 표와 같은 방식으로 ImmExt를 해석한다.

이렇게 만든 ImmExt는 ALU의 Mux에 들어가는데 이때 ALUSrc는 1이 된다.

ALU의 SrcA는 rs1에 존재하는 레지스터의 주소 값(베이스 주소)이 들어가고, SrcB에는 ImmExt가 들어간다

ALU에서는 offset은 ImmExt만큼 베이스에서 이동한 주소 값을 내보낸다.

이때는 메모리에 쓰는 상황은 아니므로 MemWrite은 0이다.

그 다음 이 값을 rd에 저장해야 한다.

여기서 ResultSrc의 값은 1이 되고 이 result를 WD3에 입력으로 전달한다.

Register에 write 해야하기 때문에 RegWrite은 1이 되고, 클락이 라이징 엣지가 되면 비로소 값이 rd에 WD3에서 입력받은 값이 저장된다.

마지막으로 instruction의 수행을 마치면 다음 명령줄로 이동해야 한다.

이때는 점프나 분기를 하지 않았다.

따라서 PCSrc는 0이 된다.

sw

sw는 S-type이다.

ALUControl의 값은 lw에서와 마찬가지로 add인 상황이기에 이 값은 000이다.

그리고 ImmSrc의 값은 01이다.

rs1의 값은 베이스 주소로 A1으로 들어와서 읽은 주소 값을 RD1으로 내보낸다.

rs2의 값은 저장할 값이다. 이 값은 A2로 들어와서 읽은 값을 RD2로 내보낸다.

그리고 오프셋의 경우에는 ImmSrc가 01이기 때문에 위 표를 따라서 extension된다.

ALUSrc의 값은 1이 되어야 하고, ImmExt값을 베이스 주소와 더하는 작업을 ALU에서 수행한다.

결과적으로 저장할 주소를 지정하게 된다.

Data Memory에서는 저장할 주소를 ALU로부터 A에 받고, Register File을 통해 WD로 받는다.

이때는 메모리에 write 해야 하기 때문에 MemWrite이 1이 된다.

그리고 ResultSrc는 사용하지 않기 때문에 dont care

마지막으로 instruction의 수행을 마치면 다음 명령줄로 이동해야 한다.

이때는 점프나 분기를 하지 않았다.

따라서 PCSrc는 0이 된다.

R-type

R-type은 어떤 연산이냐 에 따라서 ALUControl 값이 달라진다.

그리고 R-type의 경우 ImmSrc가 dont care다.

rs1은 A1, rs2는 A2, rd는 A3로 입력되고, RD1은 rs1에서 주소에 있는 값, RD2에는 rs2에서 주소에 있는 값이 출력된다.

이때는 값을 더하는 상황이기 때문에 ALUSrc은 0이다.

ALUResult는 더한 값이므로 Data Memory를 거치지 않고 WD3로 바로 들어가도록 한다.

여기서 MemWrite은 메모리에 쓰지 않으므로 0, ResultSrc는 0이된다.

WD3에서는 값을 받았고, RegWrite을 1로 하여 레지스터에 값을 write한다.

그럼 클락이 라이징 엣지 되면서 값이 작성된다.

마지막으로 instruction의 수행을 마치면 다음 명령줄로 이동해야 한다.

이때는 점프나 분기를 하지 않았다.

따라서 PCSrc는 0이 된다.

beq

여기서는 rs1과 rs2에 있는 값을 비교하여 분기하는 작업을 수행한다.

beq의 경우 B-type으로 ImmSrc는 10이다.

그리고 내부 작업에서 빼기 연산을 하기 때문에 ALUControl의 값은 빼기인 001이다.

rs1의 값은 A1으로 들어가서 RD1으로 나온다.

rs2의 값은 A2로 들어가서 RD2로 나온다.

이때 두 레지스터에서 읽은 값을 사용하므로 ALUSrc의 값은 0이된다.

ALU에서는 이 두 값을 빼기 연산한다.

후에는 값이 0인지 확인하는 작업으로 분기 여부를 결정한다.

Zero이면서 Branch인 경우 PCSrc의 값이 1이된다.

그래서 다음 주소는 Imm필드의 값과 현재 주소인 PC의 값을 더해서 결정된다.

그리고 레지스터에 write하는 작업은 없었기 때문에 RegWrite은 0이다.

또한 MemWrite은 하지 않으므로 0, ReusltSrc는 사용하지 않으므로 dont care다.

jal

jal의 경우 beq와 비슷하지만 약간 다르다.

우선 컨트롤 유닛에 새로운 부분이 추가된다.

점프는 조건 없이 점프하므로 기존의 조건과 or로 PCSrc를 결정한다.

그리고 점프의 경우 ImmSrc를 새롭게 정한다.

점프의 경우에는 위 표에서 볼 수 있듯이 11로 지정한다.

먼저 처음에는 다음 명령줄의 주소를 rd에 저장해야 한다.

다음 명령줄의 주소값은 PC+4에 의해 결정되었으므로, 이 값을 사용하기위해 ResultSrc가 10일 때라고 지정해준다.

이 값은 WD3로 들어가고 RegWrite을 1로 하여 rd에 저장되도록 한다.

이제 imm을 통해 ImmExt를 계산하고 이 값을 현재 주소인 PC에 더한다.

점프이기 때문에 PcSrc는 1이다.

그리곤 이 주소를 PCNext로 설정한다.

여기서 ALU는 사용하지 않았기 때문에 ALUSrc랑 ALUControl은 dont care다.

그리고 메모리에 write 하지 않았으므로 MemWrite 값은 0이다.

 

반응형

'지식 > 컴퓨터아키텍쳐' 카테고리의 다른 글

Single-Cycle Processor(1)  (0) 2025.10.16
Arithmetic for Computers(2)  (0) 2025.10.16
Arithmetic for Computers(1)  (0) 2025.10.16
Machine Language  (0) 2025.10.16
Instructions(3)  (0) 2025.10.07