본문 바로가기
Computer/컴퓨터구조

[컴퓨터구조] Processor(3): 제어 유닛 (control unit)

by 거부기씨 2024. 6. 1.
728x90
반응형

앞의 글에서는 데이터패스를 간단히 구성해보았다. 

[컴퓨터구조] Processor(2): 데이터패스 만들기

 

[컴퓨터구조] Processor(2): 데이터패스 만들기

먼저 데이터패스를 설계해보자. 이것을 시작하기 위해 RISC-V 명령어 종류 각각을 실행하는 데 필요한 주요 구성 요소들을 살펴본다.첫 번째 구성 요소는 instruction memory이다. 프로그램의 명령어를

turtle2.tistory.com

여기서는 만든 데이터패스에 단순한 제어 기능을 추가해보자.

 

1. ALU 제어

먼저 RISC-V ALU를 제어하는 법을 살펴보자. 제어 입력 4개를 사용하는 4개의 조합이 정의되어 있다.

ALU 제어선 기능
0000 AND
0001 OR
0010 add
0110 subtract

 

ALU는 명령어의 종류에 따라 이 네 가지 기능 중 하나를 수행한다. 

 

  • 메모리 참조 명령어 (lw, sw) : 메모리 주소 계산 위해 add
  • R-type instructions : funct7, funct3 값에 따라 네 연산 중 하나 수행
  • 조건부 분기 명령어 (beq) : 두 피연산자에 대해 subtract

주 제어 유닛은 명령어 종류에 따라 ALUOp라 불리는 2비트 제어 필드를 생성한다. funct7, funct3, ALUOp 필드를 입력으로 하는 조그만 control unit에서 4비트 ALU 제어 신호를 발생시킨다.

 

해당 과정을 표로 정리해보자.

Instruction opcode ALUOp Funct7 Funct3 ALU action ALU control input
lw 00 xxxxxxx xxx add 0010
sw 00 xxxxxxx xxx add 0010
beq 01 xxxxxxx xxx subtract 0110
R-type (add) 10 0000000 000 add 0010
R-type (sub) 10 0100000 000 subtract 0110
R-type (and) 10 0000000 111 AND 0000
R-type (or) 10 0000000 110 OR 0001

 

lw, sw, beq의 경우 funct7, funct3 필드 값이 무엇이든 영향을 받지 않아 x로 표시하였다.

 

이렇게 주 제어 유닛이 ALUOp 비트를 생성하고 ALU 제어 유닛이 이것을 입력으로 받아 ALU를 제어하는 실제 신호를 만들어 내는 이러한 방식을 다단계 디코딩이라고 한다. 이런 다단계 제어를 사용하면 주 제어 유닛의 크기를 줄일 수 있고, 속도를 증가시킬 수 있다. 제어 유닛의 속도가 클럭 사이클 시간에 큰 영향을 미치는 경우가 많아 이러한 최적화는 중요하다.

 

위에 명시된 instruction opcode 이외에도 ALUOp, funct7, funct3에 따라 적절한 ALU 제어 신호가 생성된다. 이를 진리표로 나타내어 보았다.

 

진리표를 통해 R-type instruction에서는 funct7 필드의 비트 30, funct3 필드의 비트 14, 13, 12만을 고려함을 됨을 알 수 있다.

2. 주 제어 유닛 (Main control unit)

먼저 데이터패스에 필요한 명령어 필드를 알아보자. 네 종류의 명령어의 형식을 다시 살펴보자.

 

 

여기서 알 수 있는 몇 가지 사실은 설계하는 데에 중요한 기반이 된다.

  • 비트 6:0 : opcode
  • 비트 19:15(rs1) : R-type instruction과 분기 명령어의 첫 번째 레지스터 피연산자, 적재/저장 명령어의 베이스 레지스터
  • 비트 24:20(rs2) : R-type instruction과 분기 명령어의 두 번째 레지스터 피연산자, 저장 명령어에서 메모리에 저장될 레지스터 피연산자
  • 비트 11:7(rd) : R-type instruction과 적재 명령어의 목적지 레지스터
  • 12비트 변위에 분기, 적재, 저장 명령어의 다른 피연산자 하나가 들어 있다.

이제 제어선의 종류를 확인해보자.

ALU 제어 블록, 상태 소자용 쓰기 신호, 데이터 메모리용 읽기 신호, 멀티플렉서용 제어 신호를 보여준다. 설계한 데이터패스의 모든 멀티플렉서는 입력이 2개이므로 멀티플렉서의 제어 신호는 1비트이다. 위 그림에서는 ALUOp만 2비트이고, 나머지 6개의 제어선은 1비트이다.

 

ALUOp 제어 신호는 이미 앞에서 알아보았다. 나머지 제어선의 기능을 알아보자.

 

신호 이름 인가되지 않은 경우 (0) 인가된 경우 (1)
RegWrite   Write register가 지정하는 레지스터에 Write data 값을 쓴다.
ALUSrc Read data2가 ALU의 두 번째 피연산자가 된다. 12비트 변위가 부호확장된 값이 ALU의 두 번째 피연산자가 된다. 
PCSrc PC + 4가 새로운 PC값이 된다. 분기 목적지 주소가 새로운 PC값이 된다.
MemRead   Address가 지정하는 데이터 메모리 내용을 read data 출력으로 내보낸다.
MemWrite   Address가 지정하는 데이터 메모리 내용을 write data 입력값으로 한다.
MemtoReg ALU 출력이 레지스터의 write data 입력이 된다. 데이터 메모리 출력이 레지스터의 write data 입력이 된다.

 

그렇다면 이 제어선의 값들은 어떻게 설정하면 좋을까?

 

PCSrc를 제외하고는 opcode와 funct 필드만으로 결정할 수 있다. PCSrc는 명령어가 beq이면서 동시에 ALU의 Zero 출력이 참일 경우에만 인가된다. 즉, Branch 신호와 ALU의 Zero 신호의 AND 값이다.

 

각 opcode 값에 의해 결정되는 제어 신호의 값들을 진리표로 나타내 보았다.


3. 데이터패스의 동작

이제 제어 유닛의 논리 회로를 설계해보자. 

 

1) R-type instructions

 

2) 적재 명령어

 

3) 조건부 분기 명령어

 


지금까지는 단일 사이클을 가정하고 데이터패스를 설계하였다. 하지만 단일 사이클 설계에서는 클럭 사이클이 모든 명령어에 대해 같은 길이를 가져야 하기 때문에 비효율적이다. 즉, 클럭 사이클이 컴퓨터에서 가능한 경로 중 가장 긴 경로에 의해 결정된다.

 

앞으로는 단일 사이클 설계보다 훨씬 효율적인 멀티사이클 구현과 파이프라이닝 구현에 대해 알아보도록 할 것이다.

 

728x90
반응형