책/컴퓨터 구조

컴퓨터 구조 Ch04_"The Processor-2"

RyoTTa 2021. 1. 6. 02:03
반응형

4.4 단순한 구현

 4.3 의 데이터패스에 단순한 제어기능을 추가하여 단순한 구현을 만들고자 한다.

 LDUR, STUR, CBZ, ADD, SUB, AND, ORR 을 포함한 LEGv8의 부분집합을 구현한다.

 

 ALU 제어

제어입력 4개를 사용하는 6개 연산

  LDUR, STUR 경우에는 메모리 주소를 계산하기 위한 덧셈용으로 ALU를 사용

  R-type 명령어 경우에는 명령어 비트 11비트 opcode 필드값에 따라서 4가지 연산(AND, OR, SUB, ADD)중 하나를 수행

  CBZ 명령어의 경우 ALU는 레지스터 입력값을 그냥 통과시킨다.

 

  명령어의 opcode 필드와 ALUOp라 불리는 2비트 제어필드를 입력으로 ALU 제어 입력을 발생시킨다.

  ALUOp 가 10 일때에는 opcode 값이 ALU 제어 입력을 결정하는데 쓰인다.

ALUOp 및 opcode로 결정되는 ALU 제어신호

  이러한 제어값들은 각 값들의 진리표(truth table)을 이용하여 제작한다.

명령어 형식

  R-type 명령어는 세개의 레지스터를 가지며 Rn, Rm은 근원지 레지스터, Rd는 목적지 레지스터를 나타낸다.

  Load/Store 명령어는 두개의 레지스터를 가지며 Rn은 베이스 레지스터로 9비트 주소필드와 더해져 메모리 주소를 생성한다, Load 일때 Rt 레지스터는 값을 저장할 목적지 레지스터, Store 일때 Rt 레지스터는 근원지 레지스터이다.

  Branch 명령어는 하나의 레지스터 값을 가지며 Rt 레지스터는 0인지 아닌지 검사할 근원지 레지스터이다. 

 

 주 제어 유닛의 설계

 

멀티플렉서와 제어선의 추가

  opcode와 2비트 신호를 제어 입력으로 ALU를 어떻게 설계하는가에 대해 설명했다.

  이제는 나머지 제어 유닛의 설계를 살펴보도록 한다.

 

  위 그림에서 필요한 명령어 필드와 제어선을 알아내는 것으로 과정을 시작하겠다.

  1. opcode 필드는 폭이 6bit or 11bit 로 31:26 or 31:21에서 찾을 수 있다.

  2. 첫 번째 레지스터 피연산자는 9:5에 존재한다. R-type에서는 근원 레지스터, Load/Store 에서는 베이스 레지스터

  3. 다른 레지스터 피연산자는 R-type에서는 20:16에 존재, Load, CBZ  에서는 4:0, 따라서 멀티플렉서를 추가해야한다.

  4. 다른 피연산자 하나는 CBZ명령어의 19비트 변위나 Load/Store 명령어의 9비트 변위이다.

  5. R-type 명령어의 목적지 레지스터와 Load 명령어의 목적지 레지스터는 4:0 에 존재한다.

 

  또한 ALU 제어블록, 상태소자용 쓰기 신호, 데이터 메모리용 읽기 신호, 멀티플렉서용 제어신호를 추가한다.

 

각 제어선들의 설명

  Reg2Loc : Read Register 2를 위한 레지스터 번호 선택 20:16 or 4:0

  RegWrite : 인가된다면 Write register가 지정하는 레지스터에 입력값을 쓴다.

  ALUSrc : Read Data2 와 부호확장된 하위 16bit중 ALU 두번째 피연산자를 선택한다.

  PCSrc : 다음 명령어의 위치를 결정한다, PC+4 or 분기 목적지 주소

  MemRead : 인가된다면 Address가 지정하는 데이터 메모리 내용을 Read Data 출력으로 내보낸다.

  MemWrite : 인가된다면 Address가 지정하는 데이터 메모리 내용을 Write Data 입력으로 수정한다.

  MemtoReg : Registers의 Write Data 입력값을 결정한다, ALU의 출력값 or 데이터 메모리 출력값

 

