00 Intro는 모든 명령어가 한 사이클 내에 처리되도록 하고 있기 때문에, 한 사이클 타임의 길이가 지나치게 길어진다. 왜냐하면 명령어중 가장 오래걸리는 명령어에 맞춰서 사이클 타임을 정해야 하기 때문이다. 그에 대한 대안으로 나온 것이 바로 멀티사이클이다. 멀티사이클 데이터패스는 하나의 명령어를 여러 사이클로 나누어서 처리하기 때문에 앞선 단점이 해소된다.
그렇다면, 어떻게 명령어를 여러 사이클로 분리할까?
Multicycle Divisions
다음은 데이터패스의 관점에서 바라본 명령어의 분리 도식도이다.

각각의 단계는 클럭엣지에 맞춰 실행된다. 즉, 클럭엣지 타이밍에 단계가 시작된다고 보면 된다.
이제 각 단계에 대해 아래의 그림을 바탕으로 흐름을 따라가며 이해해보자.

위 그림에서 조금 더 자세하게 Control Unit의 작동과 파이프라인 레지스터를 추가한게 아래 그림이다. 본문에서는 위 그림을 바탕으로 설명하되 필요한 경우 아래 그림 또한 이용한다. 파이프라인 레지스터는 IF/ID, ID/EX, EX/MEM, MEM/WB 이렇게 4개로, 단계에서 단계를 넘어갈 때 필요한 경우 데이터를 저장하기 위한 목적으로 존재한다.

1. Instruction Fetch 명령어 가져오기 단계
PC 값이 메모리에 전달된다. PC 값이 메모리 주소로 사용되어 데이터를 읽어온다. 읽어온 데이터는 Instruction Register에 전달한다. (그림에는 Registers라고 되어 있는데, Instruction decode를 생략했기 때문이다.)
이때 전달한 값은 바로 입력되지 않는다. 사이클 동안 출력이 유지되지만, 다음 클럭 엣지까지 기다렸다가 입력된다. 그것이 edge sensitive 타이밍 제어이기 때문이다. (Flip-Flop 참조.)
2. Instruction Decode and Register Fetch
클럭엣지와 함께, 메모리 데이터가 Instruction Register에 입력되는 것으로 단계가 시작된다. (Master-Slave Flip-Flop의 구조와 D Latch의 구조를 참조: 클럭 엣지 전에는 Master latch에 hold되다가, 클럭엣지에 맞춰서 Slave latch로 데이터가 전달된다. 이때 hold된다는 말은 저장된다는 말과 같다.) Instruction의 filed를 rs1, rs2, rd, imm 값으로 분리한다. 각 값들은 Register File과 Immediate Generation에 전달된다. Register File은 전달된 값을 주소로 사용하여 데이터를 읽어온다. 읽어온 데이터, Read Data1과 Read Data2는 각각 레지스터 A와 B에 전달된다. (바로 입력된다.)
한편, Instruction Decode는 Control Unit에서 수행된다. Instruction Register에서 opcode와 function3, function7 필드 값을 전달받아 적절한 제어 신호들control signals을 생성한다.
지금까지와는 달리 이제부터 flow를 조금 간결히 설명하겠다.
(3 cycle branch의 경우)
ALUOut = PC + imm
3. Execution 실행 단계
(R-type의 경우)
클럭엣지와 함께, 레지스터 A, B에 hold되어 있던 데이터는 각각 mux를 지나 ALU로 전달된다. ALU는 연산을 수행하고 연산 결과를 ALUOut에 저장한다.
(I-type의 경우)
A와 imm 값의 ALU를 수행하고 ALUOut에 저장한다.
(S-type의 경우)
A와 imm 값의 ALU를 수행하고 ALUOut에 저장한다. 그리고 B 값을 다음 단계에서 사용하기 위해 EX/MEM 파이프라인 레지스터에 저장한다.
(3 cycle branch를 수행하는 경우)
if (A == B): PC = ALUOut
(4 cycle branch를 수행하는 경우)
ALU에서 zero 연산이 먼저 수행되고 zero flag 값을 Control Unit에 저장한다. 그다음 ALU 연산이 수행되고 결과값을 ALUOut에 저장한다.
4. Memory Access 메모리 접근 단계
(store를 수행하는 경우)
레지스터 B에 저장된 값을 ALUOut에 저장된 값을 메모리 주소로 사용하여 메모리에 저장한다.
이때, 레지스터 B는 RF 단계에 저장되었으며, Execution 단계가 아닌 Memory Access 단계에 사용된다는 것에 주의하자.
(load를 수행하는 경우)
ALUOut에 저장된 값을 주소로 사용하여 메모리에 저장된 값을 MDR(Memory Data Register)에 저장한다.
(4 cycle branch를 수행하는 경우)
ALUOut에 저장된 값을 PC 레지스터에 저장한다.
5. Write Back 쓰기 단계
이 단계는 R-type과 I-type 명령어인 경우 활성화된다고 보면 된다.
(load를 수행하는 경우)
MDR에 저장된 값이 mux를 통과하여 rd에 저장된다.
(산술 연산을 수행하는 경우)
ALUOut에 저장된 값이 mux를 통과하여 rd에 저장된다.

이 표는 3 cycle branch를 기준으로 한다. 아마 데이터패스도 그것에 맞춰져 있을 것이다. branch의 사이클 수는 구현 방식에 따라 다르다. A op B의 op는 operation을 의미한다.