안녕하세요. IT 엘도라도 에 오신 것을 환영합니다.
글을 쓰는 것은 귀찮지만 다시 찾아보는 것은 더 귀찮습니다.
완전한 나만의 것으로 만들기 위해 지식을 차곡차곡 저장해 보아요.   포스팅 둘러보기 ▼

컴퓨터 구조 (Architecture)/CSAPP

[CSAPP] Y86-64 - Logic Design

피그브라더 2020. 3. 7. 23:16

1. 데이터의 표현 : 비트의 세계로

컴퓨터는 내부적으로 모든 데이터를 0과 1로 처리한다. 이것이 구체적으로 무슨 말일까? 사실 전압이라는 것은 이산적인 값이 아니라 연속적인 값이다. 그래서 전압 값의 범위를 크게 세 범위로 나누게 된다. 하나는 0에 해당하는 영역, 다른 하나는 1에 해당하는 영역, 마지막 하나는 나머지 두 영역 사이에 존재하는 보호 범위(Guard Range)이다. 결국, 보호 범위에 해당하지 않는 전압을 가하면 이는 반드시 0 또는 1로 해석이 된다. 이러한 원리로 신호에 가해지는 작은 노이즈들은 데이터의 표현에 거의 영향을 주지 않게 되며, CPU 내부 회로를 더욱 단순하게 디자인할 수 있게 된다.

 

 

결국 컴퓨터의 데이터를 다루는 것에 있어서 연산을 수행한다는 것은 곧 0과 1로 이뤄진 Boolean 함수의 값을 계산한다는 것을 의미한다. 또한 데이터를 저장한다는 것은 구체적으로는 0과 1로 이뤄진 비트 배열을 저장한다는 것을 의미한다. 마지막으로, 데이터를 주고받는다는 것은 곧 도선(Wire)에 0 또는 1에 해당하는 범위의 전압을 가하는 것을 의미한다. 이러한 의미에서, 이번 포스팅은 CPU 내부에 존재하는 기본적인 연산 및 저장을 위한 논리 회로들을 다뤄볼 예정이다. 이를 통해 CPU 내부가 기본적으로 어떤 부품들로 이뤄진 것인지 파악해보도록 하자.

 

2. Hardware Control Language (HCL)

하드웨어, 즉 논리 회로들의 동작을 기술하기 위한 언어를 의미한다. 이는 추후 Y86-64 CPU 내부 논리 회로의 설계를 기술하기 위해 많이 사용이 된다. HCL에는 크게 두 종류의 자료형이 존재한다. 하나는 1비트의 데이터(0 또는 1)를 표현하는 bool, 나머지 하나는 워드 사이즈(Y86-64의 경우 64비트)의 데이터를 표현하기 위한 int이다. 그래서 HCL의 각 Expression은 bool 타입의 값 혹은 int 타입의 값을 반환하게 된다. 다음 표를 보고 HCL에 어떤 종류의 Expression들이 있는지 살펴보자.

 

반환형 Expression 예시
bool (1비트) 논리 연산 : a && b, a || b, !a
대소 비교 : A == B, A != B, A < B, A ≤ B, A > B, A ≥ B
포함 여부 : A in {B, C, D}
int (64비트 = 1워드) Case Expression : [ a : A; b : B; c : C ]

 

3. Combinational Logic Circuit (CLC)

출력이 현재의 입력에만 의존하는 회로를 말한다. 즉 과거에 어떤 입력이 들어왔든지 간에, 오로지 현재 들어오는 입력에 의해서만 출력이 결정된다. 이러한 회로들은 논리 게이트들 간의 순환적 연결이 존재하지 않으며, 입력이 변하면 약간의 딜레이를 거친 후에 출력이 바로 변하게 된다.


3-1. 논리 게이트 (Logic Gate)

 

AND, OR, NOT 등의 게이트를 말하며, 모든 CLC는 이러한 게이트들의 조합으로 이뤄진다. 따라서 출력은 입력에 대한 Boolean 함수로 표현이 가능하다. 또한 출력은 입력의 변화에 따라 실시간으로 변한다. 물론 어느 정도의 딜레이는 거친다. 예를 들어 AND 연산의 경우에는 다음과 같이 딜레이를 거치게 된다.

 


3-2. CLC 예시

다음은 동등 비교를 위한 CLC를 나타내며, 비트 단위 CLC를 여러 개 합치면 워드 단위 CLC를 만들 수 있다.

 

 

다음은 입력이 2개인 멀티플렉서를 나타내며, 이것을 여러 개 합치면 워드 단위의 멀티플렉서를 만들 수 있다.

 

 

