본문으로 바로가기


원문 Ken Shirriff's blog

저자 Ken Shirriff

번역 ComoCloud



혁명적인 인텔 8008 마이크로프로세서는 오늘(2017년 3월 13일) 45살이 되었습니다. 그래서 저는 8008의 내부 회로의 리버스 엔지니어링을 한 블로그 포스트가 필요한 때라고 생각합니다. 과거의 컴퓨터들의 재미있는 점 중 하나는 무언가를 예상치 못한 방식을 사용해 구현하는 것입니다. 그리고 8008도 예외는 아니죠. 현대의 아키텍처와 비교해, 8008의 특이한 기능은 램에 스택을 만들어 저장하는 것이 아니라 칩 안에 서브루틴 호출을 위한 스택이 있다는 것입니다. 그리고 8008은 스택에 일반적인 바이너리 카운터를 사용하는 것 대신에 시프트 레지스터 카운터를 사용해 의사 난수 값(pseudo-random values)을 생성하는 몇 개의 게이트에 저장합니다. 이 글에서는 다이 사진으로 회로를 리버스 엔지니어링하고 그것들이 어떻게 작동하는지 설명하겠습니다.


아래의 8008의 작은 실리콘 다이를 고배율로 확대한 이미지입니다. 다이의 바깥쪽 주위에 외부 핀에 연결되는 18개의 선을 볼 수 있습니다. 8008의 집적회로는 금속 배선층(흰색)으로 연결된 3500개의 작은 트랜지스터(노란색)로 구성되어있습니다. 이 글에서는 칩의 오른쪽에 있는 스택 회로와 그것이 어떻게 데이터 버스(파란색)과 통신하는지에 대해서 집중적으로 알아볼 예정입니다.


인텔 8008 마이크로프로세서의 다이, 스택과 다른 중요한 하위 요소들을 보여주고 있다.


8008 프로세서의 생일을 맞이해, 저는 1972년 3월 13일 첫 번째로 공개된 Electronics의 기사인 "하나의 칩으로 제공하는 8-비트 병렬 프로세서.(8-bit parallel processor offered on a single chip.)"의 데이터를 사용했습니다. 이 기사에서는 "지능형 터미널"에 사용하기 위한 완벽한 중앙 처리 장치로써 8008을 설명하고 이 칩을 $200에 판매할 것이라고 밝히고 있습니다. [주석1. 원문 참조]


당신은 8008 프로세서의 지능형 터미널이 특정 응용 프로그램이라고 생각할 것입니다. 이것에 대한 칩의 근원으로 돌아가는 재미있는 뒷이야기가 있습니다 : 1970년 6월, Datapoint 2200의 "프로그래머블 터미널"이 소개되었습니다. 인기있는 Datapoint 2200는 기본적으로 간단한 TTL 칩들로 가득 찬 프로세서 보드로 구성된 데스크톱 미니컴퓨터였습니다. 아래의 사진은 Datapoint 2200의 CPU 보드를 보여주고 있습니다. 마이크로프로세서가 존재하지 않았던 때이기 때문에, 게이트, 플립 플롭, 디코더 등의 칩이 결합된 프로세서로 구성되어 있습니다.


Datapoint 2200의 프로세서 보드. 8008 마이크로프로세서는 이 보드를 대체하기 위해 제작되었지만 Datapoint는 사용하지 않았다. 출처는 알 수 없음.


일반적으로 프로세서는 서브루틴 호출용 주소를 저장하기 위한 스택을 사용해, 스택이 종료될 때 복귀 주소를 "pop"할 수 있습니다. 이 스택은 보통 메인 메모리에 저장됩니다. 그러나 Datapoint 2200은 주기억장치로는 비싼 RAM 대신에 느린 시프트 레지스터 메모리[주석2]를 사용합니다. 그래서 주기억장치의 스택에 시행하는 것 보다 느리고 불편합니다. 대신에, Datapoint 2200의 스택은 i3101 RAM 칩에 저장되기 때문에 16 엔트리의 작은 스택을 제공할 수 있었습니다.[주석3][주석4] i3101은 인텔의 매우 초기 제품으로 단지 64비트만 기억할 수 있었습니다. 당신은 위 사진에서 인텔의 "i"가 써져있는 패키징된 독특한 하얀색 칩을 볼 수 있습니다.[주석5]


