1.
먼저 eclipse에서 code의 Dump file을 확인한다.
하면 아래와 같은 코드들로 이루어져 있다.
32bit라 가정하면, Hex를 2진수로 분해한다.
58: 3ff7c793 xori a5,a5,1023
80: fee7f4e3 bgeu a5,a4,68 <???+0x58>
예를 들어 xori를 분해하면,
3ff7c793 == 0011_1111_1111_0111_1100_0111_1001_0011로 볼 수 있다.
2.
그러면 이게 어느 type인지 확인한다.
가령 xori는 i가 붙어있기 때문에 I-Type이라 유추할 수 있고,
bgeu는 b로 시작하게 때문에 B-Type이라 유추할 수 있다.
맞는 포맷을 찾아본다.
3.
CPU는 opcode와 funct3, 7 통해 어떤 동작을 할지 정하니까 instruction을 분해한다.
control_unit과 레지스터와 imm로 분해해서 집어넣는다. extension도 해야 되고 type에 따라 control signal도 지정해줘야 한다.
4.
다음으로는 Verliog의 파일에 따라 동작을 수행하는데 instruction에 맞게 동작하는지 본다.
xori를 기준으로 보면, 먼저 I-type일 때 어떤 동작을 할지 적어준다. addi, andi와 같이 여러 동작이 있기 때문에 case문에 집어 지정해준다.
어떤 동작인지 알기 위해선 funct3와 funct7으로 구분하는데 I type에서는 funct3만 존재한다. 그래서 위에서 분해해 놓은 funct3일 때 ALUcontrol 신호를 어떻게 할지 정한다. 이건 정해놓은 포맷을 따른다. xori 같은 경우에는 ALUcontrol 신호가 "00011"이다.
5.
ALUcontrol 신호를 받았으니 이 신호를 ALU에 넘겨주면 ALU는 "아 이게 xori 연산하라는 거구나" 안다.
그래서 ALUsrc1과 ALUsrc2를 xori연산을 진행한다. 결과를 가지고 메모리에 접근할지 말지는 명령어에 따라 달라진다.
5-1.
이때 ALUcontrol신호는 5bit인데 MSB ( 부호 bit )를 확인해서 동작을 바꿔줘야 될 수도 있다.
댓글