ALU는 다양한 산술/논리 연산이 가능한 하나의 유닛이다.
전형적인 ALU는 addition, subtraction, AND, OR 연산을 수행한다.

ALUControl signal은 다음과 같이 구성될 수 있다.
| ALUControl | Function |
|---|---|
| 00 | Add |
| 01 | Subtract |
| 10 | AND |
| 11 | OR |

위 ALUControl signal을 토대로 완성한 ALU의 모습이다.
4×1 mux를 이용해 연산 종류를 결정한다.
ALUControl signal이 00일 경우, 의 비트를 그대로 받아오고 밑에 블록에서 와 Sum을 수행한 후 mux의 00으로 결과를 보낸다.
ALUControl signal이 01일 경우, 의 비트는 반전되어 받아지고, 와 Sum을 수행할 때 1이 더해진다. 이를 통해 를 수행한다.
mux 위의 두 블럭이 ALUControl sigal의 마지막 1비트만 받는 이유가 바로 이 것이다.
어떤 ALU들은 연산 결과의 정보에 대한 추가적인 output을 내는데, 이를 flag라고 부른다. 예를 들어, 연산 결과가 음수인지, 0인지, carry out이 발생했는지, 오버플로우가 발생했는지 알려주는 정보인 것이다.
flag에는 가 있다.

(Negative flag)
연산 결과가 음수(Negative)인지 알려주는 flag이다.
ALU output의 msb(=sign bit)와 연결되어있다.
(Zero flag)
연산 결과의 모든 bit가 0(Zero)인지 알려주는 flag이다.
ALU output 전체를 NOR게이트(모두 0이면 1, output bit에 1이 하나라도 있으면 0)에 통과시켜 계산한다.
위 회로에서는 NOR이 아닌 NAND를 사용했는데, 진리표를 작성해보면 이 경우도 동일하게 작동함(모든 입력 bit가 0이면 출력은 1)을 알 수 있다.
(Carry out flag)
adder가 올림/내림(Carry out)을 발생시키는지 알려주는 flag이다.
Sum block의 과 ALUControl의 첫 번째 bit(현재 연산이 addition/subtraction인지 판별하기 위함)의 반전을 AND 연산 하여 계산한다.
(Overflow flag)
ALU의 addition/subtraction 연산 수행 결과로 overflow가 발생하는지 알려주는 flag이다.
overflow는 sign bit가 같은 두 숫자의 합의 결과가 반대 sign을 가지는 경우이다. 따라서 flag는 다음 세 조건이 모두 만족할 때 1을 가진다.
1) ALU가 addition 또는 subtraction을 수행할 것(ALUControl=0)
2) 와 의 sign이 반대일 것
3) addition(ALUControl=0)에서 와 의 sign이 같거나 subtraction(ALUControl=1)에서 와 의 sign이 다를 것
ALU flag는 comparision 연산에도 사용될 수 있다.
| Comparison | Signed | Unsigned |
|---|---|---|
ALU에 SLT를 추가하기 위해서는 mux를 확장하여 ALUControl signal을 수정해야한다.
| ALUControl | Function |
|---|---|
| 000 | Add |
| 001 | Subtract |
| 010 | AND |
| 011 | OR |
| 101 | SLT |
SLT의 Control signal을 살펴보자
ALUControl = 0 addition/subtraction 수행
ALUControl= 1 subtraction 수행
SLT의 연산이 를 기반으로 수행되기 때문에 이러한 구성이 필요하다.
이후 Sum의 msb를 0으로 확장시켜 결과를 출력한다.

(a) overflow를 고려하지 않은 SLT가 추가된 ALU,
(b) overflow가 고려된 SLT가 추가된 ALU
<참고자료>
Harris & Harris, Digital Design and Computer Architecture, RISC-V Edition, 2022.