학습 주제
논리 게이트, HCL, 클록, 레지스터, 메모리
정리한 내용
4.2 Logic Design and the Hardware Control Language HCL (논리 설계와 하드웨어 제어 언어 HCL)
- 하드웨어 설계 시, 전자회로를 사용해서 비트들의 함수를 계산하고 여러가지 메모리 원소들에 비트들을 저장한다.
- 디지털 시스템을 구현하기 위해서는 세 개의 주요 컴포넌트가 있어야 한다.
- 비트연산을 위한 조합 회로(combinational logic)
- 비트를 저장하기 위한 메모리 소자
- 메모리 소자의 갱신을 조절하는 클럭 신호
4.2.1 Logic Gates (논리 게이트)
- 논리 게이트는 디지털 회로에서 기초 연산 소자들이다.
- 논리 게이트는 인풋에 따른 비트 값의 부울 함수의 아웃풋을 생성한다.
- 하드웨어 컨트롤 언어인 HCL은 && 연산자로 AND를 || 연산자로 OR을 ! 연산자로 NOT을 표현한다.
4.2.2 Combinational Circuits and HCL Boolean Expressions (조합회로와 HCL 부울 수식)
- 여러 논리 게이트를 모아서 네트워크를 만들면 조합 회로(combinational circuits)라 불리는 계산 블록을 만들 수 있다.
- 어떻게 네트워크가 구성되는 지에 대해 몇 가지 제한들이 있다.
- 모든 논리 게이트 입력은 정확하게 다음 중 하나에 연결되어야 한다.
- 시스템 입력중의 하나 (주요 입력이라 불리는)
- 일부 메모리 소자의 출력(ouptut) 연결
- 일부 논리게이트들의 출력(논리게이트 출력이 다른 논리게이트의 입력이 되는 경우)
- 두 개 이상의 논리게이트들의 출력(output)은 서로 연결될 수 없다. (논리게이트의 출력이 새로운 논리게이트가 아닌 ‘서로’ 연결할 때 전압이나 회로 오작동 발생)
- 네트워크에는 순환회로가 없어야 함(output이 반드시 존재해야 함)
- 모든 논리 게이트 입력은 정확하게 다음 중 하나에 연결되어야 한다.
- 아래는 HCL 언어의 예시. a와 b가 1이면 ouput은 1, C에서는 ‘=’로 ouput을 이름으로 저장하지만, 실제 내부적으로는 메모리 영역에 ouput을 할당한다.
- 아래는 멀티플렉서(multiplexor)로 알려진 간단하지만 유용한 조합회로
- 상단의 논리게이트를 HCL 언어로 표현하면 다음과 같다.
bool out = (s && a) || (!s && b);
- HCL 수식들은 조합논리회로와 논리수식 간 분명한 연관관계를 보여준다.
- 조합논리회로와 논리수식은 모두 입력에 대한 함수를 게산하기 위해 Boolean 연산을 이용한다.
- 조합논리회로와 논리수식 간 차이도 존재한다.
- 조합회로은 논리회로들의 연속으로 구성되어 있기 때문에 입력이 변화 되면 출력도 변화된다. 반면, C 논리수식은 프로그램 실행 중 식을 만나야 계산이 이루어진다.
- C에서 논리 수식을 0은 거짓, 그 외 값들은 참으로 해석한다. 반면, 논리게이트는 비트 값 0과 1에 대해서만 연산을 한다.
- C에서 논리 수식은 부분적인 평가만 이루어진다. 만약 AND, OR 연산의 결과가 첫 요소에 의해 결정된다면 뒷 부분 요소들은 평가되지 않는다. ex) (a && !a) && func(b,c)에서 func은 call 되지 않을 것이다. 반면, 조합회로에서는 부분 평가가 이루어지지 않는다(전체 다 연산)
4.2.3 Word-Level Combinational Circuits and HCL Integer Expressions
- 논리 게이트들의 큰 네트워크들을 연결해서 보다 복잡한 함수를 계산하는 조합 회로를 구성할 수 있다.
- 전형적으로 words 데이터를 가지고 동작하는 회로를 설계한다. word 데이터 크기의 범위는 4~64bits이며 인티저, 어드레스, 명령코드, 레지스터 주소 등을 표현하는 words들로 프로세서 설계가 이루어진다.
Word
워드(Word).
컴퓨터에서 연산의 기본 단위가 되는 정보의 양. CPU에서 이만큼의 데이터를 기준으로 처리하는데, 보통은 32비트(4바이트)를 1Word로 하는 경우가 많지만, CPU마다 다르므로 항상 1Word = 4byte는 아니다. 보통 자주 쓰이는 워드의 크기는 16비트(half-word) 혹은 32비트(full-word)로 고정된다. 인텔에서는 16비트 시절부터 이 용어를 사용했고 32비트는 DWORD(Double Word), 64비트는 QWORD(Quadruple Word)라고 불렀다.
- word 레벨의 계산을 수행하는 조합 회로는 word 아웃풋을 계산하는 논리게이트들로 구성된다.
- 좌측은 각 비트들을 비교해서 AND 게이트로 동일성을 확인한다. 이를 Word-level 로 추상화하면 우측과 같다. 이를 수식으로 표현하면 bool Eq = (A == B), 여기서 A와 B는 int형으로 선언되어야 한다.
- 아래는 Word-level 멀티플렉스 회로이다. 이 회로의 output은 64-bit word의 Out이다. 이 회로는 64개의 부분 회로들로 구성되어 있다. !s가 64번 수행 됨. (s값에 따라 아웃풋이 A 아니면 B로 결정된다)
- 반면, Word-level 버전에서는 !s를 한번 생성 후 각 비트 위치에서 재사용해서 인버터의 수를 줄인다. 아래의 HCL 수식을 톻해 더 자세한 설명을 하겠다.
- HCL에서 멀티플렉싱 함수는 ‘case’ 수식을 통해 표현된다.
[
select1 : expr1;
select2 : expr2;
.
.
.
selectk : exprk
]
- 상단 수식에서 selecti는 case i이고 expri는 casei에 따른 결과 값이다.
- C에서 switch 구문과 달리 select 표현식이 상호 배타적일 필요가 없다.
- 논리적으로 select 표현식이 순서대로(위에서부터 아래로) 평가되고 1을 평가하는 첫 번째 경우가 선택된다. (1이 나오면 아래는 수행X)
word Out = [
s: A;
1: B;
];
- 상단의 HCL 수식에서 select가 1인 경우가 C switch 구문에서 default 수식을 표현하는 방식과 같다.
- 이러한 HCL 코드의 표현 방식은 가독성을 높인다.
- (그러나 실제 하드웨어의 멀티플렉스 구조에서는 상호배타적인 신호를 가져야 한다)
- select 부분은 부울식으로 표현이 가능하고 임의의 정수로도 표현이 가능하다. 이는 복잡한 선택 기준을 가진 입력 신호의 선택을 케이스 표현식으로 설명할 수 있다. 하단 코드는 그 예시. #은 주석
word Out4 = [
!s1 && !s0 : A; # 00
!s1 : B; # 01
!s0 : C; # 10
1 : D; # 11
];
- 두 번째 줄은 !s1&& s0을 간략하게 표현한 것. 왜냐하면 첫 번째 줄이 수행 안되면 s1 또는 s0이 1이 라는 것이기 때문에.(s1이 0이면 s2는 1이다.) 이런 식으로 세 번째 줄도 간단하게 표현한다.
- A, B, C 중 최솟값을 찾는 예시
- 이를 HCL case 구문으로 표현하면
word Min3 = [
A <= B && A <= C : A;
B <= A && B <= C : B;
1 : C;
];
4.2.4 Set Membership (집합의 원소 관계)
iexpr in {iexpr1, iexpr2, ... , iexprk}
- 집합의 원소 여부를 시험하는 일반적인 형태. iexpr은 모두 정수
4.2.5 Memory and Clocking(메모리와 클락킹)
- 조합 회로들은 어떠한 정보도 저장하지 않는다. 대신에 조합 회로들은 input의 시그널(신호)에 단순히 반응해서 output을 생성한다.
- 순차 조합 회로(상태를 가지며 이 상태에 대해 계산을 하는 연속된 회로)를 만들기 위해서는 비트로 표시된 정보를 저장하는 장치를 별도로 이용해야한다. 그 장치는 register와 memory이다.
- clock은 새로운 값들이 장치로 로드될 때를 결정하는 주기적인 신호이다. 한 개의 clock에 의해 저장 장치는 제어된다.
- Clocked registers(or simply registers): 워드나 개별 비트를 저장. clock 신호는 입력 값으로 레지스터의 로딩을 제어한다.
- 랜덤 엑세스 메모리(or simply memories): 워드를 읽거나 쓰기 위해 주소를 사용해서 여러 워드를 저장한다.
- ex) 가상메모리 시스템, 레지스터 파일(레지스터 식별자는 주소를 제공한다. Y86-64 프로세서에서 레지스터 파일은 15개의 프로그램 레지스터를 보관한다. (%rax~%r14)
- ‘레지스터’라는 단어는 하드웨어와 기계어 프로그램에서 의미가 서로 약간 다르다.
- 하드웨어에서 레지스터는 입력과 출력 전선들로 회로의 나머지 부분들과 직접 연결된다. (간단히 말해서 물리적인 레지스터인 “hardware registers”)
- 기계어 수준 프로그래밍에서 레지스터는 주소가 레지스터의 ID인 CPU 내의 주소 지정이 가능한 워드들의 작은 집합을 의미한다. (간단히 말해서 주소들의 집합인 “program registers”)
- 다음은 하드웨어 레지스터의 예시이다.
- 레지스터는 어떤 고정된 상태(x로 표현됨)으로 유지되는데, 자신의 현재 상태와 동일한 출력을 낸다.
- 클럭이 올라가면 입력 신호(y)들이 다음 상태(y)로 레지스터에 로딩되고, 이것이 다음 상승 클럭 엣지까지 새로운 레지스터의 출력이 된다.
- 레지스터들이 회로의 여러 부분에서 조합논리 사이에 장벽으로의 역할을 수행한다.
- Y86-64 processors는 clocked registers을 사용한다. the program counter (PC), the condition codes (CC), and the program status (Stat) 같은 정보를 저장한다.
- 하단 그림은 전형적인 레지스터 파일이다.
- 다중 포트 랜덤 엑세스 메모리는 여러 번의 읽기 및 쓰기 연산이 동시에 일어날 수 있게 해준다.
- 두 개의 읽기 포트는 주소 입력 srcA, srcB와 데이터 출력 valA, valB를 갖는다.
- 한 개의 쓰기 포트는 주소 입력 dstW, 데이터 입력 valW를 갖는다.
- 레지스터 파일은 조합 회로가 아니다. 왜냐하면 레지스터 파일은 내부의 저장장치를 가지고 있기 때문이다. (조합 회로는 저장 장치가 없다)
- 그러나 사용자 입장에서 보았을 때, 주소가 입력이고 데이터가 출력인 조합 논리인 블록인 것처럼 레지스터 파일에서 데이터를 읽을 수 있다.
- srcA, srcB가 어떤 레지스터 주소(ID)로 설정되었을 때, 해당 프로그램에 저장된 값은 각각 valA, valB에 나타난다.
- 레지스터 파일에 워드를 쓰는 작업은 클럭이 있는 레지스터에 값을 로딩하는 것과 비슷하게 클럭 신호에 의해 제어된다. (클록이 상승되면 입력 valW의 값은 입력 dstW의 레지스터 ID로 표시된 프로그램 레지스터에 기록된다)
- 만약 같은 레지스터에 동시에 읽기 쓰기가 수행된다면?
- → 만약 같은 레지스터 ID가 읽기 포트와 쓰기 포트에 사용된다면 클록이 상승함에 따라 읽기 포트의 데이터 출력이 이전 값에서 새 값(쓰기 포트에 수행된 값)으로 전환된다. (클록이 상승 전 인풋에 두 값들이 있다가 클록 상승하면 쓰기 포트로 들어온 ****새 값으로 전환 된 후 읽기 포트의 데이터 출력이 일어남)
- 레지스터 파일을 다룰 때 위와 같은 점을 고려해야 한다.
- 아래 그림은 프로그램 데이터를 저장하기 위한 랜덤 엑세스 메모리이다.
- 한 개의 주소 입력, 쓰기를 위한 데이터 입력, 읽기를 위한 데이터 출력을 갖는다.
- 레지스터 파일처럼 메모리에서의 읽기 작업은 조합 회로와 유사한 방식으로 동작한다. 쓰기는 0으로 설정 후(읽기 작업이기에) 주소를 입력하면 주소에 대응되는 값이 출력된다.
- 에러의 경우 주소 값이 정해진 범위 내에 있으면 0 그렇지 않다면 1를 출력. 주소 값이 정해진 범위 내에 있는지 확인하는 과정은 결합 논리에 의해 수행 됨. 주소 입력에 따라 범위에 있는 지만 체크하면 되기에 상태 저장을 포함하지 않기 때문이다.
- 메모리를 쓰는 작업은 clock 클록에 의해 제어된다. 쓰기를 1로 설정(쓰기 작업이기에)하고 원하는 주소를 입력 후 클록이 상승하면 주소에 해당하는 메모리의 위치가 업데이트 된다.
'Computer Science > 컴퓨터 구조' 카테고리의 다른 글
[CSAPP] 4.4 General Principles of Pipelining (0) | 2023.03.01 |
---|---|
[CSAPP] 4.3 Sequential Y86-64 Implementations (0) | 2023.03.01 |
[CSAPP] 4.1 The Y86-64 Instruction Set Architecture (0) | 2023.03.01 |
[CSAPP] 9.7 Case Study: The Intel Core i7 / Linux Memory System (0) | 2023.03.01 |
[CSAPP] 9.8 Memory Mapping (메모리 맵핑) (0) | 2023.03.01 |