Datapoint 2200은 스택 상단의 트랙을 추적하기 위해서 스택 포인터를 저장해두는 4-비트 업/다운 카운터 칩을 사용했습니다. 이 디자인의 똑똑한 점은 프로그램 카운터(PC)와 스택이 분리되어 있지 않다는 점입니다; PC는 단순히 스택 상단의 값입니다. 당신은 스택의 PC에 명시적으로 push나 pop을 할 필요가 없습니다; 서브루틴 호출을 위해 당신은 단지 카운터를 업데이트하고 스택의 서브루틴 주소에 작성하기만 하면 됩니다.


8008의 기원은 Datapoint가 인텔에 가서 스택 메모리와 스택 포인터가 한 칩으로 결합된 칩을 설계할 수 있냐고 물은 것이었습니다. 인텔은 그들이 고작 그정도만 할 수 있는 것이 아니라, 프로세서 보드 전체를 하나의 칩으로 만들 수 있다고 말했습니다! 이것이 Datapoint 2200의 프로세서 보드를 하나의 칩으로 설계하려는 인텔의 8008 프로젝트의 시작이었습니다.[주석6] 여러 연기에 거쳐 인텔은 8008 마이크로프로세서의 개발에 완료했지만, Datapoint는 그것을 거절했습니다. 인텔은 8008을 범용 프로세서 칩으로 팔 것을 결정했으며, 마이크로프로세서 번혁을 촉발시켰습니다. 인텔은 8008의 개선판인 8080과 16-비트 버전인 8086에서 x86 아키텍처로 이어져, 오늘날 데스크톱과 서버 컴퓨터를 군림하고 있습니다.


8008 역사의 결과는 Datapoint 2200 지능형 터미널으로부터 아키텍처와 명령어 세트를 물려받게 되었습니다. 이러한 기능 중 하나는 고정적이고 내장된 스택이지만, 8008의 스택 실행은 일반적인 것은 아니었습니다.



시프트 레지스터 카운터


8008의 스택에서 가장 의외의 부분은 어떻게 현재 위치의 추적을 유지하냐는 것이었습니다. 스택을 시행하는 간단한 방법은 바이너리 업/다운 카운터로 현재 스택 포지션의 추적을 유지하는 것입니다.(Datapoint 2200이 이 방식을 사용했습니다.) 그러나 트랜지스터 사용을 줄이기 위해 8008은 카운터 대신에 비선형 피드백 시프트 레지스터(nonlinear feedback shift register)를 사용했습니다. 그 결과 스택 엔트리는 의사 난수 순서로 접근하게 됩니다! 그러나 동일한 순서로 읽고 쓰여졌기 때문에 모든 것이 정상적으로 작동합니다.


시프트 레지스터 출력은 드 브루인 수열(de Bruijn sequence)에 기초하고 있으며, 모든 가능한 출력의 순환수열은 정확히 한 번의 부분수열이 발생합니다. 8008의 드 브루인 수열은 아래와 같습니다. 빨간색 밑줄이 그어진 것이 첫 번째 값(000)이고, 파란색 위치로 이동하면 두 번째 값(001)이 됩니다. 시계 방향으로 원을 그리며 이동하면 총 8개의 값이 나옵니다: 000, 001, 010, 101, 011, 111, 110, 100, 000. 이 값들은 각자 정확히 한 번씩 나오지만 일반적인 바이너리 순서가 아닙니다.


