/// EE 3755 -- Fall 2013 -- Computer Organization
//
///

 /// Approximate state of MIPS functional sim code 15 Nov 2013 at end of class.

`define MIPS_PROG "tfirst-live.v"
`include "mipsmemmacros.v"

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

   // 0x40000000 add $2, $3, $4

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

   parameter   O_type_r = 6'h0;
   parameter   F_add = 6'h20;
   parameter   F_sub = 6'h22;

   parameter   O_addi = 6'h8;

   reg [31:0]  pc, npc, ir;

   initial begin pc = 'h400000; npc = pc + 4; end

   reg [4:0] rs, rt, rd, sa;
   reg [5:0] opcode, func;

   reg [31:0] rs_val, rt_val, result, simmed, uimmed;

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

   always @ ( posedge clk ) begin

      ir = {mem[pc],mem[pc+1],mem[pc+2],mem[pc+3]};
      {opcode,rs,rt,rd,sa,func} = ir;
      //  {opcode,rs,rt,immed} = ir;
      //  {opcode,ii} = ir;

      //  rd = rs + rt;   How silly!

      rs_val = gpr[rs];
      rt_val = gpr[rt];
      uimmed = { 16'h0, ir[15:0] };
      simmed = {  ir[15] ? 16'hffff : 16'h0,  ir[15:0] };

      case ( opcode )

        O_type_r: case ( func )
           F_add: gpr[rd] = rs_val + rt_val;
           F_sub: gpr[rd] = rs_val - rt_val;
           default: $stop;
        endcase

        default: $stop;

      endcase

      pc = npc;
      npc = npc + 4;
      
   end

endmodule

`include "mips_fs_tb.v"