다음은 3개의 입력값 중에서 최솟값을 찾아서 출력하는 CLC와 입력이 4개인 멀티플렉서를 HCL의 Expression으로 표현한 것이다.

 


3-3. Arithmetic Logic Unit (ALU)

CPU 내부에서 굉장히 중요한 역할을 수행하는 장치로, 각종 산술 및 논리 연산을 수행하는 CLC를 의미한다. CLC이므로 입력에 대해 출력이 곧바로 변화하는 특성을 가지며, Y86-64 기준으로 ADD, SUB, AND, XOR 네 가지의 연산을 수행할 수 있다. 연산의 종류는 ALU에 입력되는 컨트롤 신호에 의해 결정이 되며, 이러한 컨트롤 신호는 명령어 비트 배열의 함수 코드(Function Code)에 의해 결정된다.

 

 

4. Sequential Logic Circuit (SLC)

출력이 현재의 입력뿐만 아니라 과거의 입력에도 의존하는 회로를 말한다. 즉 과거에 들어온 입력을 기억할 수 있다. 이러한 맥락에서 '상태'가 존재한다고 말하며, 현재 입력이 동일하더라도 과거에 들어온 입력(상태)이 무엇이냐에 따라서 출력은 달라지게 된다. 이러한 회로들은 논리 게이트들 간의 순환적 연결이 존재하며, 특히 저장 장치의 경우에는 입력의 변화에 따라 출력이 곧바로 변하지 않는다는 특징을 가지고 있다.


4-1. 레지스터 (Register)

워드 사이즈의 데이터를 저장하는 임시 저장 장치를 의미한다. 주기적으로 변하는 클락의 신호가 1이 되는 순간에 입력에 해당하는 값이 레지스터에 저장이 되어 출력이 변한다.

 

 

레지스터를 활용하여 다음과 같은 상태 기계(State Machine) 회로를 구상할 수 있다. Load 신호가 0이면 입력에 해당하는 값을 레지스터에 계속해서 더하게 되고(Accumulate), Load 신호가 1이라면 입력에 해당하는 값을 레지스터에 저장(Load)한다.

 


4-2. 레지스터 파일 (Register File)

%rax, %rsp 등의 프로그램 레지스터들이 존재하는 장치를 의미한다. 복수 개의 읽기 포트와 1개의 쓰기 포트가 존재하며, 각 포트에는 읽거나 쓸 대상이 되는 레지스터의 번호(주소)가 입력된다. 참고로 포트에 0xF(=15)를 입력하면 어떠한 레지스터에도 접근하지 않음을 의미한다. 입력 포트와 쓰기 포트가 따로 있고 심지어 입력 포트는 여러 개 존재하기 때문에, 한 사이클 내에 여러 워드를 읽고 한 개의 워드를 쓰는 작업이 동시에 가능하다. 읽기(Read)의 경우, 포트에 주소를 입력하면 약간의 딜레이 후에 값이 바로 출력되기 때문에 일반적인 CLC와 동일하다고 볼 수 있다. 반면 쓰기(Write)의 경우, 입력된 값이 다음 사이클의 Rising-edge 때 가서야 레지스터에 반영이 된다.

 


4-3. 메모리 (Memory)

프로그램의 데이터와 코드가 저장되는 장치를 의미한다. 레지스터와 달리, 입력과 출력 무관하게 주소를 입력할 수 있는 포트가 한 개밖에 존재하지 않기 때문에(그래서 1비트 당 가격이 레지스터보다 저렴함) 한 사이클에는 한 번 읽거나 쓰는 것만 가능하다. 따라서 READ 신호와 WRITE 신호 둘 다를 1로 설정하는 일은 없어야만 한다. 마찬가지 원리로 읽기(Read) 작업은 CLC와 동일하고, 쓰기(Write) 작업도 다음 사이클의 Rising-edge 때 입력 값이 레지스터에 반영이 된다. 참고로 포트에 입력되는 주소가 잘못된 주소(메모리 주소 범위를 벗어나거나 접근하면 안 되는 영역의 주소인 경우)라면 에러 신호가 세팅이 된다. 이에 대해선 추후 더 자세히 알아보자.

 

'컴퓨터 구조 (Architecture) > CSAPP' 카테고리의 다른 글

[CSAPP] Pipelining - Introduction  (0) 2020.03.10
[CSAPP] Sequential Implementation  (0) 2020.03.09
[CSAPP] Y86-64 - Basics  (2) 2020.03.05
[CSAPP] x86-64 - Miscellaneous Topics  (5) 2020.03.03
[CSAPP] x86-64 - Data  (0) 2020.03.02