이 드 브루인 수열은 부분수열인 8개의 3-비트 값을 모두 포함하고 있다. 000 과 001은 밑줄이 그어져 있다. 인텔 8008의 내부 카운터는 이러한 수열로 구성된다.


수열의 각 단계에서 마지막 두 비트는 왼쪽으로 시프트되고 새로운 비트가 오른쪽에 들어옵니다. 카운트 다운은 역방향입니다: 첫 두 개의 비트는 오른 쪽으로 시프트되고 새로운 비트가 왼쪽으로 들어옵니다. 이 과정은 비트가 시프트되고 추가적인 비트가 삽입되는 것을 허용하는 회로, 즉 시프트 레지스터의 역할을 수행할 수 있습니다.[주석7]


아래 다이어그램은 8008 프로세서가 어떻게 비선형 피드백 시프트 레지스터 카운터를 수행하는지 보여줍니다. 보기에 복잡해 보이지만, 드 브루인 수열을 간단하게 구현한 것입니다. 세 개의 래치의 중간은 시프트 레지스터를 형성하며 각 래치는 하나의 비트를 유지합니다. 카운트 업 시에는, 각 비트가 왼쪽으로 시프트되고 새로운 비트가 오른쪽(녹색 화살표)에 추가됩니다. 카운트 다운 시에는,각 비트가 오른쪽으로 시프트되고 새로운 비트가 왼쪽(보라색 화살표)으로 추가됩니다. 왼쪽의 논리 게이트는 카운트 다운할 때의 새로운 비트를 생성하고 오른쪽의 논리 게이트는 카운트 업할 때의 새로운 비트를 생성합니다.


[주석8]

8008은 내부 스택 카운터로 위 회로를 사용한다. 리프레시 카운터는 이 회로를 기반으로 하지만 오직 카운트 업만 할 수 있다.


논리 게이트가 복잡하게 느껴질 수도 있습니다. 그러나 PMOS 로직의 한 가지 특징은 트랜지스터를 병렬이나 직렬로 연결하는 것 만으로도 단순히 NOR게이트로 AND-OR-NOR 게이트를 간단하게 만들 수 있다는 것입니다. 로직의 설계도 간단합니다: 현재 세 개의 비트의 각각은 드 브루인 수열의 다음 비트를 명시합니다. 만약 당신이 디지털 논리 회로를 배웠다면, 카르노 맵을 사용하여 다음 비트를 생성하는 논리회로를 설계할 수 있습니다.



스택 저장소 내부


8008은 레지스터와 스택 스토리지를 위해 동적 RAM(DRAM)을 사용합니다. 제가 조사해본 1970년대의 다른 마이크로프로세서들은 정적 래치를 사용했으며, 8008이 이 점에서 약간 특이한 것입니다. 당시 인텔은 주로 RAM에 관련된 기업이었기 때문에, 저는 그들이 자신들의 RAM 기술을 활용하고, DRAM을 사용함으로써 트랜지스터 사용을 줄이려고 한 것으로 추정합니다.


8008 내부 스토리지의 각 비트는 인텔의 i1103 DRAM 칩과 비슷한 3T1C 셀이라고 부르는 세 개의 트랜지스터와 한 개의 커패시터가 합쳐진 셀을 사용합니다. 아래의 다이어그램은 8008의 스택 스토리지의 확대 사진으로 6개의 DRAM 셀을 볼 수 있습니다. 각 행은 스택에서 하나의 14-비트 주소이고, 왼쪽에서 오는 읽기 허용과 쓰기 허용 제어선이 있습니다. 각 열은 14-비트 중 한 비트가 저장됩니다; 열 감지 선(column sense line)은 선택된 비트의 읽고 쓰는 데 사용합니다.


스택 레지스터의 6 스토리지 셀을 보여주는 인텔 8008 마이크로프로세서의 다이 확대 사진. 각 비트는 세 개의 트랜지스터와 한 개의 커패시터로 구성된 한 DRAM 셀에 저장된다.


