/// EE 3755 -- Spring 2002 -- Computer Organization
//
/// Example used in class 22 April 2002.

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

`define MIPS_PROG "tfirst.v"

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

   // add $2, $3, $4

   reg [31:0] pc, npc;
   reg [31:0] ir;
   reg [5:0]  opcode, func;
   reg [4:0]  rs, rt, rd, sa;

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

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

   parameter  F_add = 6'h20;
   parameter  F_sll = 6'h0;
   parameter  F_srl = 6'h2;
   parameter  F_sub = 6'h22;
   parameter  F_or  = 6'h25;


   always @( posedge clk ) begin

      ir = {mem[pc],mem[pc+1],mem[pc+2],mem[pc+3]};

      {opcode, rs, rt, rd, sa, func} = ir;

      if( opcode == 0  ) begin

         case( func )
           F_add: gpr[rd] = gpr[rs] + gpr[rt];
           F_sub: gpr[rd] = gpr[rs] - gpr[rt];
           default: $stop;
         endcase

      end 

      gpr[0] = 0;
      
      pc = pc + 4;

   end

endmodule

`include "mips_fs_tb.v"