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 회로 작성이 끝난다. 여기서는 굳이 그림이나 표로 표현하지는 않겠다.
이 부분은 ALU Control이 아니라 전체적인 동작을 제어하는 메인 Control에 대해 알아본다. 아래 이미지는 4.3에서 보여준 전체 회로이다.
여기서 Control이라고 적혀있는 유닛이 우리가 다룰 Control이다. Instruction을 나타내는 비트 중에서 앞의 6 bit인 opcode를 입력으로 가진다. 많은 출력이 있는데 각 출력이 어디에 연결되는지를 주의깊게 보면서 하나씩 살펴보자.
beq
를 처리하는 데에 쓰이는데, ALU의 Zero가 1이고 Branch가 1이면 MUX에서 Branch 타겟 주소가 PC에 저장되고 그렇지 않으면 PC + 4가 PC에 저장된다.아래 표는 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 |
드디어 마지막 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에 추가되었다.
[컴퓨터 구조] 4.5 An Overview of Pipelining(2) (0) | 2020.10.26 |
---|---|
[컴퓨터 구조] 4.5 An Overview of Pipelining(1) (0) | 2020.10.26 |
[컴퓨터 구조] 4.3 Building a Datapath (0) | 2020.10.25 |
[컴퓨터 구조] 4.2 Logic Design Conventions (0) | 2020.10.25 |
[컴퓨터 구조] 4.1 Introduction (0) | 2020.10.25 |
댓글 영역