첫 번째 셀의 트랜지스터는 T1, T2, T3이라고, 값을 저장하는 커패시터는 C라고 부르겠습니다.(따로 물리적인 커패시터가 존재하지 않습니다; 와이어링의 정전 용량이 비트를 저장하기에 충분합니다.)


비트를 쓰려면 희망하는 행의 쓰기 선이 low를 인가시켜 T1을 켭니다. 희망하는 전압(low나 high)을 감지 선에 인가하면 T1을 통과하고 커패시터에 저장됩니다. 값을 읽으려면 적절한 읽기 선을 low를 인가시켜 T3을 켭니다. 만약 C가 low 전압을 가지고 있다면 T2가 켜집니다. T3과 T2를 통해 감지 선과 접지가 연결됩니다. 반면에 C가 high 전압을 가지고 있다면, T2는 꺼지며 감지 선은 접지되지 않습니다. 따라서, 감지 선에 연결된 회로로 C에 어떤 값이 저장되어 있는지 말할 수 있습니다.


동적 RAM의 불편한 점은 값을 일시적으로만 저장할 수 있다는 것입니다. 수백 마이크로초 후에 커패시터 C에 저장된 전하가 새어나와 값이 손실될 수 있습니다. 해결책으로는 비트가 사라지기 전에 정기적으로 각 값들을 읽고 다시 똑같은 곳에 쓰는 리프레시 회로를 넣는 것입니다. (비슷한 리프레시 과정이 당신의 컴퓨터 RAM 속에서도 사용됩니다.) 8008의 내부 RAM은 반드시 값을 잃지 않기 위해 적어도 매 240ms마다 리프레시됩니다. (반면에 정적 램은 커다랗고 더 복잡한 회로가 필요합니다. 그러나 전원이 유지되는 동안 비트도 유지됩니다.)


8008의 스택 메모리(그리고 레지스터)는 각 엔트리를 계속해서 돌아가며 리프레시합니다: 비트를 읽고 다시 쓰고. 이것을 해내기 위해, 두 번째 3-비트 시프트 레지스터 카운터가 리프레시 카운터로 사용되어 리프레시되는 현재 위치를 추적합니다. 이것은 한 방향만 있으면 되기 때문에 카운트 다운 회로가 누락 된 것을 빼놓고는 스택 카운터와 회로가 동일합니다.



다이 사진의 이해


위의 다이 사진에서 무엇을 볼 수 있는지 간단하게 설명드리겠습니다. 칩 자체는 실리콘 웨이퍼로 만들어집니다. 실리콘 자체는 기본적으로 부도체입니다. 그러나 불순물을 첨가하면 반도체로 바뀝니다. 검은 선은 이 첨가된 것과 첨가되지 않은 것의 경계를 나타냅니다. 첫 번째 셀에서 불순물이 첨가된 실리콘이 빨간색인 것을 볼 수 있습니다.


실리콘 상단에는 노란색 줄무늬처럼 생긴 폴리실리콘 레이어가 있습니다. 폴리실리콘은 도체이고 칩 내부의 와이어링용으로 사용합니다. 더 중요한 것은 트랜지스터는 불순물이 첨가된 실리콘과 폴리실리콘을 가로지를 때 만들어진다는 것입니다. 얇은 산화막은 폴리실리콘과 실리콘 사이를 분리시키고 트랜지스터 게이트를 형성합니다. 폴리실리콘 게이트에 low 전압을 인가하면 트랜지스터가 전도되어 두 부분(source와 drain)을 연결합니다. 게이트에 high 전압을 인가하면 두 부분이 차단되어 트랜지스터가 꺼집니다. 따라서, 트랜지스터는 게이트로 제어되는 스위치 처럼 작동합니다.


