/// LSU EE 3755 -- Fall 2001 -- Computer Organization // /// Strawman MIPS, As Seen in Class [tm] // // Time-stamp: <14 November 2001, 16:20:22 CST, koppel@sol> // // This file contains the Verilog code for the strawman MIPS // implementation being written in class. It is probably not complete // and might not be working, even considering its incomplete form. // Completed code will also be posted. `define MIPS_PROG "prog1.v" `define MEMBASE 'h400000 `define DATABASE 'h10010000 `define TEXTSIZE 'h100 `define MEMSIZE 'h200 `define MEMRANGE `MEMBASE:`MEMBASE+`MEMSIZE-1 `define A(addr) ((addr)-`DATABASE+`MEMBASE+`TEXTSIZE) `define MEM(addr) mem[((addr)-`DATABASE+`MEMBASE+`TEXTSIZE)] module proc(exc,clk); input clk; output exc; reg exc; reg [31:0] gpr [0:31]; reg [7:0] mem ['h400000:'h400100]; reg [31:0] pc, npc; reg [31:0] ir; reg [4:0] rs, rt, rd, sa; reg [5:0] opcode, func; integer i; // Values for funct field. parameter f_sll = 6'h0; parameter f_srl = 6'h2; parameter f_add = 6'h20; parameter f_sub = 6'h22; parameter f_or = 6'h25; // Values for opcode field. parameter o_rfmt = 6'h0; parameter o_j = 6'h2; parameter o_beq = 6'h4; parameter o_bne = 6'h5; parameter o_addi = 6'h8; parameter o_slti = 6'ha; parameter o_andi = 6'hc; parameter o_ori = 6'hd; parameter o_lui = 6'hf; parameter o_lw = 6'h23; parameter o_lbu = 6'h24; parameter o_sw = 6'h2b; parameter o_sb = 6'h28; initial begin exc = 0; i = 0; end always @( posedge clk ) begin ir = {mem[pc],mem[pc+1],mem[pc+2],mem[pc+3]}; {opcode,rs,rt,rd,sa,func} = ir; case( opcode ) o_rfmt: case ( func ) f_add: gpr[rd] = gpr[rs] + gpr[rt]; f_sub: gpr[rd] = gpr[rs] - gpr[rt]; default: exc = 1; endcase default: exc = 1; endcase i = i + 1; if( i==3 ) exc = 1; pc = pc + 4; end endmodule // Include the testbench. `include "mipsi1tb.v"