컴퓨터구조 - DevWoony가 복습을 위해서 전공과목을 정리하는 내용이에요!
Arithmetic for Computers
지금까지는 MIPS의 Instruction Set Architecture(ISA)와 Assembly Language, Machine Language에 초점을 맞추어 공부했었다.
이번에는 MIPS의 ALU 모듈에 초점을 맞춰서 공부해보자!

Numbers
- Bits : 0과 1 한자리수
- Binary numbers : bits의 집합으로 나타낸 2진수
해결해야할 문제점 :
- 제한적인 범위라서 Overflow을 발생
- 실수와 분수 표현
- 음수 표현
Negative Number

- Sign Magnitude : MSB를 +, - 표현으로 사용
- 1's Complement : MSB에 따라 역수시킨뒤 +, -표현으로 사용
- 2's Complement : MSB에 따라 역수시킨뒤 1을 더하고 +, -표현으로 사용
- Good

MIPS 32 bit signed numbers


Sign Extension
- n bit 길이의 Signed 숫자를 더 길게 만드는 방법이다.
- MIPS에서는 16 bit의 immediate constant가 명령어 안에 존재하는데 ALU는 32 bit로 계산하기 때문에 전환이 필요하다.
- Sign Extention은 다음과 같이 MSB를 그대로 복사하여 bit를 확장한다.

Addition & Subtraction
- 2의 보수로 인해 덧셈, 뺄셈이 매우 쉽다.
- 9 - 6 은 다음과 같이 계산된다.

Overflow
-
Overflow는 컴퓨터의 word에 담을 수 없는 결과가 나왔을때를 의미.
-
주의할점! Overflow와 Carry 발생은 개별적인 개념.

-
위 그림과 같이 Signed Number 라 가정했을때 부호가 바뀌는 경우는 Overflow.

-
4bit Signed Number 범위는 -8 ~ 7 까지
-
위 그림은 모두 Overflow가 발생하는 예제

-
양수와 음수를 더 할때는 Overflow가 발생하지 않는다.
-
Sign이 같은 수들의 뺄셈에서는 Overflow가 발생하지 않는다.

-
위 그림의 두번째 경우에는 A - B에서 -B가 결과로 나오는데 B의 범위가 INT_MIN일 때 Overflow를 발생시킬 수 있다.
Overflow Detecting

- 위 그림과 같은 수를 더한다고 가정한다.
- 덧셈에서의 Overflow는 같은 sign이 더해질때 그 결과가 다른 sign을 가지면 Overflow이다.
- 다음과 같은 식으로 Detect 할 수 있다.

- 다른 방법으로는 Carry와 MSB를 XOR 시켜서 Detect 할 수 있다.

- Unsigned에서는 MSB로 Carry가 발생하면 Overflow가 Detect된다.

- MIPS에서는 Signed Number의 arithmetic 명령어(add, sub, addi)에서는 Overflow의 예외처리를 발생한다.
- MIPS에서는 Unsigned Number의 arithmetic 명령어(addu, subu, addiu)에서는 Overflow의 예외처리를 발생하지 않는다.
- 인덱싱이 중요한 Language 에서는 Overflow를 무시하는 명령어를(add, sub, addi), 숫자가 중요한 Language에서는 Overflow를 캐치하는 명령어를(addu, subu, addiu) 쓴다.
ALU(Arithmetic Logic Unit)
- AND, OR, ADD, SUB, BEQ 명령어를 실행하는 32-bit ALU를 만들자!
- 일단 1 bit AND, OR, ADD을 위한 덧셈기를 만들자!
AND, OR, ADD, SUB(Binvert 사용)
- 1 bit ADDER with Carry out [0:30]

- 1 bit ADDER with Overflow Detection [31:30]

NOR을 추가해보자

SLT는 어떻게??
마지막 뺼셈 진행시 Overflow으로 1bit ALU로 전송


BEQ는 어떻게????
zero flag를 만들어서 뺄셈을 통해 0인지 아닌지를 출력

최종 Verilog Behavior Code

Ripple Carry Adder의 문제점
- 지금까지 작성한 ALU는 Ripple Carry Adder 형태이다.
- Ripple Carry Adder의 경우 1 bit Adder의 결과가 나와야 carry out을 통해서 2bit Adder의 결과를 볼 수 있고 마찬가지고 32bit 까지의 결과를 확인하기 위해서 이전 bit의 Adder가 모두 통과되어야 하기 때문에 성능이 떨어진다.

Carry-lookahead Adder
- 그러면 n-1번째 bit로부터 carry over을 기다리지 않고 n번째 bit의 carry-out을 연산하자.
- Carry식은 다음과 같다.

- Carry식에서 propagate을 추출 및 정의한다.
- Carry in이 있어야 carry 발생가능

- Carry식에서 generate을 추출 및 정의한다.
- 이는 순수 두수의 연산으로 carry가 발생

- Carry 다음과 같이 다시 쓰여진다.

- 이제 Carry Out은 c에 의존하지 않고 p와 g에 의해 표현이 가능하다.

Various Adders

- 그래픽이나 미디어 처리를 위해서 8-bit, 15-bit 데이터의 백터를 처리해야한다.
- 64-bit를 8,16,32 bit adder 여러개로 carry로 묶어서 구현한다.
SIMD (Single Instruction Multiple Data)
- SIMD는 여러개의 데이터에 대해서 같은 명령어를 병렬로 수행하는 설계이다.

출처: [Computer Organization And Design: The Hardware/Software Interface]