본 정리는 CS422-컴퓨터 구조 및 설계 : 하드웨어/소프트웨어 인터페이스. David A. Patterson, 존 헤네시 책을 바탕으로 하고 있음을 미리 알립니다.
Datapath (데이터패스)
데이터패스란 CPU안에서 데이터와 주소, 레지스터의 처리 및 연산을 하는 모든 요소를 의미한다 (instruction memory, data memory, PC, Register file, ALU 등 ..)
간단하게는 명령어가 들어와서 Fetch, Decode, Execute 되는 3 과정의 경로라고 생각하면 된다.
1. Instruction fetch
Instruction Memory는 프로그램의 명령어를 저장하고 주소가 주어지면 해당 명령어를 보내 주는 메모리 유닛이다.
프로그램 카운터(PC)는 현재 명령어의 주소를 갖고 있고, 매 클럭 사이클마다 PC에 4 값이 더해져 다음 명령어의 주소를 갖게 된다.
Instruction memory로부터 명령어를 불러오는 것은 combinational activity이다. 즉, 같은 명령어의 주소엔 같은 명령어를 보낸다.
2. Decoding Instructions
Fetch 된 명령어의 opcode와 function field 가 control unit에 가서 해석된다.
명령어의 형식을 보면 add t1, t2, $t3처럼 어떤 레지스터로부터 값을 읽고, 어떤 레지스터에 값을 쓸 건지 정해야 하는데, 이를 위해 레지스터 파일에도 rs (Read Addr 1) rt(Read Addr 2) rd(Write Addr) 필드의 값과 어떤 값이 쓰일지 데이터(Write Data)를 보낸다. t1,t1,
다만 Write Addr의 경우엔 lw 명령어처럼 rt필드의 값이 들어오는 경우가 있는데 이와 같은 조절도 control unit이 하게 된다.
2-1. 레지스터 파일
그렇다면 여기서 레지스터 파일은 들어온 값을 어떻게 처리하는 것일까?
우선, 레지스터 파일엔 32개의 범용 레지스터가 있다는 사실을 인지하고 있도록 하자.
우선 R format 형식처럼 레지스터에 값을 무조건 쓰는 명령어들도 있고, sw(store word)처럼 레지스터로부터 값을 읽어가기만 하고 쓰진 않는 명령어도 있다.
이를 위해 레지스터 파일에는 write control 신호가 필요하다. (마찬가지로 Contol unit에서 나온다.)
크게 두 가지로 레지스터로부터 Read 하는 작업과 Write 하는 작업을 나눠보자.
Read 할 때는 모든 레지스터의 값을 Multiplexer에 보내고 Read register number 1과 Read register number 2를 통해 어떤 데이터를 그중에 고를지 선택해서 해당하는 데이터를 출력해준다.
Write 할 때는 write 할 레지스터의 번호만 1로 출력하고 나머지는 0으로 출력하는 Decoder와 WriteContol 신호를 이용해서 어떤 레지스터에 값을 쓸 건지 레지스터에 write 하는 명령어가 맞는지 And게이트에 넣어 만약 둘 다 맞을 시 control 신호에 1을 넣어 해당 레지스터에만 값이 쓰이게끔 한다.
3. Executing R Format Operations
R format 명령어 (add, sub, slt, and, or)
Control Unit에서 opcode와 funct field 값을 분석하여 ALU에 어떤 연산을 할지 결정하고,
레지스터 파일에서 rs, rt 필드에 저장된 레지스터 번호를 통해 해당 레지스터의 데이터들을 뽑아서 rs와 rt의 계산을 진행하고 진행된 결과를 다시 레지스터에 보내어 rd 레지스터에 저장한다.
4. Executing Load and Store Operations
Load word 혹은 Store word 같은 경우에 메모리로부터 값을 가져오거나 메모리에 값을 써야 한다.
이때 I format을 사용하기 때문에 상수와 rs 레지스터의 값을 더하는데, rs레지스터의 값은 32bit이다.
그러나 I format의 상수 필드는 16bit기 때문에 두 값을 더할 수가 없다.
즉, 이를 위해 sign extension이 필요하다.
Load word였다면, rs의 값과 상수의 값을 더해 주소를 얻고, (rt와 rs를 더할지 상수와 더할지도 Contol unit이 결정한다.)
그 더한 주소를 메모리에서 참조해 해당 메모리 주소로부터 값을 가져와 rt 레지스터에 값을 저장한다.
Store word 였다면, Load word와 마찬가지로 rs와 상수의 값을 더해 주소를 얻고,
그 더한 메모리 주소에 rt에 있던 데이터를 write 한다.
memory write도 레지스터 파일과 마찬가지로 항상 write 되지 않기 때문에, MemWrite 신호를 필요로 한다.
참고: https://developbear.tistory.com/38
5. Executing Branch Operations
beq $t1, $t2, offset 형식의 I format을 따르는 분기 명령어는
t1과 t2를 계산하고, 이 결과를 바탕으로 PC+4 값에 offset 값을 shift left 2 한 값을 다음 PC 값으로 전달한다.
따라서 ALU의 빼기 연산을 사용하여 0인지 아닌지 판단하고 이 값을 바탕으로 Branch control unit에 전달하여 PC+4를 쓸지 계산한 Label주소를 쓸지 결정한다.
참고 : https://developbear.tistory.com/39
6. Executing Jump Operations
j L1 같이 쓰여 L1을 shift left 2한 주소에 PC+4한 값을 더해서 다음 PC 값을 바꿔준다.
그래서 해당 모든 그림들을 합쳐보면,
결국 데이터 패스가 나온다.
'CS > 컴퓨터 구조' 카테고리의 다른 글
[Chapter 4.5 컴퓨터 구조 및 설계] 데이터패스 control unit, control signal (0) | 2022.07.19 |
---|---|
[Chapter 4.4 컴퓨터 구조 및 설계] ALU 하드웨어 (0) | 2022.07.19 |
[Chapter 4.2 컴퓨터 구조 및 설계] 클러킹 방법론과 Combinational element, Sequential Element (0) | 2022.07.18 |
[Chapter 4.1 컴퓨터 구조 및 설계] 프로세서 구현에 대한 개요 (명령어는 하드웨어에서 어떻게 실행되는가) (0) | 2022.07.17 |
[Chapter 3.8 컴퓨터 구조 및 설계] 연산에 있어서 겪을 수 있는 오류 및 함정 (0) | 2022.07.16 |