본문 바로가기
Computer Science/Computer Architecture

4. Single Cycle Design

by Gofo 2021. 5. 16.

Single Cycle Implementation

Single cycle implementation이란 instruction 하나를 하나의 cycle에 수행하는 것을 말한다.

Cycle이 끝나면 새로운 instruction을 수행한다.

 

Clock이 올라가서부터 다음 clock이 올라가기 전까지 하나의 수행을 마친다.

다음 clock이 올라가는 순간 instruction 수행 결과(state)를 update하고, 새로운 instruction을 수행한다.

 

State가 될 수 있는 것은 다음과 같다.

  • PC : 새로운 PC로 update한다.
  • Register : add, sub, lw 등
  • Data memory : sw 등

 

Providing Input at High Speed

일반적으로 1GHz의 clock cycle 주기를 가지는 CPU는 1ns마다 clock이 발생한다.

이는 너무 빠른 속도이기 때문에 외부에서 매번 instruction을 input으로 줄 수 없다.

 

이를 해결하기 위해 stored program concept을 이용한다.

즉 input은 executable file 안에 다 존재하며 모든 machine instruction들을 instruction memory에 넣어서 자동으로 읽도록 한다.

 

Insturction fetch가 끝나면 PC가 증가하게 된다.

스스로 PC 값을 바꾸고 PC를 이용해서 instruction을 찾아서 수행이 가능한 것이다.

 


Instruction Fetch 구현

Instruction fetch을 구현하기 위해서는 다음과 같은 functional unit이 필요하다.

  • Instruction memory
    • executable file을 담고 있다.
    • 프로그램이 고정되어서 read만 된다고 가정한다.
    • 프로그램을 교체할 경우 write가 필요하다.
  • Program counter
    • register의 일종(special register)
    • register는 sequential block으로 clock과 동기된다.
  • Adder

 

 

Register(Program Counter)

Program counter는 register의 일종이다.

Register는 sequential block으로, clock과 동기된다.

 

Clock이 올라가는 순간에서의 input 값을 저장하고, 일단 저장된 input은 한 clock 주기 동안은 그대로 그 값을 유지한다.

그렇기에 register의 output 또한 한 주기 동안 바뀌지 않는다.

 

또한 clock이 올라간 동안 앞부분은 뒷부분에 영향을 주지 않는다.

즉 Register는 앞 부분과 뒷 부분간의 신호가 서로 영향이 없도록 insulation 기능을 한다.

 

 


R-type Instruction Execute 구현

R-Type

R-type instruction은 다음과 같은 과정을 거쳐 수행된다.

  1. 2개의 register operand을 읽는다.
  2. arithmetic/logical operation을 수행한다.
  3. register에 그 결과를 write한다.

 

R-type의 실행을 위해서는 다음과 같은 functional unit이 필요하다.

  • Registers : Register의 값을 read/write 한다.
  • ALU : 들어온 2개의 input에 대해 ALU operation을 수행한다.

 

Register File

Register들과 주변장치를 합쳐서 register file이라 한다.

읽고 쓰기가 가능하다.

읽는 것은 MUX을 이용하고, 쓰는 것은 decoder를 이용한다.

 

Register Read

들어온 register의 number가 select signal로 사용된다.

 

Register는 32개이므로 select signal은 5bit이 되야 한다.

따라서 R-type의 register operand는 5bit 길이이다.

 

들어온 select signal을 input으로 MUX에 넣어서 한개의 register만 select한다.

 

Register Write

Decoder을 이용해서 쓰기가 가능하다.

 

모든 레지스터에 input으로 들어온 data, write signal, decoder가 연결되어있다.

Data와 write signal은 항상 모든 register에게 전달된다.

이 때 선택적으로 저장하기 위해서 decoder에서 나온 신호와 write signal이 AND gate로 결합되어있다.

 

Wirte signal이 enable/disable 되는 것은 opcode를 보고 결정된다.

 

