상세 컨텐츠

본문 제목

[컴퓨터 구조] 4.4 A Simple Implementation Scheme

전공/컴퓨터 구조

by blacksmith16 2020. 10. 26. 13:18

본문

ALU Control

MIPS의 ALU는 4 bit Control 입력에 따라 어떤 연산을 할 지 결정한다.

ALU Control Function Instruction 예시
0000 AND and
0001 OR or
0010 add lw, sw, add
0110 subtract sub, beq
0111 set-on-less-than slt
1100 NOR

위 표는 4 bit Control 신호에 따른 ALU 연산과 어떤 Instruction에서 그 연산이 사용되는 지를 정리한 것이다. 이 4 bit 신호는 ALU Control이라는 유닛에서 결정한다.

opcode(Instruction) ALUOp Instruction 연산 Funct field ALU 연산 ALU Control
LW 00 load word XXXXXX add 0010
SW 00 store word XXXXXX add 0010
Branch equal 01 branch equal XXXXXX subtract 0110
R-type 10 add 100000 add 0010
R-type 10 subtract 100010 subtract 0110
R-type 10 AND 100100 AND 0000
R-type 10 OR 100101 OR 0001
R-type 10 set on less than 101010 set on less than 0111

ALU Control는 Control로부터 ALUOp라는 2 bit 신호를 입력으로 가지고 그 입력에 따라 위 표의 ALU Control에 해당하는 4 bit 값을 ALU에게 넘겨준다. Control에서는 opcode의 종류에 따라 ALUOp를 생성한다. 이 때 LW와 SW의 ALUOp가 00으로 동일한 것은 어차피 ALU에서는 같은 연산을 하므로 굳이 구분할 필요가 없기 때문이다. 그리고 R-type은 000000으로 opcode가 동일하므로 ALUOp로 10을 넘겨준 다음, ALU Control에서 funct 필드를 읽어 어떤 R-type 명령인지 해석한 다음 ALU 연산을 결정한다.

ALU Control 동작을 구현하는 회로를 작성하려면, 입력값인 ALUOp에 따른 4 bit 출력을 진리표로 만든 다음 카르노맵을 통해 각 출력 비트에 맞는 논리식을 얻을 수 있다. 그 식을 논리 게이트로 배치하면 ALU Control 회로 작성이 끝난다. 여기서는 굳이 그림이나 표로 표현하지는 않겠다.

Control

이 부분은 ALU Control이 아니라 전체적인 동작을 제어하는 메인 Control에 대해 알아본다. 아래 이미지는 4.3에서 보여준 전체 회로이다.

여기서 Control이라고 적혀있는 유닛이 우리가 다룰 Control이다. Instruction을 나타내는 비트 중에서 앞의 6 bit인 opcode를 입력으로 가진다. 많은 출력이 있는데 각 출력이 어디에 연결되는지를 주의깊게 보면서 하나씩 살펴보자.

  • RegDst : Registers 유닛의 Write Register 입력을 결정하는 MUX에 연결되어 있다. 이 비트가 0이면 Write Register로 Rt를 사용한다는 의미이며, 1이면 Rd를 사용한다는 뜻이다.
  • RegWrite : Registers 유닛에 직접 연결되어 있다. 이 비트가 1이면 Write Register에 Write Data를 저장하는 동작을 수행하며, 0이면 저장하지 않는다.
  • ALUSrc : ALU의 두 입력 중 하나를 결정하는 MUX에 연결되어 있다. 이 비트가 0이면 Rt의 값을 ALU의 피연산자로 사용하고, 1이면 즉시값을 Sign Extend한 값을 사용한다.
  • Branch : PC에 저장될 주소를 결정하는 MUX와 연관되어 있으며, 이 비트가 0이면 PC + 4가 PC에 저장된다. 그리고 Branch와 연결된 AND 게이트는 beq를 처리하는 데에 쓰이는데, ALU의 Zero가 1이고 Branch가 1이면 MUX에서 Branch 타겟 주소가 PC에 저장되고 그렇지 않으면 PC + 4가 PC에 저장된다.
  • MemRead : Data Memory에 연결되어 있으며, 이 비트가 1이면 입력 주소의 값을 메모리에서 읽어 오고 0이면 읽지 않는다.
  • MemWrite : Data Memory에 연결되어 있으며, 이 비트가 1이면 입력된 메모리 주소에 Write Data 입력값을 저장하고 0이면 저장하지 않는다.
  • MemtoReg : Registers의 Write Data를 결정하는 MUX에 연결되어 있으며, 이 비트가 1이면 메모리에서 읽은 값이 Write Data로 들어가고 0이면 ALU 연산 결과가 들어간다.
  • ALUOp : 위에서 설명함

아래 표는 Instruction의 종류에 따라 Control 출력이 어떻게 되어야 하는지 나타낸 것이다. X는 상관 없음을 뜻한다. 왜 이렇게 되어야 하는지는 각 Instruction의 동작을 생각해본다면 쉽게 이해할 수 있을 것이다.

Instruction RegDst ALUSrc Memto- Reg Reg- Write Mem- Read Mem- Write Branch ALUOp1 ALUOp0
R-format 1 0 0 1 0 0 0 1 0
lw 0 1 1 1 1 0 0 0 0
sw X 1 X 0 0 1 0 0 0
beq X 0 X 0 0 0 1 0 1

Implementing Jumps

드디어 마지막 Instruction인 j 명령어를 지금까지 만든 회로에 추가할 시간이다. j는 J-Format Instruction이라서 앞의 6 bit(opcode)를 제외한 나머지 26 bit는 주소값을 나타낸다. Branch 명령어와의 공통점은 주소가 Word Address이기 때문에 Shift Left 2를 하여서 맨 뒤에 00 비트를 추가해준다는 것이다. 그렇지만 차이점은 beq의 주소는 offset(현재 PC 값에서 더해서 진짜 주소 계산)이지만 j의 주소는 그 값이 곧 메모리 주소라는 것이다.
하지만 진짜 메모리 주소는 32 bit가 되어야 하는데, J-Format에서는 26 bit 값을 입력받고 Shift 한 것까지 생각하면 총 28 bit라서 4 bit가 부족하다. 그래서 j에서는 (PC + 4)에서 왼쪽 4 bit를 그대로 가져와 남은 4 bit를 채운다. 이러한 점 때문에 j 명령어는 Branch 명령보다는 더 넓은 범위를 오갈 수 있지만 (PC + 4)와 앞 4 bit가 같은 영역으로 점프 가능 범위가 제한된다.
이런 특성을 반영하여 j를 회로에 추가하면 아래 이미지와 같다.

Shift를 하기 위한 유닛과 PC에 들어갈 수 있는 값이 하나 더 추가되었기 때문에 MUX 하나를 더 넣었고 이를 제어하기 위한 Jump가 Control에 추가되었다.

관련글 더보기

댓글 영역