[Computer Architecture] Processor Implementation with MIPS(2)

G·2023년 4월 23일
0

Computer Architecture

목록 보기
13/16
post-thumbnail

이전 포스트에 이어서 진행한다.

Branch Instruction

beq $t0, $t1, immediate

Brach Instruction을 위해 I-format instruction의 immediate값을 16bit을 왼쪽으로 2bit shift하고 sign-extend하여 주소값에 맞게 만들어준다.(4 align), 이후 PC+4와 더하여 branch를 수행한다.

$t0과 $t1에 저장된 값을 빼, zero인지 확인하고 맞으면 branch, 아니면 branch 하지 않는다.

위와 같은 형태로 구현된다.

  1. 5bit 5bit의 register값을 넣어주고 두 값의 차가 0과 같은지 확인한다.
  2. 16bit의 값을 왼쪽 2bit shift, sign-extend를 한다.
  3. 1의 결과값이 0과 같다면 PC+4와 더하여 PC값을 업데이트한다.
  4. 0과 같지 않다면 PC+4로 PC를 업데이트 한다.

지금까지 9개의 instruction을 확인했다. 각각의 instruction은 한 clock cycle당 한 번씩 발생한다.

이제 각각의 instruction을 수행하는 하드웨어들을 하나로 연결하여 알아보자.

Full Datapath

하나로 연결한 구현을 보기 이전에, 각각의 Instruction은 ALU를 사용해야한다.
이는 R-format일 경우 funct에 따라 달라진다. I-format일 경우 Opcode를 통해 ALU를 제어한다.

  • Load/Store: add
  • Branch: subtract
  • R-type: funct field

opcode에서 가져온 2bit ALUOp과, 이 ALUOp를 통해 ALU control을 정한다.

위의 진리표를 통해, Opcode의 2bit과 funct를 통해 ALU control bit을 구할 수 있다.


이는 MUX에 0또는 1값을줘 값을 선택한다. 예를 들어, 우측 상단의 ALU 결과값에 Opcode가 branch, 그리고 두 레지스터의 값이 같을 경우 모두 1이기 때문에 , AND 연산을 통해 1값을 MUX에 전달한다.

두 값이 모두 1이라면 MUX를 통해 branch할 주소가 선택되어 PC가 업데이트 된다.

위의 경우에서 Control주는 값을 형태로 알아보자.

R-type

RegDstALUSrcMemtoRegRegWrtieMemReadMemWriteBranchALUOp
100100010

Load

RegDstALUSrcMemtoRegRegWrtieMemReadMemWriteBranchALUOp
011110000

Branch on Equal Instruction

RegDstALUSrcMemtoRegRegWrtieMemReadMemWriteBranchALUOp
x0x000101

Regwrite가 0으로 결정됐기 때문에, RegDst와 MemtoReg는 어떤 값이여도 괜찮다.

Jump

RegDstALUSrcMemtoRegRegWrtieMemReadMemWriteBranchALUOpJump
xxx000xxx1

RegWrite, MemRead, MemWrite가 모두 0이므로 나머진값은 필요없다.
Jump 26bit 값에 4를 곱하고 PC+4의 상위 4bit와 조합해 jump할 주소를 만든다.
ALU를 사용할 필요가 없기에 ALUOp도 xx가 된다.

profile
열심히 안 사는 사람

0개의 댓글