오늘 끝나면
나만의 ALU
- ✓나만의 ALU의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 나만의이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
연산을 골라 opcode로 — Z/N/C/V 플래그와 면적·지연 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
반도체 설계 · 09
나만의
ALU
지금까지 만든 가산기, 논리, 시프트를 한 상자에 모은다.
opcode 한 줄로 그중 하나를 골라 결과와 플래그를 낸다.
여기서 내 CPU가 무슨 연산을 할 수 있는지 처음 정해진다.
ALU = 연산 블록 한 상자
ALU(Arithmetic Logic Unit)는 새 회로가 아니다. 이미 만든 연산들을 한 상자에 모은 것이다.
상자 안에 ADD, SUB, AND, OR, XOR, SHIFT 블록이 나란히 들어간다.
같은 A와 B가 모든 블록에 동시에 들어가 제각기 결과를 만든다.
그중 어느 결과를 내보낼지는 opcode 한 줄이 고른다.
이 고르는 장치가 멀티플렉서(MUX)다. 여러 입력 중 하나만 출구로 통과시킨다.
opcode가 000이면 ADD 결과, 001이면 SUB 결과 식으로 한 줄이 길을 정한다.
16비트 머신이라 각 블록은 16비트 입력을 받아 16비트 결과를 낸다.
opcode가 연산 번호다
opcode는 ‘몇 번 연산을 할래?’를 적은 비트 묶음이다. 연산마다 번호를 매긴다.
연산이 4개면 번호는 0부터 3까지고, 2비트면 다 가리킨다.
8개면 0부터 7까지라 3비트가 필요하다.
opcode n비트로 2의 n승개 연산까지 구분한다. 연산을 늘릴수록 opcode 비트도 넓어진다.
이 번호 약속이 곧 명령어 체계의 씨앗이다.
나중에 CPU가 메모리에서 명령을 읽으면, 그 안의 opcode 비트가 ALU에게 ‘이번엔 이 연산’이라고 지시한다.
어떤 연산에 몇 번을 줄지, 이 배치가 최종 MyChip의 명령어 집합으로 굳는다.
| opcode 폭 | 연산 수 | 예 |
|---|---|---|
| 1비트 | 2개 | 00? → 2종 |
| 2비트 | 4개 | ADD·SUB·AND·OR |
| 3비트 | 8개 | + XOR·SHL·SHR… |
| 4비트 | 16개 | + MUL·CMP… |
n비트 → 2ⁿ개 연산
결과 옆에 플래그 Z·N·C·V
ALU는 16비트 결과만 내지 않는다. 그 결과가 어땠는지 알리는 깃발 네 개를 같이 세운다.
Z(Zero)는 결과가 0이면 1이 되고, 두 수가 같은지 볼 때 쓴다.
N(Negative)은 결과 MSB가 1, 즉 음수면 1이 된다.
C(Carry)는 자리올림과 자리내림, 시프트로 밀려난 비트를 담는다.
V(oVerflow)는 부호 범위를 벗어나 부호가 깨졌을 때 선다.
한 비트씩이지만 이 네 깃발이 분기(branch)의 재료다.
‘같으면 점프’는 Z를 읽고, ‘작으면 점프’는 N과 V를 읽는다. 비교(CMP)는 결과를 버리고 깃발만 남기는 뺄셈이다.
논리 연산(AND, OR, XOR)은 C와 V가 의미 없어 Z와 N만 갱신한다. 어떤 깃발을 둘지가 MyChip 제어부 설계로 이어진다.
Zero결과 = 0
같음 비교 · 분기
NegativeMSB = 1 (음수)
부호 판정
Carry자리올림 · 밀린 비트
무부호 비교 · 다중정밀
oVerflow부호 범위 넘침
부호 연산 안전
직접 ALU를 구성해 본다
오른쪽에서 연산을 켜고 끄며 내 ALU를 짠다. 켠 순서대로 opcode가 매겨진다.
연산 하나를 고르고 A와 B를 슬라이더로 정한다.
실행 전 Z·N 플래그를 먼저 예측해 찍고, 실행하면 결과 비트열, 플래그와 비교된다.
고른 연산 행만 진하게, 안 켠 연산은 흐리게 표시된다.
밑의 근거 패널에서 결과 16비트와 Z, N, C, V 판정 근거를 본다.
그 아래 면적과 지연 막대가 이 구성의 비용을 보여준다. 연산을 더 켜면 막대가 길어진다.
지금 켠 이 연산들이 곧 최종 MyChip이 할 수 있는 일의 목록이다.
켠 순서대로 opcode 0부터 매겨진다 · 흐린 줄은 ALU에 안 들어간다
결과가 0이면 1
MSB가 1이면 1
실행하면 비트열이 나온다
Z=결과 0 · N=부호비트 · C=자리올림/밀린비트 · V=부호오버플로우
연산을 더 켜면 기능 ↑ · 면적·복잡도 ↑, 이 구성이 곧 MyChip의 명령어 집합이 된다
기능 vs 면적·지연 trade-off
연산을 다 넣으면 좋겠지만, 연산은 공짜가 아니다.
연산 블록 하나하나가 실제 게이트로 깔린다. 블록을 더 켤수록 칩 면적이 커진다.
opcode를 고르는 MUX도 입력이 많아질수록 단이 깊어져 지연이 늘어난다.
게다가 16비트 가산기처럼 폭이 넓은 블록은 carry 전파 때문에 가장 느린 경로(임계 경로)를 지배한다.
그래서 설계는 결국 고르는 일이다. 쓰는 연산만 넣고, 비트 폭은 필요한 범위에 맞춘다.
작은 마이크로컨트롤러는 ADD, AND, 시프트 몇 개로 끝내고, 큰 CPU는 곱셈기까지 욱여넣는다.
내가 켠 연산 목록과 비트 폭이 MyChip의 면적과 속도를 결정한다.
Q. ALU에 연산을 더 많이 넣으면 어떻게 되나?
기능은 늘지만 면적과 복잡도가 함께 늘어난다.연산 블록마다 게이트가 깔려 면적이 커지고, 고르는 MUX 단이 깊어져 지연도 늘어난다.
그래서 무작정 다 넣지 않고, 쓰는 연산만 골라 기능과 비용 사이에서 균형을 잡는다. 이게 trade-off다.
ADD·AND·SHIFT
+ SUB·OR·XOR
+ MUL·CMP·회전