/// LSU EE 3755 -- Fall 2001 -- Computer Organization
//
/// Unsyn. Separate Memory MIPS, As Seen in Class
`define MIPS_PROG "ls.v"
module system(exc,clk);
input clk;
output [7:0] exc;
wire [31:0] cpu_data_out, addr, mem_data_out;
wire [2:0] mem_err_out;
wire [1:0] size;
wire we;
cpu cpu1(exc,cpu_data_out,addr,size,we,mem_data_out,mem_err_out,clk);
memory_2 m1(mem_data_out,mem_err_out,addr,size,we,cpu_data_out);
endmodule
module cpu(exc,data_out,addr,size,we,data_in,mem_error_in,clk);
input [31:0] data_in;
input [2:0] mem_error_in;
input clk;
output [7:0] exc;
output [31:0] data_out, addr;
output [1:0] size;
output we;
reg [31:0] data_out, addr;
reg [1:0] size;
reg we;
reg [7:0] exc;
reg [31:0] gpr [0:31];
reg [31:0] pc, npc, nnpc;
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
reg [15:0] immed, highhalfofsignedimmed;
reg [31:0] simmed, uimmed;
reg [25:0] ii;
always @( posedge clk ) begin
addr = pc;
size = 3;
we = 0;
#1;
ir = data_in;
{opcode,rs,rt,rd,sa,func} = ir;
immed = ir[15:0];
highhalfofsignedimmed = immed[15] ? 16'hffff : 16'h0;
simmed = { highhalfofsignedimmed, immed };
uimmed = { 16'h0, immed };
ii = ir[25:0];
nnpc = npc + 4;
case( opcode )
o_rfmt:
case ( func )
f_add: gpr[rd] = gpr[rs] + gpr[rt];
f_sub: gpr[rd] = gpr[rs] - gpr[rt];
f_sll: gpr[rd] = gpr[rt] << sa;
default: exc = 1;
endcase
o_lbu:
begin
addr = gpr[rs] + simmed;
we = 0;
size = 1;
#1;
gpr[rt] = data_in;
end
o_sb: begin:A
reg [31:0] rt_val;
data_out = gpr[rt];
addr = gpr[rs] + simmed;
we = 1;
size = 1;
end
o_lui: gpr[rt] = { immed, 16'b0 };
o_addi: gpr[rt] = gpr[rs] + simmed;
o_andi: gpr[rt] = gpr[rs] & uimmed;
o_bne: if( gpr[rt] != gpr[rs] ) nnpc = npc + ( simmed << 2 ) ;
o_beq: if( gpr[rt] == gpr[rs] ) nnpc = npc + ( simmed << 2 ) ;
o_j: nnpc = { pc[31:28], ii, 2'b0 };
default: exc = 1;
endcase
gpr[0] = 0;
pc = npc;
npc = nnpc;
end
endmodule
`include "mipsi2tb.v"