티스토리 뷰

Q. For the single cycle Implementation에서 add instruction 이 실행될 때 data의 흐름 / ALU operation / register, memory enable의 값을 표현하시요. 

우선 Add instruction을 수행하는 과정의 첫번째는 instruction내에 어떤 값들이 포함되어 있는지를 확인해봐야 한다. instruction에 포함되어 있는 명령어는 크게 4가지로 나눌수 있는데 그중 add,sub 같은  arithmetic 관련 명령어이 포함되어 있는 instruction은 Register type Format (R-type format)의 형태를 지닌다.  



첫번째 상위 6bit은 opcode라고 하고 사전에 정의된 command를 분별하는 역할을 한다. 즉 위의 문제에서는 add 명령에 해당하는 opcode가 여기에 들어갈 것이다. 하지만 사실 이말은 논리적으로 맞는 말이지만 지금 위에서 설명하는 MIPS Architecture에서는 조금 설명하는게 다르다. 위에서 보다시피 opcode를 구성하는 bit수는 6 bit이다. 그럼 이걸로 표현할 수 있는 최대 instruction 수는 2^6=64개이다. 그런데 더 깊이 들어가면 이 64개로는 모든 instruction을 정의할 수 없다는 것을 알 수 있다. 이 때문에 하위 6bit을 따로 두어서 같은 opcode내에서도 역할을 구별하는 역할을 해준다.  예를 들어서 add는 000000(opcode)+100000(funct) 이고, sub의 경우에는 000000(opcode)+100010(funct)로 구별되는 것이다. 그리고 산술연산인 만큼 인자가 저장된 register의 정보가 필요할 것이고 상황에 따라서는 shift bit을 표현하는 것도 필요할 것이다.

 지금 위에서 설명한 것처럼 instruction을 분해하는 과정이 바로 instruction이 수행되는 첫번째 과정이다. 이런 instruction이 바로 instruction Memory에 순차적으로 저장되어 있기 때문에 이걸 한 cycle마다 instruction을 수행하는 것을 Single Cycle Implementation이라고 하는 것이다. 

 우선 이런 instruction이 instruction Memory상에서 4Byte 단위로 저장되어 있다.(Byte Address) 때문에 각 cycle마다 instruction을 수행하기 위해서는 내부적으로 4byte씩 counting을 해줘야 하며 이 역할을 PC Counter가 해줄 것이다.


결국 내부적으로 현재의 Counter를 읽어주는 PC Counter와 4씩 increment해주는 ALU가 있다면 이부분은 해결 될 것이다.  



앞에서 설명한 것처럼 Instruction을 각각의 역할에 맞게 나눠져야 하며 우리가 add를 통해서 필요한 인자는 register를 통해서 받아와야 한다. 이 때문에 앞에서 보았던 R-Format 중 source register를 나타내는 I[25:21]과 Target register를 나타내는 I[20:16]을 Read Register에 넘겨줘야 한다. 이 부분은 빨간색으로 표현되어 있다. 또한 이렇게 얻은 결과를 저장하기 위한 destination register도 알려줘서 연산이 끝난후에 지정된 곳에 저장되도록 해야 한다. 중간에 Multiplexer가 들어간 이유는 instruction format에 따라서 나눠지는 bit수도 달라지기 때문이다. 잘 보면 이 Multiplexer의 input으로 RegDst가 있는데 이 값에 따라서 data flow가 결정된다. 다시 말하면 instruction의 종류에 따라서 이런 신호가 알맞게 선택되는 것이다. 그래서 저렇게 표현된 신호를 보통 control signal이라고 한다. 따라서 instruction이 나오면 해당 부분에 대한 control signal도 자동으로 계산되며, 이에 맞게 설계하는 것이 이 과목을 수강하는 이유가 될 것이다. 위의 경우에는 RegDst를 1로 세팅해서 들어오는 I[15:11]을 Destination Register로 사용하겠다는 것을 표현하고 있다.

 아무튼 이로써 rs와 rt,rd에 대한 정보를 알 수 있었다. 이제 무슨 연산을 할 건지 ALU에 알려줘야 하는데 이 부분도 앞에서 설명한 opcode+funct의 결합 형태로부터 빼와야 한다. 이부분은 보라색으로 표현되어 있다.


그래서 위와 같은 경우에는 하위 6bit만 따로 ALU에 연결시켜줘서 무슨 연산인지를 알려주는 역할을 한다. 

 그러면 의문이 생길 수 있다. 분명 앞에서 설명하긴 opcode+funct의 형태로 넘겨주면 총 12bit이 넘어오는 건데 실제 연산에 사용된 건 funct에 해당되는 bit만 사용된다. 그러면 opcode는 어디서 처리가 되는 것일까? 답은 노란색으로 표현된 control signal에 있다. 사실 opcode에 따라서 수행되는 data flow는 천지차이이다. 가령 load store나 branch control의 경우는 아예 하위 funct 에 할당 되어 있는 bit을 쓰지않고 다른 format을 취하여 연산된다. 그래서 결국 opcode가 하는 역할 자체는 위의 control signal을 조절하는 것이 될 것이며, 위 그림에서는 묘사되어 있지는 않지만 어딘가에는 opcode를 controlsignal로 바꿔주는 generator가 있을 것을 예상할 수 있다. 



이 결과 자체는 Memory에서 저장되는 것이 아닌 register의 지정된 destination에 저장되기 때문에 이 값은 다시 앞의 register에 쓰여질 것이다. 이 모든게 add instruction을 수행하는 전체적인 data flow다.

위의 예시는 add에 한정되어서 설명한 것이지 나머지 sub나 and,or같은 연산의 차이는 단순히 ALUOp에 들어가는 control signal의 차이일 뿐이다.

댓글