오늘 끝나면
레지스터 파일·스택
- ✓레지스터 파일·스택의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 레지스터이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
두 값을 동시에 읽기 — push/pop과 스크래치패드 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
반도체 설계 · 14
레지스터
파일·스택
레지스터 여러 개를 한 블록으로 묶은 것이 레지스터 파일이다.
읽기 포트가 둘이라 두 값을 한 사이클에 같이 뽑는다.
그걸 쌓고 빼는 규칙(LIFO)이 스택이고, 함수 호출이 여기서 돈다.
레지스터를 한 블록으로, 레지스터 파일
앞에서 만든 레지스터(D 플립플롭 묶음)를 여러 개 한 블록으로 묶으면 레지스터 파일이다.
16비트 CPU는 보통 R0~R7 8개를 둔다.
각 레지스터에는 번호가 붙고, 그 번호를 주소라 부른다.
8개니까 주소는 3비트면 충분하다 (000~111).
이게 메모리(RAM)와 다른 점은 위치다. 레지스터 파일은 ALU 바로 옆에 붙어 있다.
그래서 RAM보다 훨씬 빨리 읽고 쓴다. CPU가 계산하려고 손에 쥐는 코앞의 값들이다.
여기서 정한 레지스터 8개가 최종 MyChip의 레지스터 파일 크기로 그대로 들어간다.
두 값을 동시에 읽는다, 읽기 포트 2개
레지스터 파일의 핵심은 읽는 입구가 둘, read port A와 read port B라는 점이다.
왜 둘일까. ALU가 한 번에 피연산자를 둘 받기 때문이다.
R3 + R5를 하려면 R3과 R5를 같은 사이클에 뽑아야 한다.
포트가 하나뿐이면 한 번에 한 값씩이라 두 박자가 들어 느려진다.
포트 A에는 주소 A, 포트 B에는 주소 B를 따로 준다.
그러면 bus A에는 R[A]의 값이, bus B에는 R[B]의 값이 동시에 실린다.
심지어 둘이 같은 주소여도 된다. 같은 값이 양쪽에 나오고, 읽기는 서로 막지 않는다.
쓰기 포트와 내부 MUX
읽기는 주소로 한 줄을 고르는 일이다. 그 고르는 부품이 멀티플렉서(MUX)다.
8개 레지스터 출력이 전부 MUX로 들어간다. 3비트 주소가 그중 하나만 통과시킨다.
포트가 둘이니 MUX도 둘이다. 각자 자기 주소로 자기 줄을 뽑는다.
11강에서 본 주소 선택 회로가 그대로 여기 쓰인다.
쓰기 포트는 하나면 충분하다. 한 명령은 보통 결과를 한 곳에만 적는다.
쓰기는 주소로 고른 한 레지스터의 클럭만 열어 그 칸에만 새 값을 넣는다 (디코더 역할).
그래서 같은 사이클에 두 곳을 읽고 한 곳에 쓰는 일이 동시에 된다. read 2, write 1이다.
주소가 한 줄만 통과시킨다 (여기선 R5)
주소로 고른 한 칸의 클럭만 열어 그곳에만 쓴다
직접 두 포트로 읽고, 스택을 쌓아본다
두 포트 주소를 고르고, bus에 실릴 값을 먼저 찍은 뒤 READ로 확인한다.
포트 A와 B 주소를 누르면 그 두 줄과 MUX 경로만 진해진다.
READ를 누르면 bus A와 B에 두 값이 한 번에 올라오고, WRITE는 고른 한 곳에만 값을 적는다.
읽기 둘, 쓰기 하나가 한 사이클에 같이 된다.
스택 탭에서는 R7을 스택 포인터(SP)로 써서 PUSH와 POP을 한다.
push 때 SP가 한 칸 내려가고, pop 때 한 칸 올라간다.
여기서 고른 레지스터 8개 구성이 최종 MyChip 레지스터 파일에 들어간다.
값을 머릿속에 찍어두고 READ를 누른다. 두 포트라 한 번에 둘이 나온다.
읽기 포트 2개라 같은 사이클에 두 피연산자를 뽑는다, 그래서 R0+R2 같은 명령이 한 박에 끝난다.
스택, push/pop과 스크래치패드
레지스터 8개는 금방 동난다. 더 둘 데가 필요할 때 메모리 한 귀퉁이를 스택으로 쓴다.
스택은 한쪽 끝에서만 넣고 빼는 규칙이다. 마지막에 넣은 게 먼저 나오는 LIFO다.
넣기가 push, 빼기가 pop이다.
어디까지 쌓였는지는 스택 포인터(SP) 레지스터 하나가 가리킨다.
함수를 부르면 복귀 주소와 인자, 지역변수를 push로 쌓고, 끝나면 pop으로 정확히 되돌린다.
호출이 겹쳐도 LIFO라 마지막 호출부터 깔끔히 풀린다. 그래서 함수 호출의 뼈대가 스택이다.
임시 계산값을 잠깐 얹어두는 스크래치패드로도 같은 스택을 쓴다.
Q. 레지스터 파일에 읽기 포트가 둘인 이유는?
정답은 ALU가 두 피연산자를 동시에 받기 위해서다.R3 + R5 같은 연산은 두 값이 같은 사이클에 필요하다.
포트가 하나면 한 번에 한 값씩이라 두 박자가 들지만, 포트가 둘이면 한 박에 둘 다 뽑아 ALU로 바로 보낸다.