-
Notifications
You must be signed in to change notification settings - Fork 0
/
ForwardUnit.v
91 lines (84 loc) · 3.08 KB
/
ForwardUnit.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
`timescale 1ns / 1ps
module ForwardUnit(
EXMEM_RegWrite,
EXMEM_RegWriteAddr,
IDEX_Rt,
IDEX_Rs,
ID_PCSrc,
IFID_Rs,
IDEX_RegWriteAddr,
IDEX_RegWrite,
MEMWB_RegWrite,
MEMWB_RegWriteAddr,
ForwardA,
ForwardB,
ForwardJ
);
input EXMEM_RegWrite;
input [4:0] EXMEM_RegWriteAddr;
input [4:0] IDEX_Rt;
input [4:0] IDEX_Rs;
input [2:0] ID_PCSrc;
input [4:0] IFID_Rs;
input [4:0] IDEX_RegWriteAddr;
input IDEX_RegWrite;
input MEMWB_RegWrite;
input [4:0] MEMWB_RegWriteAddr;
output reg [1:0] ForwardA;
output reg [1:0] ForwardB;
output reg [1:0] ForwardJ;
initial begin
ForwardA = 2'b00;
ForwardB = 2'b00;
ForwardJ = 2'b00;
end
always @(*) begin
if(EXMEM_RegWrite == 1'b1 && // Register writing enabled
EXMEM_RegWriteAddr != 5'b0 && // Not writing $0
EXMEM_RegWriteAddr == IDEX_Rs // Will use the same register immediately in EX
)
ForwardA = 2'b10;
else if(MEMWB_RegWrite == 1'b1 && // Register writing enabled
MEMWB_RegWriteAddr != 5'b0 && // Not writing $0
MEMWB_RegWriteAddr == IDEX_Rs // Will use the same register immediately in EX
)
ForwardA = 2'b01;
else
ForwardA = 2'b00;
if(EXMEM_RegWrite == 1'b1 && // Register writing enabled
EXMEM_RegWriteAddr != 5'b0 && // Not writing $0
EXMEM_RegWriteAddr == IDEX_Rt // Will use the same register immediately in EX
)
ForwardB = 2'b10;
else if(MEMWB_RegWrite == 1'b1 && // Register writing enabled
MEMWB_RegWriteAddr != 5'b0 && // Not writing $0
MEMWB_RegWriteAddr == IDEX_Rt // Will use the same register immediately in EX
)
ForwardB = 2'b01;
else
ForwardB = 2'b00;
if(ID_PCSrc == 3'b010 && // jr, jalr
IFID_Rs == IDEX_RegWriteAddr && // Will use the same register immediately in ID
IDEX_RegWrite && // Register writing enabled
IDEX_RegWriteAddr != 0 //Not writing $0
)
ForwardJ = 2'b01;
else if(ID_PCSrc == 3'b010 &&
IFID_Rs != IDEX_RegWriteAddr &&
IFID_Rs == EXMEM_RegWriteAddr &&
EXMEM_RegWrite &&
EXMEM_RegWriteAddr != 0
)
ForwardJ = 2'b10;
else if(ID_PCSrc == 3'b010 &&
IFID_Rs != IDEX_RegWriteAddr &&
IFID_Rs != EXMEM_RegWriteAddr &&
IFID_Rs == MEMWB_RegWriteAddr &&
MEMWB_RegWrite &&
MEMWB_RegWriteAddr != 0
)
ForwardJ = 2'b11;
else
ForwardJ = 2'b00;
end
endmodule