AND, NOT, OR등이 있다.
AND는 곱하기 기호, OR은 덧셈 기호, NOT은 켤레 기호(가로작대기)
Select 조건에 따라 입력 A와 B중 하나를 선택해서 반환하는 경우 Multiplexor(MUX)라고 한다.
Register(FF)
데이터를 저장하는 서킷이다.
Clock으로 저장 시기를 저장한다. 0에서 1로 올라가는 순간 저장하고 다음 사이클의 0에서 1로 올라가는 차례가 돌아올 때 반환한다. 따라서 레지스터에서 데이터는 한 cycle동안 저장된다.
Register Write Control
레지스터에 write신호가 전달되었을 때만 데이터를 반환한다.
신호가 없으면 반환하지 않고 가지고 있는 데이터를 유지한다.
PC로부터 특정 Instruction을 가져오는 기능이다.
PC 값에 4를 더해서 Instruction memory에 전달해주면, 다음 사이클에는 4를 더한 값을 읽을 수 있다.
들고 온 명령어를 해석한다.
opcode, func3, func7등을 활용해 명령어의 타입, 종류를 구분한다.
또한 어떤 레지스터를 사용하는지, Immediate 명령어인지 등을 판별한다.
1. R-Format
rs1, rs2, rd를 갖춘 R-format 명령어의 경우 decoding으로 명령어를 구분한 후 결과값을 레지스터(rd)에 전송한다.
RegWrite
명령어 중에 rd가 존재하지 않는 종류도 있기 때문에 write를 수행할지 말지 RegWrite를 통해 결정한다. 0이면 do not write, 1이면 write에 해당한다.
R-format의 경우 rd가 무조건 존재하므로 RegWrite가 1이다.
2. load/store
둘 다 rs1과 Immed를 가진다.
이 때 Immed가 12비트이므로 계산을 위해서 32비트로 늘려주어야 한다. 이 기능을 ImmGen이라는 컴포넌트가 수행한다. 비트 연장은 Sign Extension을 통해서 한다.
load의 경우 address만 받아 데이터를 읽고, store의 경우 write data도 같이 받아서 메모리에 적재한다.
MemRead, MemWrite
load와 store를 구분하기 위해 사용하는 시그널이다.
3. branch
레지스터 값을 읽은 뒤 비교를 위해 뺄셈을 수행한다.
이후 브랜치를 이동하기 위해 PC값을 업데이트하는데, Immed값을 1만큼 shift left 한 다음 PC에 더하면 된다.
MemtoReg
store word에서는 레지스터에 값을 적재하든 말든 상관 없다. 따라서 memtoreg가 0과 1중에 무엇이어도 상관 없으며, 이런 경우에 x라고 적는다.
PC
브랜치 연산일 경우에는 오프셋, 아니면 자연스럽게 다음 명령어로 넘어가기 위해 4를 더하는 작업을 해준다.