들어온 register number는 5-to-32 decoder로 들어가서 알맞는 레지스터에 대한 output만 high bit로 출력한다.

즉 input에 따라 32개 중 1개만 high bit(1)을 출력하는 것이다.

이 것이 wirte signal과 AND로 결합되어 원하는 register에만 저장할 수 있게 된다.

 

ALU

ALU는 combinational block으로 state가 없다.

 

Select operation signal은 ALU가 어떤 기능을 할지 결정한다.

그래서 ALU는 기능이 많지만 주어진 순간에는 하나의 기능으로만 수행된다.

Select operation signal은 opcode와 funct에 의해 결정된다.

 

output으로 나가는 zero signal은 branch를 구현하는데 사용된다.

 

만약 <pre>beq $r1, $r2, offset</pre>이 들어온다면, ALU는 <pre>$r1 - $r2</pre>을 수행한다.

그 후 0인지 아닌지를 PC의 값을 바꾸는 adder로 전송한다.

 


lw/sw Instruction Execute 구현

lw/sw을 execute하기 위해서는 다음과 같은 function unit이 필요하다.

  • Data memory
    • MemRead signal이 1일 경우 : 주소를 받아서 data를 출력한다.
    • MemWrite signal이 1일 경우 : 주소와 쓸 data을 받아서 해당 주소에 데이터를 저장한다.
  • Sign-extend
    • read/write 할 주소를 계산하기 위해 사용된다.
    • base addressing에서 주소를 계산할 때 사용되는 immediate을 sign extension한다.

 

Sign-extend Unit

input으로 들어온 16개 bit을 sign extension한다.

단순하게 MSB(최상위 bit)인 b15을 복제하면 된다.

 

Memory Read/Write

Read는 다음과 같은 과정을 거쳐 수행된다.

  1. $t2을 읽어서 ALU로 전달한다.
  2. immediate number을 읽어서 sing extension하고 ALU로 전달한다.
  3. 계산된 주소를 data memory로 전달하고 MemRead signal을 1로 한다.
  4. data memory에서 얻어진 데이터를 register file에 전달하고 Register Write signal을 1로 한다.

 

Write는 다음과 같은 과정을 거쳐 수행된다.

  1. $t2을 읽어서 ALU로 전달한다.
  2. immediate number을 읽어서 sing extension하고 ALU로 전달한다.
  3. 계산된 주소를 data memory에 address로 전달한다.
  4. $t0을 읽어서 data memory에 write data로 전달하고, MemWrite signal을 1로 한다.

 


Branch Instruction Execute 구현

  1. 2개의 register을 register file로 부터 읽는다.
  2. ALU에서 2개의 register를 뺀 것이 0이면 zero signal(output)을 high bit로 한다.
  3. 실제 jump할 offset을 sign extension하고 word offset에서 byte offset으로 바꾼다.
  4. PC 값 + byte offset을 하여 target address를 구한다.
  5. ALU에서 구한 차이가 0인지에 따라 PC 값을 선택한다.(MUX)
    • zero signal이 high bit(1)인 경우 : PC ← target address
    • zero signal이 low bit 인 경우 : PC ← PC + 4

 


Control (Decode) Design

전반적인 control signal들을 결정하는 upper control과 ALU의 operation을 결정하는 lower ALU contorl로 구분된다.

 

R-type이 아닌 경우에는 opcode만으로도 모든 control signal이 결정된다.

R-type의 경우에는 ALU operation도 결정되기 때문에 function code까지 필요하다.

 

Contorl design은 low-level implementation이므로, 결국 logic design이다.

 

 

Lower ALU Control Unit

R-type이 아닌 instruction의 경우 opcode로 인해 모든 것이 결정된다.

  • Load/Store
    • ALU는 add 기능을 수행한다.
    • ALUOp = 00
  • Branch
    • ALU는 subtract 기능을 수행한다.
    • ALUOp = 01
  • R-type
    • funct filed의 값에 의해 ALU 기능이 결정된다.
    • ALUOp = 10

 

