오늘 끝나면
명령어와 ISA 설계
- ✓명령어와 ISA 설계의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 명령어와이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
opcode·register·immediate를 비트에 — MY-16 만들기 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
반도체 설계 · 16
명령어와
ISA 설계
CPU에게 시킬 일도 결국 0과 1이다.
무슨 연산을 할지, 어느 레지스터를 쓸지, 어떤 상수를 넣을지를
16비트 한 워드에 나눠 담은 것이 명령어다.
명령어 = opcode + register + immediate
CPU는 한국어를 못 읽는다. ‘R2에 R1을 더해라’ 같은 명령도 결국 0과 1 묶음 하나로 줘야 한다.
그 묶음을 명령어(instruction)라고 한다. 16비트 워드 하나에 세 가지를 나눠 담는다.
opcode는 무슨 연산인지 정한다. 더해라, 빼라, 옮겨라 같은 것이다.
register는 어느 레지스터를 쓰는지 가리킨다. R0부터 R7까지 중 둘이다.
immediate는 명령어 안에 박아 넣은 상수다. 예를 들어 +5다.
그래서 ADD R1, R2는 사람이 보는 글자이고, 실제 메모리에는 비트 16칸으로 들어간다.
이 칸을 어떻게 나눌지 정하는 것이 명령어 포맷 설계다.
ADD R1, R2
비트를 어디서 끊나, 필드 경계
16칸은 그냥 일렬이다. 어디서 끊어 어느 필드로 읽을지는 약속으로 정한다. 그 약속이 곧 포맷이다.
보통 MSB(맨 왼쪽)부터 opcode를 둔다. 디코더가 명령어를 읽을 때 제일 먼저 무슨 연산인지부터 알아야 하기 때문이다.
그 뒤로 레지스터 번호 필드가 오고, 마지막에 immediate가 온다.
R0부터 R7까지 여덟 개를 가리키려면 레지스터 한 칸당 3비트면 된다 (2³ = 8).
두 레지스터를 쓰면 3 + 3 = 6비트가 레지스터 몫이다.
남는 비트를 opcode와 immediate가 나눠 가진다. 여기서 줄다리기가 시작된다.
opcode ↔ immediate 트레이드오프
워드는 16비트로 고정이다. 늘릴 수 없는 예산을 opcode와 immediate가 나눠 쓴다.
opcode 비트를 한 칸 늘리면 명령 종류가 두 배가 된다 (2ⁿ). 4비트면 16종, 5비트면 32종이다.
그런데 그 한 칸은 어딘가에서 빼와야 한다. 대개 immediate에서 가져온다.
immediate 비트가 한 칸 줄면 표현할 수 있는 상수 범위가 절반이 된다.
6비트면 부호 있는 수로 −32~31, 5비트면 −16~15다.
명령을 다양하게 할지, 큰 상수를 넣을지 정답은 없다. 설계 선택만 있을 뿐이다.
| opcode | 명령 수 | imm 비트 | 상수 범위 |
|---|---|---|---|
| 3b | 8종 | 7b | −64~63 |
| 4b | 16종 | 6b | −32~31 |
| 5b | 32종 | 5b | −16~15 |
| 6b | 64종 | 4b | −8~7 |
직접 필드를 잘라 MY-16을 만든다
슬라이더로 opcode와 immediate 비트를 옮기면 16칸이 실시간으로 재배치된다.
필드 합이 16을 넘으면 충돌로 빨갛게 뜨고, 모자라면 남는 칸이 낭비로 흐려진다. 딱 16에 맞춘 한 줄이 곧 MY-16 포맷 후보다.
딱 맞는다, 16비트를 한 칸도 안 남기고 다 쓴다.
opcode 4비트 = 명령어를 16종까지 정의 가능
상수 칸, 부호 있으면 -32~31
MY-16 포맷 후보. 이 배치가 17강 디코더와 최종 MyChip ISA로 들어간다.
16비트는 고정 예산이다. opcode↑ → 명령 종류↑·imm 범위↓ (절반씩). opcode↓ → imm 넓어짐·명령 수↓. 이 줄다리기가 ISA 설계의 핵심이다.
MY-16 만들기, 균형 잡힌 한 줄
이 강의 결정판은 균형 잡힌 MY-16 한 줄이다. 16비트를 한 칸도 안 남기고 셋이 나눠 쓴다.
opcode 4비트는 명령 16종을 담는다. ADD, SUB, LD, ST, JMP까지 한 세트로 충분하다.
regA 3 · regB 3은 R0부터 R7까지 두 레지스터를 지정한다.
immediate 6비트는 부호 있는 상수 −32~31을 담는다.
4 + 3 + 3 + 6 = 16, 빈틈 없이 딱 맞는다.
이게 정답이라서가 아니라 균형이라서 고른 것이다. 상수를 더 키우고 싶으면 opcode를 3비트로 줄이고, 명령을 더 늘리고 싶으면 imm을 깎으면 된다.
Q. opcode 비트를 한 칸 늘리면 어떻게 되나?
정답은 명령 종류는 두 배로 늘고, 대신 immediate 범위는 절반으로 줄어든다는 것이다.워드는 16비트로 고정이라, opcode가 한 칸 먹으면 그 칸을 immediate에서 빼와야 한다.
opcode를 4비트에서 5비트로 늘리면 명령은 16종에서 32종으로 늘고, immediate가 6비트에서 5비트로 줄면 상수 범위는 −32~31에서 −16~15로 좁아진다.
4 + 3 + 3 + 6 = 16 · 딱 맞는다