먼저 데이터패스를 설계해보자. 이것을 시작하기 위해 RISC-V 명령어 종류 각각을 실행하는 데 필요한 주요 구성 요소들을 살펴본다.
첫 번째 구성 요소는 instruction memory이다. 프로그램의 명령어를 저장하고, 주소가 주어지면 해당 명령어를 보내준다. 이 메모리는 읽기 접근만 제공하면 되므로 conbinational circuit으로 취급된다.
다음으로는 program counter(PC)를 살펴보자. PC는 현재 명령어의 주소를 가지고 있는 레지스터이다. 매 클럭 사이클 끝에 쓰기가 행해지는 32비트 레지스터이므로 쓰기 제어 신호는 필요하지 않다.
다음으로 PC를 다음 명령어 주소로 증가시키는 덧셈기가 필요하다. ALU를 이용해 쉽게 만들 수 있다. ALU가 항상 덧셈을 하도록 제어선을 연결한다.
어떤 명령어든지 실행하기 위해서는 다음과 같은 과정을 거쳐야 한다.
- 메모리에서 명령어를 가져온다.
- 다음 명령어 실행을 준비하기 위해 PC가 다음 명령어를 가리키도록 4만큼 증가시킨다.
위에서 설명한 세 가지 구성 요소가 어떻게 합쳐지는지 그림을 통해 확인해보도록 하자.
앞의 글에서 소개했다싶이, 명령어 집합을 3 부분으로 나누어서 생각한다. (메모리 참조 명령어, 산술/논리 명령어, 조건부 분기 명령어)
[컴퓨터구조] Processor(1): 데이터패스와 RISC-V의 구현
[컴퓨터구조] Processor(1): 데이터패스와 RISC-V의 구현
RISC-V의 구현하기 위한 핵심 부분을 살펴보자.메모리 참조 명령어: lw, sw산술/논리 명령어: add, sub, and, or조건부 분기 명령어: beq이들을 살펴봄으로서 데이터패스와 제어 유닛을 설계하는 데 사용
turtle2.tistory.com
1. 산술/논리 명령어 (R-type instructions)
먼저 R-타입 명령어들을 생각해보자. R-type instruction은 산술/논리 명령어로도 부른다. add, sub, and, or 명령어를 포함한다.
모든 R-type instruction의 공통된 작동 과정을 간단히 살펴보자.
- 2개의 레지스터를 읽는다.
- 레지스터 내용에 대해 ALU 연산을 수행한다.
- 연산 결과를 레지스터에 쓴다.
프로세서의 범용 레지스터 32개는 register file 속에 들어 있다. register file은 레지스터 번호를 지정함으로써 읽고 쓸 수 있는, 레지스터들의 집합으로 구성된 상태 소자이다. 이렇게 레지스터에서 읽어 들인 값들을 연산하려면 ALU가 필요하다.
R-type instruction은 레지스터 피연산자를 3개 갖는다. 매 명령어마다 register file에서 두 데이터 워드를 읽고, 하나의 데이터 워드를 써야 한다.
레지스터에서 데이터 워드를 읽기 위해서는 읽을 레지스터 번호를 지정하는 입력과 레지스터에서 읽은 값을 내보내는 출력이 하나씩 필요하다.
레지스터에 데이터 워드를 쓰기 위해서는 레지스터 번호를 지정하는 입력, 그리고 레지스터에 쓸 데이터 값을 제공하는 입력, 총 2개의 입력이 필요하다.
register file은 두 데이터 워드를 읽어야 하므로 Read register 2개, 하나의 데이터 워드를 쓰므로 Write register 1개와 Write data 1개 총 4개의 입력(레지스터 번호 3개, 데이터 1개)을 갖는다. 또한, 각 Read register 2개의 입력에 대한 Read data를 2개를 가져 총 2개의 출력(데이터 2개)을 갖는다.
또한, 쓰기는 쓰기 제어 신호에 의해 제어되므로, 해당 제어 신호가 인가됨을 확인하자.
레지스터의 번호 입력은 5비트 크기이다(32 = 2^5). 반면 데이터에 대한 입력과 출력 버스는 모두 32비트 폭이다.
(버스: 폭이 2비트 이상인 신호들. 굵은 선으로 표시된다. 보통 32비트를 나타내며, 32비트가 아닐 경우 이를 명시한다.)
이번에는 ALU를 살펴보자.
여기서 사용되는 ALU는 32비트 입력 2개를 받고, 32비트 결과와 결과가 0이 아닌지를 나타내는 1비트 신호를 출력한다. ALU 제어 유닛에 대해서는 다음 기회에 살펴보도록 하겠다.
2. 메모리 참조 명령어
이번에는 lw 명령어와 sw 명령어를 생각해보자. 해당 명령어는 이전 글에서 자세히 설명되어 있다.
[컴퓨터구조] Instructions, RISC-V(1): 산술, 적재, 저장 명령어
[컴퓨터구조] Instructions, RISC-V(1): 산술, 적재, 저장 명령어
컴퓨터 언어에서 단어를 명령어(instruction)이라 하고, 그 어휘를 instruction set이라 한다. 앞으로의 글에서 사용할 명령어 집합은 RISC-V이다. RISC-V는 UC Berkeley에서 개발되었다. RISC-V는 RISC-V Internation
turtle2.tistory.com
이 명령어들은 base register와 offset을 더해 메모리 주소를 계산한다. 저장 명령어(sw)의 경우 저장할 값을 레지스터 파일에서 읽어와야 하고, 적재 명령어(lw)는 메모리에서 읽어들인 값을 지정된 레지스터 파일에 써야 한다. 따라서, R-type instructions에서 사용된 레지스터 파일과 ALU가 둘 다 필요하다.
그 외에도 명령어의 12비트 offset 값을 32비트의 부호 있는 값으로 부호확장하는 유닛이 필요하다. 이를 수치생성유닛(ImmGen, Immediate generation unit)이라고 한다. 32비트의 명령어를 입력으로 받아 적재, 저장, 분기 명령어(beq, bne)일 때 12비터 offset을 추출해 32비트 부호 있는 값으로 확장한 후 출력으로 내보낸다.
또한, 읽고 쓸 데이터 메모리가 있어야 한다. 데이터 메모리는 읽기 제어 신호, 쓰기 제어 신호가 있어야 하며, 주소 입력, 저장 명령어일 때 메모리에 쓸 데이터 입력이 필요하다. 적재 명령어일 때 입력된 주소에서 가져온 데이터를 내보내는 출력이 하나 존재한다.
3. 조건부 분기 명령어
이번에는 beq 명령어를 살펴보자. beq 명령어는 3개의 피연산자를 갖는다. 2개의 레지스터와 12비트의 offset이다. offset은 분기 명령어 주소에 대한 상대적인 분기 목적지 주소(branch target address)를 계산하는 데 사용되는 값이다. PC 값에 offset을 부호확장한 값을 더해 branch target address를 계산해야 한다. 계산 시 고려해야 할 점이 두 가지 있다.
- 분기 주소를 계산하기 위한 base address는 분기 명령어의 주소이다.
- offset은 하프워드이기 때문에 1비트만큼 왼쪽으로 자리이동해야 한다. (offset 필드의 유효 범위가 2배 증가됨)
분기 목적지 주소를 계산했다면, 다음에 실행할 명령어가 바로 뒤에 있는 명령어일지 혹은 분기 목적지 주소에 있는 명령어가 될 지를 판단해야 한다. 레지스터 내용을 비교해 분기 조건을 만족하면 분기 목적지 주소의 값이 PC값이 되고, 분기 조건이 거짓이라면 분기 명령어 다음에 나오는 명령어의 주소가 PC값이 된다.
분기를 다루는 데이터패스 부분을 확인해보자.
분기 목적지 주소를 계산하기 위해 ImmGen과 덧셈기(ADD)를 포함한다. 레지스터의 값을 읽기 위한 레지스터 파일과 비교 연산을 수행하기 위한 ALU가 필요하다. ALU에서는 결과가 0인지를 나타내는 출력신호를 제공하므로, 뺄셈을 하라는 제어신호를 레지스터 값과 함께 ALU로 보낸다. ALU에서 Zero 신호가 나오면 레지스터 값이 같다라는 걸 알 수 있다.
각각의 명령어 종류에 필요한 데이터패스 구성 요소에 대해 알아보았다. 이들을 하나로 묶고 제어를 첨가해보자.
우선 모든 명령어를 한 클럭 사이클에 실행한다고 가정한다. (가장 간단하기 때문에..) 따라서 두 번 이상 사용할 필요가 있는 구성 요소를 필요한 만큼 여러 개 두어야 한다. 따라서 데이터 메모리와는 별도로 명령어 메모리를 둔다.
2개의 다른 명령어 종류가 데이터패스 구성 요소를 공유하기 위해서는 해당 구성 요소의 입력에 여러 개의 연결을 허용해야 한다. 이 때 멀티플렉서와 제어 신호를 사용해 입력들 중 하나를 선택한다.
이제 이해를 돕기 위해 각 명령어 종류 별로 데이터의 흐름을 확인해보자.
R-type instruction
메모리 참조 명령어
<lw>
<sw>
조건부 분기 명령어
(노란색 선은 제어선으로 추후에 설명할것임.)
이렇게 메모리 참조 명령어, 산술/논리 명령어, 조건부 분기 명령어에 대해 데이터패스를 만들어보았다. 이제 자세한 제어를 추가해보도록 하자.
'Computer > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] Pipelining(1): 파이프라이닝이란 (0) | 2024.06.01 |
---|---|
[컴퓨터구조] Processor(3): 제어 유닛 (control unit) (0) | 2024.06.01 |
[컴퓨터구조] 클럭킹 방법론(clocking methodology), 에지 구동 클럭킹 (0) | 2024.05.30 |
[컴퓨터구조] Processor(1): 데이터패스와 RISC-V의 구현 (0) | 2024.05.29 |