Files
WMU-ECE-3570-Lab/lab2CA.srcs/sources_1/new/RegFile.v
2019-03-13 11:14:52 -04:00

145 lines
2.9 KiB
Verilog

`timescale 1ns / 1ps
module RegFile(input wire clk, reset, enable,
input wire [1:0] write_index, op0_idx, op1_idx,
input wire [8:0] write_data,
output wire [8:0] op0, op1);
wire [3:0] decOut;
wire [8:0] r0_out, r1_out, r2_out, r3_out;
// To select a register En input must be 2'b00
decoder d0(
.en(enable),
.index(write_index),
.regOut(decOut)
);
register r0(
.clk(clk),
.reset(reset),
.En(decOut[0]),
.Din(write_data),
.Dout(r0_out));
register r1(
.clk(clk),
.reset(reset),
.En(decOut[1]),
.Din(write_data),
.Dout(r1_out));
register r2(
.clk(clk),
.reset(reset),
.En(decOut[2]),
.Din(write_data),
.Dout(r2_out));
register r3(
.clk(clk),
.reset(reset),
.En(decOut[3]),
.Din(write_data),
.Dout(r3_out));
mux_4_1 m0(
.A(r0_out),
.B(r1_out),
.C(r2_out),
.D(r3_out),
.out(op0),
.switch(op0_idx));
mux_4_1 m1(
.A(r0_out),
.B(r1_out),
.C(r2_out),
.D(r3_out),
.out(op1),
.switch(op1_idx));
endmodule
//testbench
module regFile_tb();
reg [8:0] write_d;
reg [1:0] w_idx, op0_idx, op1_idx;
reg reset,clk, enable;
wire [8:0] op0,op1;
initial begin
clk = 1'b0;
end
always begin
#5 clk = ~clk; // Period to be determined
end
RegFile regFile0(
.clk(clk),
.enable(enable),
.reset(reset),
.write_index(w_idx),
.op0_idx(op0_idx),
.op1_idx(op1_idx),
.write_data(write_d),
.op0(op0),
.op1(op1));
initial begin
reset = 0;
#5
reset = 1;
#5
reset = 0;
enable = 1;
w_idx = 2'b00;
op0_idx = 2'b00;
op1_idx = 2'b00;
write_d = 9'b000000011;
#5
w_idx = 2'b01;
#5
w_idx = 2'b10;
#5
w_idx = 2'b11;
#5
reset = 0;
w_idx = 2'b00;
op0_idx = 2'b10;
op1_idx = 2'b11;
write_d = 9'b001111000;
#5
reset = 0;
w_idx = 2'b01;
op0_idx = 2'b00;
op1_idx = 2'b01;
write_d = 9'b000001111;
#5
reset = 0;
w_idx = 2'b10;
op0_idx = 2'b00;
op1_idx = 2'b10;
write_d = 9'b111000001;
#5
reset = 0;
w_idx = 2'b11;
op0_idx = 2'b11;
op1_idx = 2'b10;
write_d = 9'b100110001;
#5
reset = 1;
w_idx = 2'b00;
#5
w_idx = 2'b10;
#5
w_idx = 2'b01;
#5
w_idx = 2'b11;
#5
$finish;
end
endmodule