|
@@ -1,8 +1,8 @@
|
|
|
import project_pkg::*;
|
|
import project_pkg::*;
|
|
|
|
|
|
|
|
-module datapath(clk, rst, rs, rt, imm, alu_op, reg_wr, pc_src, alu_src, mem_to_reg, pc, alu_out, mem_data, alu_zero, mem_wr_data);
|
|
|
|
|
- input logic clk, rst, reg_wr, pc_src, alu_src, mem_to_reg;
|
|
|
|
|
- input e_reg rs, rt;
|
|
|
|
|
|
|
+module datapath(clk, rst, rd, rs, imm, alu_op, reg_wr, pc_src, rimm, alu_src, mem_to_reg, pc, alu_out, mem_data, alu_zero, mem_wr_data);
|
|
|
|
|
+ input logic clk, rst, reg_wr, pc_src, rimm, mem_to_reg, alu_src;
|
|
|
|
|
+ input e_reg rd, rs;
|
|
|
input e_alu_op alu_op;
|
|
input e_alu_op alu_op;
|
|
|
input word imm, mem_data;
|
|
input word imm, mem_data;
|
|
|
output word pc, alu_out, mem_wr_data;
|
|
output word pc, alu_out, mem_wr_data;
|
|
@@ -11,25 +11,27 @@ module datapath(clk, rst, rs, rt, imm, alu_op, reg_wr, pc_src, alu_src, mem_to_r
|
|
|
// Reg File
|
|
// Reg File
|
|
|
word reg_rd_d1, reg_rd_d2, reg_wr_d;
|
|
word reg_rd_d1, reg_rd_d2, reg_wr_d;
|
|
|
e_reg reg_rd_a1, reg_rd_a2, reg_wr_a;
|
|
e_reg reg_rd_a1, reg_rd_a2, reg_wr_a;
|
|
|
- assign reg_rd_a1 = rs;
|
|
|
|
|
- assign reg_rd_a2 = rt;
|
|
|
|
|
- assign reg_wr_a = rs;
|
|
|
|
|
|
|
+ assign reg_rd_a1 = rd;
|
|
|
|
|
+ assign reg_rd_a2 = rs;
|
|
|
|
|
+ assign reg_wr_a = rd;
|
|
|
assign reg_wr_d = (mem_to_reg) ? mem_data : alu_out;
|
|
assign reg_wr_d = (mem_to_reg) ? mem_data : alu_out;
|
|
|
reg_file RFILE(clk, rst, reg_rd_a1, reg_rd_a2, reg_rd_d1, reg_rd_d2, reg_wr_a, reg_wr_d, reg_wr);
|
|
reg_file RFILE(clk, rst, reg_rd_a1, reg_rd_a2, reg_rd_d1, reg_rd_d2, reg_wr_a, reg_wr_d, reg_wr);
|
|
|
|
|
|
|
|
// Mem output data
|
|
// Mem output data
|
|
|
- assign mem_wr_data = reg_rd_a2;
|
|
|
|
|
|
|
+ assign mem_wr_data = reg_rd_d1;
|
|
|
|
|
|
|
|
// ALU
|
|
// ALU
|
|
|
word alu_srcA, alu_srcB;
|
|
word alu_srcA, alu_srcB;
|
|
|
assign alu_srcA = reg_rd_d1;
|
|
assign alu_srcA = reg_rd_d1;
|
|
|
- assign alu_srcB = (alu_src) ? imm : reg_rd_d2;
|
|
|
|
|
|
|
+ assign alu_srcB = alu_src ? imm : reg_rd_d2;
|
|
|
alu ALU(alu_op, alu_srcA, alu_srcB, alu_out, alu_zero);
|
|
alu ALU(alu_op, alu_srcA, alu_srcB, alu_out, alu_zero);
|
|
|
|
|
|
|
|
// Program counter
|
|
// Program counter
|
|
|
word pcn; // PC next
|
|
word pcn; // PC next
|
|
|
word pcj; // PC jump, +2 if imm used otherwise +1
|
|
word pcj; // PC jump, +2 if imm used otherwise +1
|
|
|
- assign pcj = (alu_src) ? pc + 2 : pc + 1;
|
|
|
|
|
|
|
+ logic [0:1]pcadd;
|
|
|
|
|
+ assign pcadd = (rimm) ? 2 : 1;
|
|
|
|
|
+ assign pcj = pc + pcadd;
|
|
|
//assign pcj = pc + 1;
|
|
//assign pcj = pc + 1;
|
|
|
assign pcn = (pc_src) ? imm : pcj;
|
|
assign pcn = (pc_src) ? imm : pcj;
|
|
|
always_ff@(posedge clk) begin
|
|
always_ff@(posedge clk) begin
|
|
@@ -39,11 +41,11 @@ module datapath(clk, rst, rs, rt, imm, alu_op, reg_wr, pc_src, alu_src, mem_to_r
|
|
|
endmodule
|
|
endmodule
|
|
|
|
|
|
|
|
module datapath_tb;
|
|
module datapath_tb;
|
|
|
- logic clk, rst, reg_wr, pc_src, alu_src, mem_to_reg, alu_zero;
|
|
|
|
|
|
|
+ logic clk, rst, reg_wr, pc_src, rimm, mem_to_reg, alu_zero;
|
|
|
e_reg rs, rt;
|
|
e_reg rs, rt;
|
|
|
e_alu_op alu_op;
|
|
e_alu_op alu_op;
|
|
|
word imm, mem_data, pc, alu_out;
|
|
word imm, mem_data, pc, alu_out;
|
|
|
- datapath DPATH(clk, rst, rs, rt, imm, alu_op, reg_wr, pc_src, alu_src, mem_to_reg, pc, alu_out, mem_data, alu_zero);
|
|
|
|
|
|
|
+ datapath DPATH(clk, rst, rs, rt, imm, alu_op, reg_wr, pc_src, rimm, mem_to_reg, pc, alu_out, mem_data, alu_zero);
|
|
|
|
|
|
|
|
initial begin
|
|
initial begin
|
|
|
clk = 0;
|
|
clk = 0;
|
|
@@ -54,11 +56,11 @@ module datapath_tb;
|
|
|
rst = 1;
|
|
rst = 1;
|
|
|
reg_wr = 0;
|
|
reg_wr = 0;
|
|
|
pc_src = 0;
|
|
pc_src = 0;
|
|
|
- alu_src = 0;
|
|
|
|
|
|
|
+ rimm = 0;
|
|
|
mem_to_reg = 0;
|
|
mem_to_reg = 0;
|
|
|
- rs = RegA;
|
|
|
|
|
- rt = RegA;
|
|
|
|
|
- alu_op = ALU_NOP;
|
|
|
|
|
|
|
+ rs = ra;
|
|
|
|
|
+ rt = ra;
|
|
|
|
|
+ alu_op = ALU_CPY;
|
|
|
imm = 8'h00;
|
|
imm = 8'h00;
|
|
|
mem_data = 8'h00;
|
|
mem_data = 8'h00;
|
|
|
#10ns;
|
|
#10ns;
|
|
@@ -67,16 +69,16 @@ module datapath_tb;
|
|
|
mem_to_reg = 1;
|
|
mem_to_reg = 1;
|
|
|
mem_data = 8'h7A;
|
|
mem_data = 8'h7A;
|
|
|
#10ns;
|
|
#10ns;
|
|
|
- rs = RegB;
|
|
|
|
|
|
|
+ rs = rb;
|
|
|
mem_data = 8'h8A;
|
|
mem_data = 8'h8A;
|
|
|
#10ns;
|
|
#10ns;
|
|
|
- rs = RegC;
|
|
|
|
|
|
|
+ rs = rc;
|
|
|
mem_data = 8'h9A;
|
|
mem_data = 8'h9A;
|
|
|
#10ns;
|
|
#10ns;
|
|
|
- rs = RegD;
|
|
|
|
|
|
|
+ rs = re;
|
|
|
mem_data = 8'hFD;
|
|
mem_data = 8'hFD;
|
|
|
#10ns;
|
|
#10ns;
|
|
|
- rs = RegA;
|
|
|
|
|
|
|
+ rs = ra;
|
|
|
#10ns;
|
|
#10ns;
|
|
|
$stop;
|
|
$stop;
|
|
|
end
|
|
end
|