Control Unit을 추가한 데이터패스
명령어의 opcode로 결정되는 제어신호

  R-type, LDUR, STUR. CBZ 명령어에서의 제어신호들의 값은 opcode로 정해진다. 

 

데이터 패스의 동작

 

R-type에서의 데이터패스 동작

  위 그림은 ADD X1, X2, X3와 같은 R-type 명령어의 데이터 패스 동작을 나타내고 있다.

  모든 일은 한 클럭 사이클 내에서 동작 하지만, 총 4단계로 생각할 수있다.

  1. 명령어를 명령어 메모리에서 가져오고 PC값을 증가시킨다.

  2. 두 X2, X3를 레지스터 파일로 부터 읽는다. 이 단계에서 Control Unit이 제어선들의 값을 계산한다.

  3. ALU는 레지스터 파일에서 읽어 들인 값들에 대해 연산, opcode를 사용해 ALU control 신호를 만든다.

  4. ALU의 결과값이 레지스터 파일의 목적지 레지스터(X1)에 기록된다.

 

Load 에서의 데이터패스 동작

  위 그림은 LDUR X1, [X2, offset]와 같은 Load 명령어의 데이터 패스 동작을 나타내고 있다.

  이것도한 5단계로 생각할 수 있다.

  1. 명령어를 명령어 메모리에서 가져오고 PC값을 증가시킨다.

  2. 레지스터(X2)값을 레지스터 파일로부터 읽는다.

  3. ALU는 2번단계의 값과 명령어의 9bit(offset)를 부호확장한 값의 합을 계산한다.

  4. 이 합을 데이터 메모리 접근을 위한 주소로 사용된다.

  5. 메모리 유닛에서 가져온 데이터를 레지스터 파일(X1)에 기록한다.

 

CBZ 에서의 데이터패스 동작

  마지막으로 위 그림은 CBZ X1, offset와 같은 조건부 분기 명령어의 데이터 패스 동작을 나타내고 있다.

  4단계로 생각할 수 있다.

  1. 명령어를 명령어 메모리에서 가져오고 PC값을 증가시킨다.

  2. 레지스터 X1을 명령어 비트 4:0 을 사용하여 레지스터 파일로부터 읽는다.

  3. ALU(Add)는 레지스터 파일에서 읽어들인 값들을 전달한다. 명령어의 offset을 부호확장후 shift left 2 에 PC값을 더한다. 결과값이 분기 목적지 주소이다.

  4. 가산기의 결과를 PC에 저장할지 ALU의 Zero 출력을 이용하여 판단한다.

 

위 명령어들을 위한 제어유닛의 구현은 opcode별로 진리표를 구성하여 만들 수 있다.

 

무조건 분기 명령어를 처리하기위한 데이터패스 확장

  또한 무조건 분기명령을 위한 데이터패스가 추가되어야한다. 조건부 분기명령어와 비슷하지만 변위가 좀 더 길고 또한 조건 분기가 아니라는 점이 크다. 분기 명령어이므로 address의 하위 2bit은 항상 00이다. 무조건 분기를 위한 Uncondbranch 제어신호와 OR gate 하나가 추가되었다.

 

 단일 사이클 구현

  이러한 단일 사이클 설계에서는 클럭 사이클이 모든 명령어에 대해 같은 길이를 가져야한다. 물론 사이클은 컴퓨터에서 가능한 경로중 가장 길고 오래걸리는 경로에 의해 결정된다. LDUR이 그것인데 Instruction memory, Registers file, ALU, Data memory, Registers file 다섯개 Unit을 차례로 사용하기 때문이다. 즉 LDUR에 맞추어 사이클을 결정하게되면 클럭 사이클의 길이가 길기때문에 전체 성능은 좋지 않다.(CPI는 1이다)

반응형