Datapath란 CPU에서 데이터와 주소를 처리하는 요소들을 말한다. 레지스터, ALU, MUX, 메모리 등이 Datapath라 할 수 있다. 지금부터는 lw
, sw
, add
, sub
, and
, or
, slt
, beq
, j
총 9가지 명령어를 수행할 수 있는 프로세서의 Datapath를 점점 완성해 나갈 것이다.
우선 모든 Instruction을 처리하기 위한 첫 단계인 Instruction Fetch를 먼저 살펴보자.
위 이미지 (강의 교재 figure 4.6) 의 요소들에 대해 간단하게 알아보자.
여기에서 소개할 것들은 R-Format Instruction을 구현하는 데 필요한 요소들이다. 우리가 구현하려는 Instruction 중에서 R-Format은 add
, sub
, and
, or
, slt
이다.
R-Format Instruction의 형태는 2장에서 다루기 때문에 (포스팅은 아직 올리지 않음) 바로 설명하자면, R-Format은 피연산자로 2개의 Read Register(Rs, Rt) Number와 1개의 Write Register(Rd) Number를 가진다.
위 이미지 (강의 교재 figure 4.7) 와 같이 살펴보자.
Registers에서는 3개의 Register Number(각 5 bits)를 입력으로 받는다. 그리고 출력으로 두 Read Register의 값을 읽어와 ALU로 넘긴다. ALU에서는 Instruction의 종류에 맞는 연산을 수행하는데, 이는 ALU operation이라는 플래그에 의해 결정된다. 그리고 연산 결과가 Write Register에 저장되어야 하므로 ALU result는 Registers의 Write Data 포트로 들어가고 Write Register에 저장된다.
lw
, sw
를 구현할 때 신경써야 할 점은, 메모리에 접근한다는 점과 레지스터 2개(Rs, Rt)를 입력받는데 lw
에서는 Rt가 Write로 사용된다는 것이다. 또, 메모리 offset을 16 bit 즉시 값(lw
, sw
가 I-Format이기 때문)으로 입력받고 이를 Rs에서 읽은 베이스 주소값(32 bit)에 더해야 한다. 우리가 사용할 ALU는 32 bit 값 두 개의 연산을 할 수 있기 때문에 16 bit인 offset을 32 bit로 확장한 다음 ALU의 입력 값으로 넘겨야 하는데, 이 때 Sign Extension을 하여 값을 유지한 채로 32 bit로 바꿔준다.
위 이미지 (강의 교재 figure 4.9) 는 이 단계에서 사용되는 두 유닛을 나타낸다. Sign Extension Unit은 16 bit 즉시값을 32 bit로 변환하는데 사용되고, Data Memory Unit은 메모리 주소를 입력받고 MemWrite, MemRead 플래그 상태에 따라 메모리를 읽거나 Write Data 입력으로 들어온 데이터(sw
일 때 Rt의 값)를 메모리에 쓴다. 이 때, 메모리 주소는 (Rs 레지스터에 들어 있는 베이스 주소 + Sign Extension한 offset)으로 결정된다. lw
이면 Read Data를 Rt에 저장하기 위해 Registers의 Write Data로 연결해준다. 지금까지 나온 부분을 합쳐서 그리면 아래 이미지와 같다.
같은 포트로 들어갈 수 있는 데이터들은 MUX로 Instruction에 따라 선택할 수 있도록 하였고 MUX, Registers, Data Memory, ALU의 동작을 제어하기 위한 플래그(빨간 색으로 표시된 것)들은 다음 포스팅에 설명할 Control에서 Instruction의 종류에 따라 결정한다.
지금까지 만든 회로로 실행할 수 있는(Control이 있다고 가정) 명령어는 add
, sub
, and
, or
, stl
, lw
, sw
이다. 이제 beq
, j
만 남았다. 일단 j
는 다음 포스팅에서 다루도록 하겠다.
beq
는 I-Format이기 때문에 값이 같은지 비교할 두 레지스터와 두 값이 같을 때 수행할 Instruction의 주소 Offset을 16 bit 즉시값을 피연산자로 갖는다. lw
, sw와
마찬가지로 즉시값은 Sign Extend하여 32 bit로 만들어 준다. 하지만 beq
에서는 Shift left를 두 번(4배) 해주는데, Instruction은 1 word이고 word가 위치한 곳은 정렬되어 있기 때문에 항상 주소값의 뒷자리가 00이다. 바이트 정렬에 대해서는 을 참고하면 더 자세하게 알 수 있고, 2장의 Branch Addressing (포스팅은 아직 올리지 않음) 을 설명하는 부분에서 앞서 설명되었다.
Branch Target Address는 (PC + 4) + (offset * 4)으로 계산할 수 있고 (이것도 2장에서 이미 언급), 두 레지스터(Rs, Rt)의 값이 같으면 이 주소가 PC에 저장된다. 두 레지스터의 값을 비교할 때는 ALU에서 두 값을 뺀 다음, Zero 출력이 1이 되는지 확인한다. ALU의 Zero는 연산의 결과가 0이면 1이되고 아니면 0이 되는 출력값이다. ALU에는 출력이 ALU Result와 Zero 총 2개가 있다고 생각하면 된다.
앞서 Instruction Fetch, R-Format, Load / Store 부분을 합친 회로를 보여줬는데 여기서는 요소들을 합칠 때 생각해 볼 것들을 알아볼 것이다.
합치기 전 각각의 Datapath들은 한 가지 Instruction을 실행할 수 있을 것이고 여러 Instruction을 동시에 수행하기 위해 이들을 병렬적으로 놓는다면 ALU 같이 여러 Datapath에 등장하는 요소는 같은 것이 여러 개가 필요할 것이다. 중복된 부품은 비용 증가로 이어지기 때문에, 그렇기 보다는 한 요소에 들어가는 Input을 선택적으로 넣을 수 있도록 MUX를 놓는 것이 더 효율적이다. 그래서 앞에서 보여준 회로는 MUX를 이용해 중복을 피하며 합칠 수 있었다. 그리고 이 MUX의 출력을 선택하는 플래그를 결정하기 위해 Control이 필요한 데 이는 다음 포스팅의 주제이다.
MUX는 beq까지 합친 회로에서 어떤 부분에서 필요할까?
add
, sub
, and
, or
, slt
) or 즉시값(lw
, sw
)add
, sub
, and
, or
, slt
) or 데이터에서 읽은 값(lw
)add
, sub
, and
, or
, slt
, lw
, sw
) or Branch Target Address(beq
)add
, sub
, and
, or
, slt
) or Rt(lw
)
beq
까지 전부 합치고 Control, ALU Control까지 추가한 그림이다. Control에 대해서는 다음 포스팅에서 다루겠지만, 간단하게 말하자면 opcode를 읽고 instruction의 종류에 따라 MUX에서 어떤 값을 선택할지, 메모리를 쓸 지 읽을지, 레지스터에 값을 저장할 지 등에 대한 선택을 한다고 생각하면 된다. ALU의 연산을 결정하는 것은 ALU Control이라는 Control을 한 번 더 거쳐서 결정하게 된다.
PC는 State Element이고, 나머지는 Combinational Element이기 때문에 전체 회로를 도는 데에는 1 Clock이 소요(CPI = 1)되어야 한다. 즉, 이 회로가 도는 속도에 따라 프로세서의 클럭 주기가 결정된다고 할 수 있다.
[컴퓨터 구조] 4.5 An Overview of Pipelining(1) (0) | 2020.10.26 |
---|---|
[컴퓨터 구조] 4.4 A Simple Implementation Scheme (0) | 2020.10.26 |
[컴퓨터 구조] 4.2 Logic Design Conventions (0) | 2020.10.25 |
[컴퓨터 구조] 4.1 Introduction (0) | 2020.10.25 |
[컴퓨터 구조] 2.3 Operands of the Computer Hardware (0) | 2020.10.25 |
댓글 영역