Datapath & Single-Cycle MIPS: COMP541
Datapath & Single-Cycle MIPS: COMP541
Datapath &
Single-Cycle MIPS
Montek Singh
1
Topics
Complete the datapath
Add control to it
Create a full single-cycle MIPS!
Reading
Chapter 7
Review MIPS assembly language
Chapter 6 of course textbook
Or, Patterson Hennessy (inside front flap)
A MIPS CPU
3
Top-Level: MIPS CPU + memories
Top-level module reset clk
4
One level down: Inside MIPS
Datapath: components that store or process data
registers, ALU, multiplexors, sign-extension, etc.
we will regard memories as outside the CPU, so not part of the core datapath
Control: components that tell datapath what to do and when
control logic (FSMs or combinational look-up tables)
MIPS CPU
clk
Control
reset
6
Review: Instruction Formats
R-Type
op rs rt rd shamt funct
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits
I-Type
op rs rt imm
6 bits 5 bits 5 bits 16 bits
J-Type
op addr
6 bits 26 bits
R-Type instructions
Register-type
3 register operands:
rs, rt: source registers
rd: destination register
Other fields:
op: the operation code or opcode (0 for R-type instructions)
funct: the function
– together, op and funct tell the computer which operation to perform
shamt: the shift amount for shift instructions, otherwise it is 0
R-Type
op rs rt rd shamt funct
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits
R-Type Examples
I-Type
op rs rt imm
6 bits 5 bits 5 bits 16 bits
I-Type Examples
Assembly Code Field Values
op rs rt imm
lw $t2, 32($0) 35 0 10 32
sw $s1, 4($t1) 43 9 17 4
6 bits 5 bits 5 bits 16 bits
Machine Code
Note the differing order of
op rs rt imm
registers in the assembly and
001000 10001 10000 0000 0000 0000 0101 (0x22300005)
machine codes:
addi rt, rs, imm 001000 10011 01000 1111 1111 1111 0100 (0x2268FFF4)
lw rt, imm(rs) 100011 00000 01010 0000 0000 0010 0000 (0x8C0A0020)
sw rt, imm(rs) 101011 01001 10001 0000 0000 0000 0100 (0xAD310004)
6 bits 5 bits 5 bits 16 bits
J-Type instructions
Jump-type
26-bit address operand (addr)
Used for jump instructions (j)
J-Type
op addr
6 bits 26 bits
Summary: Instruction Formats
R-Type
op rs rt rd shamt funct
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits
I-Type
op rs rt imm
6 bits 5 bits 5 bits 16 bits
J-Type
op addr
6 bits 26 bits
MIPS Design from Comp411
14
Design Approach
“Incremental Featurism”
We will implement circuits for each type of instruction
individually, and merge them (using MUXes, etc).
RA1 RA2
WA WD
Register A
Instruction
WE File A Data
D Memory Memory
WD (3-port) RD
R/W
RD1 RD2
Memories
Review: The MIPS ISA
OP
6 5 5 5 5 6 The MIPS
instruction set as
16
26
32
+
4
32 32
P Read
C
Address
32 Instruction
register
Instruction
Memory
RA1 RA2
Rd: <15:11> WA
Register WD
RD1
File RD2 WE WERF
32 32
Control Logic
A B
ALUFN ALU
ALUFN
WERF! WERF
32
Shift Instructions
000000 rs rt rd shamt 000XXX
RA1 RA2
Rd: <15:11> WA
Register WD
RD1
File RD2 WE WERF
shamt:<10:6>
A B
ALUFN ALU
ASEL! ALUFN
WERF
ASEL 32
ALU with Immediate
001XXX rs rt immediate
Rd:<15:11>
0
RA1
Register RA2
WD
WA
WA
Rt:<20:16> 1
RD1
File RD2 WE WERF
imm: <15:0>
SEXT SEXT
shamt:<10:6> 1 0 BSEL
SEXT
How do you
build SEXT?
A B
ALUFN ALU
BSEL! BSEL • 1 pad with sign
ALUFN • 0 pad with 0s
WERF
ASEL
Load Instruction
100011 rs rt immediate
I-type: Load
PC 00
Reg[rt] Mem[Reg[rs] + SEXT(immediate)]
A Instruction
Memory
D
+4
Rd:<15:11> RA1
Register RA2
0 WD
WA
WA
Rt:<20:16> 1 RD1
File RD2 WE WERF
Imm: <15:0>
SEXT SEXT
shamt:<10:6>
SEXT A B
BSEL ALUFN ALU WD R/W Wr
WDSEL
ALUFN Data Memory
Wr Adr RD
32
WERF
ASEL
32
0 1 2 WDSEL
Store Instruction
101011 rs rt immediate
PC 00
I-type: Store
A Instruction Mem[Reg[rs] + SEXT(immediate)] Reg[rt]
Memory
D
+4
Rt: <20:16>
Rs: <25:21>
BSEL
Rd:<15:11> RA1
Register RA2
0 WD
WA
WA
Rt:<20:16> 1 File
RD1 RD2 WE WERF
Imm: <15:0>
SEXT SEXT
shamt:<10:6>
A B
No WERF!
SEXT
BSEL ALUFN ALU WD R/W
Wr
WDSEL
ALUFN Data Memory
Wr Adr RD
WERF
ASEL
0 1 2 WDSEL
JMP Instructions
PC<31:28>:J<25:0>:00
Imm: <15:0>
SEXT SEXT
shamt:<10:6>
PCSEL
WASEL
SEXT A B
BSEL ALUFN ALU WD R/W Wr
WDSEL
ALUFN Data Memory
Wr Adr RD
WERF
ASEL
PC+4
32
0 1 2 WDSEL
BEQ/BNE Instructions
PC<31:28>:J<25:0>:00
BT
00010X rs rt immediate
PCSEL 3 2 1 0
Imm: <15:0>
Z
SEXT SEXT
x4 shamt:<10:6>
PCSEL
we reuse the one BT
WASEL
in the ALU? Nope, A B
SEXT
it needs to do a BSEL ALUFN ALU WD R/W Wr
subtraction. WDSEL
ALUFN Data Memory
Wr Z Adr RD
WERF
ASEL
PC+4
32
0 1 2 WDSEL
Jump Indirect Instructions
PC<31:28>:J<25:0>:00
rs rt rd
JT BT
000000 00000 00100X
PCSEL 3 2 1 0
Instruction
Memory jalr: PC Reg[rs], Reg[rd] PC + 4
A
D
+4
Rt: <20:16>
Rs: <25:21>
WASEL
J:<25:0>
Rd:<15:11>
Rt:<20:16>
0
1
RA1
Register RA2
WD
WA
WA
31 2
RD1
File RD2 WE WERF
Imm: <15:0>
Z
JT SEXT SEXT
x4 shamt:<10:6>
PCSEL
BT
WASEL
SEXT A B
BSEL ALUFN ALU WD R/W Wr
WDSEL
ALUFN Data Memory
Wr Z Adr RD
WERF
ASEL
PC+4
32
0 1 2 WDSEL
Comparisons
PC<31:28>:J<25:0>:00 00101X rs rt immediate
JT BT
I-type: set on less than & set on less than unsigned immediate
PCSEL 3 2 1 0
slti: if (Reg[rs] < SEXT(imm)) Reg[rt] 1; else Reg[rt] 0
PC 00 sltiu: if (Reg[rs] < SEXT(imm)) Reg[rt] 1; else Reg[rt] 0
A Instruction
Memory
D
NOTE: Sign-extension
+4
done for both! WHY??
Rs: <25:21>
Rt: <20:16> But ALUFN is unsigned
J:<25:0>
WASEL comparison (LTU) for sltiu.
Rd:<15:11>
Rt:<20:16>
0
1
RA1
Register RA2
WD
WA
WA
31 2
RD1
File RD2 WE WERF
Imm: <15:0>
JT SEXT SEXT
Z
x4 shamt:<10:6>
PCSEL
BT
WASEL
SEXT A B
BSEL ALUFN ALU WD R/W Wr
WDSEL
ALUFN Data Memory
Wr Z Adr RD
WERF
ASEL
PC+4
32
0 1 2 WDSEL
More comparisons
PC<31:28>:J<25:0>:00 000000 rs rt rd 00000 10101X
JT BT
R-type: set on less than & set on less than unsigned
PCSEL 3 2 1 0
slt: if (Reg[rs] < Reg[rt]) Reg[rd] 1; else Reg[rd] 0
PC 00 sltu: if (Reg[rs] < Reg[rt]) Reg[rd] 1; else Reg[rd] 0
A Instruction
Memory
D
+4
Rt: <20:16>
Rs: <25:21>
WASEL
J:<25:0>
Rd:<15:11>
Rt:<20:16>
0
1
RA1
Register RA2
WD
WA
WA
31 2
RD1
File RD2 WE WERF
Imm: <15:0>
Z
JT SEXT SEXT
x4 shamt:<10:6>
PCSEL
BT
WASEL
SEXT A B
BSEL ALUFN ALU WD R/W Wr
WDSEL
ALUFN Data Memory
Wr Z Adr RD
WERF
ASEL
PC+4
32
0 1 2 WDSEL
LUI
PC<31:28>:J<25:0>:00
JT BT 001111 00000 rt immediate
A Instruction
Memory
D
+4
Rt: <20:16>
Rs: <25:21>
WASEL
J:<25:0>
Rd:<15:11>
Rt:<20:16>
0
1
RA1
Register RA2
WD
WA
WA
31 2
RD1
File RD2 WE WERF
Imm: <15:0>
Z
JT SEXT SEXT
x4 shamt:<10:6>
ASEL BSEL
0 1 2 1 0
PCSEL
BT
WASEL
SEXT A B
BSEL ALUFN ALU WD R/W Wr
WDSEL
ALUFN Data Memory
Wr Z Adr RD
WERF
ASEL
PC+4
32
0 1 2 WDSEL
All put together…
PC<31:28>:J<25:0>:00
JT BT
PCSEL 3 2 1 0
PC 00
A Instruction
Memory
D
+4
Rt: <20:16>
Rs: <25:21>
WASEL
J:<25:0>
Rd:<15:11>
Rt:<20:16>
0
1
RA1
Register RA2
WD
WA
WA
31 2
RD1
File RD2 WE WERF
Imm: <15:0>
Z
JT SEXT SEXT
x4 shamt:<10:6>
ASEL BSEL
0 1 2 1 0
PCSEL
BT
WASEL
SEXT A B
BSEL ALUFN ALU WD R/W Wr
WDSEL
ALUFN Data Memory
Wr Z Adr RD
WERF
ASEL
PC+4
32
0 1 2 WDSEL
Reset, Interrupts, and Exceptions
Upon reset/reboot:
Need to set PC to where boot code resides in memory
Interrupts/Exceptions:
any event that causes interruption in program flow
FAULTS: e.g., nonexistent opcode, divide-by-zero
TRAPS & system calls: e.g., read-a-character
I/O events: e.g., key pressed
How to handle?
interrupt current running program
invoke exception handler
return to program to continue execution
Registers $k0, $k1 ($26, $27)
reserved for operating system (kernel), interrupt handlers
any others used must be saved/restored
Exceptions
0x80000000
Reset: PC 0x80000000
PC<31:28>:J<25:0>:00
0x80000040
0x80000080 JT BT
PCSEL 6 5 4 3 2 1 0
Bad Opcode: Reg[27] PC+4; PC 0x80000040
IRQ: Reg[27] PC+4; PC 0x80000080
PC 00
A Instruction
Memory
D
+4
Rt: <20:16>
Rs: <25:21>
WASEL
J:<25:0>
Rd:<15:11>
Rt:<20:16>
0
1
RA1
Register RA2
WD
WA
WA
31
27
2
3 RD1
File RD2 WE WERF
Imm: <15:0>
RESET
JT SEXT SEXT
IRQ Z
x4 shamt:<10:6>
ASEL BSEL
0 1 2 1 0
PCSEL
BT
WASEL
SEXT A B
BSEL ALUFN ALU WD R/W Wr
WDSEL
ALUFN Data Memory
Wr Z Adr RD
WERF
ASEL
PC+4
32
0 1 2 WDSEL
Our Lab version: three changes
PC 00
A Instruction
Memory
RESET D
+4
Rt: <20:16>
Rs:
J:<25:0>
WASEL <25:21>
Rd:<15:11>
Rt:<20:16>
0
1
RA1
Register RA2
WD
WA
WA
31 2
RD1
File RD2 WE WERF
Imm: <15:0>
Z
JT SEXT SEXT
x4 shamt:<10:6>
0 1 2 ASEL 1 0 BSEL
PCSEL
B
WASEL T
SEXT A B
BSEL ALUFN ALU WD R/W Wr
WDSEL
ALUFN Data Memory
Wr Z Adr RD
WERF
ASEL
PC+4
32
0 1 2 WDSEL
Support for Enable
“Enable” input: Enable = 0 disables the processor
disables writes to: PC, register file and data memory
PC<31:28>:J<25:0>:00
JT B
T On Reset: PC 0x0040_0000
PCSEL 3 2 1 0
PC 00
A Instruction
ENABLE Memory
RESET
Writes disabled
D
+4
Rs:
Rt: <20:16> by controller
J:<25:0>
WASEL <25:21>
Rd:<15:11>
Rt:<20:16>
0
1
RA1
Register RA2
WD
WA
WA
31 2
RD1
File RD2 WE WERF
Imm: <15:0>
Z
JT SEXT SEXT
x4 shamt:<10:6>
0 1 2 ASEL 1 0 BSEL
PCSEL
B
WASEL T
SEXT A B
BSEL ALUFN ALU WD R/W Wr
WDSEL
ALUFN Data Memory
Wr Z Adr RD
WERF
ASEL
PC+4
32
0 1 2 WDSEL
MIPS: Our Final Version
PC<31:28>:J<25:0>:00
This is a complete 32-bit processor.
JT BT Although designed in “one” class lecture,
PCSEL 3 2 1 0
it executes the majority of the
PC 00 MIPS R2000 instruction set.
A Instruction
ENABLE Memory
RESET
D
+4
Rt: <20:16>
Executes one
WASEL
Rs: <25:21>
instruction
J:<25:0>
Rd:<15:11>
Rt:<20:16>
0
1
RA1
Register RA2 per clock
WA
WA WD
31 2 File WERF
RD1 RD2 WE
Imm: <15:0>
Z
JT SEXT SEXT
x4 shamt:<10:6>
0 1 2 ASEL 1 0 BSEL
PCSEL
BT
WASEL
SEXT A B
BSEL ALUFN ALU WD R/W
Wr
WDSEL
ALUFN Data Memory
Wr Z Adr RD
WERF
ASEL
PC+4
32
0 1 2 WDSEL
Our MIPS: Top-level hierarchy
PC<31:28>:J<25:0>:00
JT BT
PCSEL 3 2 1 0
newPC pcPlus4
PC 00
Rt: instr<20:16>
Rs: instr<25:21>
reg_writeaddr
WASEL
J: instr<25:0>
Rd: instr<15:11> 0
Rt: instr<20:16> 1
RA1
Register RA2
WD
reg_writedata
WA
WA
31 2
RD1
File RD2 WE WERF
ReadData1 ReadData2
Imm: instr<15:0>
ENABLE Z op: instr<31:26>
func: instr<5:0> JT SEXT SEXT
signImm
<<2 shamt: instr<10:6>
ASEL BSEL
0 1 2 1 0 mem_writedata
PCSEL
BT aluA aluB
WASEL
SEXT A B
mem_wr
BSEL ALUFN ALU WD R/W
Wr
WDSEL
ALUFN Data Memory
mem_addr
Wr Z Adr RD
WERF
alu_result
ASEL mem_readdata
pcPlus4 (PC+4)
32
0 1 2 WDSEL
Make design modular
Follow hierachy specified
Small amounts of logic can be
“inlined” (instead of separate
module)
e.g.: muxes, sign extension,
adders, shift-by-2
38
Summary
We learned about a complete MIPS CPU
NOTE: Many details in textbook are different…
… from what you will implement in the lab
our lab MIPS has more features