따라서 이를 이용해서 truth table을 나타내면 다음과 같다.

8bit을 input으로 받아서 4bit의 output을 결정하는 형태이다.

 

그런데 input의 F5, F4는 항상 무관하고, output의 맨 처음 bit는 항상 0이므로 다음과 같이 구현할 수 있다.

 

Upper Control Unit

6bit의 opcode를 input으로 받아서 9bit의 output을 결정한다.

 

Upper control unit은 not gate를 이용해서 단순하게 다음과 같이 구현할 수 있다.

 

아래 그림에서 각 gate는 다음 상황일 때 high를 출력한다.

이는 opcode에 따라서 하나만 high가 됨을 보여준다.

즉 2개 이상이 high가 될 수 없다.

  • 첫 번째 gate : 000000일 때 = R-format
  • 두 번째 gate : 100011일 때 = lw
  • 세번째 gate : 101011일 때 = sw
  • 네번째 gate : 000100 = beq

 

이를 이용해서 각 control signal을 구성할 수 있다.

  • RegDst
    • write할 register의 번호를 결정한다.
    • R-format 일때만 high
  • ALUSrc
    • ALU 연산에 들어가는 데이터를 결정한다.
    • lw/sw일 때만 high : ALU = register + immediate
  • MemtoReg
    • register에 write 할 것을 결정한다.
    • lw일 때만 high : register ← memory에서 read 한 값
  • RegWrite
    • register에 값을 write 할지 결정한다.
    • R-format, lw 때만 high
  • MemRead
    • data memory를 read 할 지 결정한다.
    • lw 일 때만 high : memory read
  • MemWrite 
    • data memory에 write할지 결정한다.
    • sw일 때만 high : memory write
  • PCSrc = Branch
    • branch instruction인지 아닌지 결정한다.
    • beq일 때만 high : PC←PC + target offset
  • ALUOp1, ALUOp2
    • ALU control에 input으로 들어가서 ALU의 연산 종류를 결정한다.

 


Implementing More Instruction : Jump

Jump instruction을 추가하는 것도 크게 달라질 것 없이 datapath와 contorl을 design하면 된다.

즉 datapath와 contorl이 추가된다.

 

Jump Instruction

jump instruction은 j-format instruction이다.

jump는 word address를 사용하므로,

  • 맨 끝에 00을 붙여서 byte address로 변환하고,
  • PC의 상위 4bit를 추가해야 한다.

 

Datapath

Instruction의 25-0을 shift left 2을 하여 맨 끝에 00을 추가한다.

이를 통해 word address를 byte address로 변환할 수 있다.

 

이후 PC의 상위 4bit을 concat하여 jump할 address를 완성시킨다.

 

jump일 때의 control signal을 통해서 MUX에 넣고, 이를 이용해서 PC←jump address를 수행한다.

 

 

Contorl

MUX를 이용해서 jump address를 PC에 넣기 위해 control signal이 필요하다.

이를 jump라고 한다면 control signal들의 truth table에 column이 추가되어야 한다.

또한 새로운 instruction이 추가되었으므로 이에 대한 row가 추가되어야 한다.

 

jump는 register write를 하지 않으므로 이에 대한 bit는 무엇이 되든 상관 없다.

마찬가지로 ALU를 사용하지 않으므로 이에 대한 bit가 무엇이 되든 상관 없다.

 

 

'Computer Science > Computer Architecture' 카테고리의 다른 글

4. Pipelining  (0) 2021.05.23
4. Single Cycle, Multi Cycle, Pipeline  (1) 2021.05.23
4. Single Cycle Datapath and Control Design  (0) 2021.05.16
3. MIPS ISA  (0) 2021.05.16
3. Multimedia Arithmetic  (0) 2021.05.16

댓글