칩의 상단 레이어는 금속층으로, 와이어링을 하는데 사용됩니다. 위의 사진에서는 염산으로 금속층을 제거하고 속에 있는 실리콘이 더 잘 보이도록 한 것입니다. 녹색, 파란색, 회색 선은 제거되기 이전의 금속 배선을 나타냅니다. 트랜지스터 T1, T3은 감지 선(파란색)에 트랜지스터 T2는 접지(녹색)에 연결되어 있습니다. 읽기, 쓰기 선은 폴리실리콘 선과 연결된 왼쪽의 금속 배선과 같이 왼쪽 회로로 들어갑니다.



스택과 데이터 버스 간의 인터페이스


메모리에 접근하기 위해서는 스택에 있는 주소가 반드시 칩에 있는 8 데이터/주소 핀을 통해 외부 메모리로 제공되어야 합니다. 이 핀들은 데이터 버스를 통해 스택(과 8008의 다른 부분)에 연결됩니다. 아래의 다이 사진은 8-비트 데이터 버스와 14-비트 스택 스토리지를 연결하는 인터페이스 회로입니다.[주석11] 사진의 위에는 금속 제어선과 세 개의 데이터 버스 선이 있습니다. 아래에는 앞에서 설명한 스택 스토리지의 감지 선이 있습니다. 그 사이에는 데이터 버스와 스택에 연결된 트랜지스터(주황색)입니다.


제어선은 주소의 절반 low(L)이나 high(H) 중 하나를 선택합니다. 적절한 스택 열을 데이터 버스에 연결시켜 적절한 읽기나 쓰기 트랜지스터를 활성화시킵니다.


스택/버스 드라이버 회로는 데이터 버스와 스택 DRAM 스토리지 사이의 "접착제"를 제공합니다.


데이터 버스에 주소를 쓰는 트랜지스터는 일반적인 트랜지스터보다 훨씬 더 크기 때문에, 다이 사진에서 수직 방향의 노란색 막대가 해당 트랜지스터인 것 같습니다. 이렇게 큰 이유는 데이터 버스는 칩의 전체를 통과하기 때문입니다. 버스가 길기 때문에 상대적으로 정전 용량이 커야 하고 데이터 버스로 신호를 보내는 데 높은 전류 트랜지스터가 필요합니다.


사진의 아래 부근에는 인버터 증폭기가 있습니다. 각 감지 선은 스택 스토리지의 신호를 증폭시켜주는 인버터에 연결되어 있습니다. 리프레시 동안 이 증폭된 신호는 다시 쓰여지며, 커패시터에 증폭된 신호를 저장하게 됩니다.[주석10]



결론


다이 사진을 살펴본 결과, 8008 마이크로프로세서의 리버스 엔지니어링은 가능했습니다. 8008의 특이한 기능중 하나는 내부에 표준 바이너리 카운터 대신에 게이트 수를 아끼기 위해 시프트 레지스터 카운터를 사용했다는 것입니다. 비록 이 카운터는 순차 대신에 의사 난수 순서지만 8008은 제대로 동작합니다. 한 카운터는 온칩 주소 스택을 사용합니다. 또한 8008은 내부의 스택 스토리지와 레지스터 스토리지용으로 DRAM을 사용하며 이 DRAM을 리프레시하기 위해 두 번째 카운터가 필요합니다. 초기 마이크로프로세서의 모든 트랜지스터는 귀중한 것이었고, 따라서 8008은 작은 회로로 생산하기 위해 흥미롭게 설계했습니다.


만약 당신이 8008에 관심이 있다면, 저의 이전 게시글에 아키텍처에 대한 자세한 설명과 더 많은 다이 사진 그리고 정보들이 있습니다. 8008의 ALU에 대해 설명하는 글도 있습니다.


트위터에 저의 최신 블로그 포스트를 알리기 때문에, kenshirriff를 팔로우해주십시오. RSS 피드도 있습니다



'IT > 외부기사(번역글)' 카테고리의 다른 글

산술 프로세서 : 과거와 현재  (0) 2017.02.11
MIPS R2000 출시 30주년  (0) 2017.02.07