/// EE 3755 -- Fall 2012 -- Computer Organization
//
/// Example used in class 5 November 2012.

/// MIPS Processor Functional Simulator,  Day 1
//
//  Will be added to each day.
//


`define MIPS_PROG "tfirst.v"

module proc(exc,clk);
   input clk;
   output exc;

   // add $2, $3, $4

   reg [7:0]  mem ['h400000:'h400200];

   reg [31:0]  gpr[0:31];
   reg [31:0]  pc;
   reg [31:0]  instruction_register;

   reg [4:0]   rs, rt, rd;

   parameter   F_ADD = 0x20;
   parameter   F_SUB = 0x22;

   always @ ( posedge clk )
     begin

        instruction_register 
          = { mem['h400000], mem['h400001], 
              mem['h400002], mem['h400003] };
        
        opcode = instruction_register[31:26];
        rs = instruction_register[25:21];
        rt = instruction_register[20:16];
        rd = instruction_register[15:11];
        func = instruction_register[5:0];

        case ( func )
          F_ADD:  gpr[rd] = gpr[rs] + gpr[rt];
          F_SUB:  gpr[rd] = gpr[rs] - gpr[rt];
        endcase

     end

endmodule

`include "mips_fs_tb.v"