[SOLVED] COA Lab 3-add a memory unit to single-Cycle CPU

30.00 $

Category:

Description

Rate this product

Based on Lab 2 (simple single-cycle CPU), add a memory unit to implement a complete single-cycle CPU which can run R-type, I-type and jump instructions.

2. Requirement

  • Please use Icarus Verilog and GTKWave as your HDL simulator.
  • Please attach your names and student IDs as comment at the top of each file.
  • Top module’s name and IO port reference Lab2.

Reg_File[29] represents stack point. Initialize Reg_file[29] to 128 while others to

You may add control signals to Decoder, e.g.

  • Branch_o
  • Jump_o
  • MemRead_o
  • MemWrite_o
  • MemtoReg_o

3. Requirement description

Lw instruction  memwrite is 0, memread is 1, regwrite is 1

Reg[rt] ← Mem[rs+imm]

 

Sw instruction memwrite is 1, memread is 0

Mem[rs+imm] ← Reg[rt]

 

Branch instruction branch is 1,and decide branch or not by do AND with the zero signal from ALU.

PC = PC + 4 + (sign_Imm <<2)

Jump instruction jump is 1

PC = {PC[31:28], address<<2}

 

NOP instruction

No operation – do nothing

 

  1. Code (80 pts.)

(1) Basic Instruction: (50 pts.)

Lab2 instruction + mul, lw, sw, j, NOP

 

R-type

Op[31:26] Rs[25:21]- Rt[20:16] Rd[15:11] Shamt[10:6] Func[5:0]
 

I-type

     
Op[31:26] Rs[25:21]- Rt[20:16] Immediate[15:0]
 

Jump

     
Op[31:26]     Address[25:0]

 

instruction op[31:26]      
lw 6’b100011 Rs[25:21] Rt[20:16] Immediate[15:0]
sw 6’b101011 Rs[25:21] Rt[20:16] Immediate[15:0]
j 6’b000010   Address[25:0]

 

Mul is R-type instruction

0 Rs[25:21]- Rt[20:16] Rd[15:11] 0 6’b011000

 

NOP instruction

32 bits 0.

 

(2) Advance set 1: (10 pts.)

instruction op rs rt rd shamt func
jal 6’b000011     Address[25:0]  
jr 6’b000000 rs 0 0 0 6’b001000

 

Jal: jump and link

In MIPS, the 31st register is used to save return address for function call.

Reg[31] saves PC+4 and address for jump

 

Reg[31] = PC + 4

PC = {PC[31:28], address[25:0]<<2}

 

Jr: jump to the address in the register rs

PC = Reg[rs];

e.g.:In MIPS, return could be used by jr r31 to jump to return address from JAL

 

Example: when CPU executes function call,

 

0x00000000                  Fibonacci(4);

0x00000004                  Add r0, r0, r1

 

1

 

 3

0x00001000                  Fibonacci(){                                                                                         .                                     

2                            .    

0x00001020                  }

 

if you want to execute recursive function, you must use the stack point (Reg_File[29]).

First, store the register to memory and load back after function call has been finished. The second testbench CO_P3_test_data2.txt is the Fibonacci function. After it is done, r2 stores the final answer. Please refer to test2.txt.

 

(3) Advance set 2: (20 pts.)

ble(branch less equal than): if( rs <= rt ) then branch

6’b000110 rs rt offset

 

bnez(branch non equal zero): if( rs != 0 ) then branch (It is same as bne)

6’b000101 rs 0 offset

 

bltz(branch less than zero): if( rs < 0 ) then branch

6’b000001 rs 0 offset
 

li(load immediate) by) addi.

You don’t have to implement it, because it is similar to (and thus can be replaced
6’b001111 0 rt immediate

 

 

  1. Testbench

CO_P3_test_data1.txt tests the basic instructions (50 pts.)  CO_P3_test_data2.txt tests the advanced set 1 (10 pts.).

Please refer to test1.txt and test2.txt for details. The following MIPS code is bubble sort. Please transform the MIPS code to machine code, store the machine code in CO_P3_test_data3.txt and run it (for testing advance set 2 (20 pts.)).

You don’t have to submit machine code.

 

    addu

addi     addi     mul     j Jump bubble:

li      li

mul outer:     addi     subu

li  inner:     lw     lw

ble

 

$t0, $0, $0

$t1, $0, 10

$t2, $0, 13

$t3, $t1, $t1

$t0, 10

$t1, 4

$t4, $t0, $t1

$t6, $0, 8

$t0, $t4, $t6 $t1, 0

$t2, 4($t0)

$t3, 0($t0)

$t2,$t3,no_swap

    sw     sw

li no_swap:

addi     subu     bltz

j next_turn:

bnez

j

Jump:

subu Loop:

addu     beq

j

End:

$t2, 0($t0)

$t3, 4($t0) $t1, 1

$t5, $0, 4

$t0, $t0, $t5 $t0, next_turn inner

$t1, outer

End

$t2, $t2,     $t1

$t4, $t3,           $t2 $t1, $t2,             Loop bubble

 

 

  1. Reference architecture

This lab might be used extra signal to control. Please draw the architecture you designed on