-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDecode.vhd
213 lines (185 loc) · 6.68 KB
/
Decode.vhd
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.numeric_std.all;
USE IEEE.STD_LOGIC_SIGNED.all;
ENTITY DECODE IS
PORT(
BUFFERED_PC_SELECTOR_BIT : in std_logic;
I_BUBBLE : in std_logic;
ALU_MEMR : in std_logic;
MEM_MEMR : in std_logic;
ALU_RSRC : in std_logic_vector(2 downto 0);
ALU_RDST : in std_logic_vector(2 downto 0);
MEM_RSRC : in std_logic_vector(2 downto 0);
MEM_RDST : in std_logic_vector(2 downto 0);
FLAG_REG : in std_logic_vector(3 downto 0);
ALU_WB_SIGNALS : in std_logic_vector(1 downto 0);
EXECUTE_MEMORY_WB_SIGNALS : in std_logic_vector(1 downto 0);
EXECUTE_MEMORY_OUT_ADDRESS_SP_SRCRESULT : in std_logic_vector(15 downto 0);
EXECUTE_MEMORY_OUT_ALU_DATA : in std_logic_vector(15 downto 0);
SP : in std_logic_vector(8 downto 0);
PC : in std_logic_vector(8 downto 0);
IR : in std_logic_vector(15 downto 0);
ALU_STAGE_OUTPUT_SRC : in std_logic_vector(15 downto 0);
ALU_STAGE_OUTPUT_DST : in std_logic_vector(15 downto 0);
OPCODE_FROM_EXECUTE : in std_logic_vector(4 DOWNTO 0 ); --FROM BUFFER BEFORE EXECUTE
-- Rdst from register file.
REGISTER_FILE_OUTPUT : in std_logic_vector(15 downto 0);
PC_SELECTOR_BIT : out std_logic;
FLAGS_REG_WRITE : out std_logic;
SP_INC : out std_logic;
I_BUBBLE_OUT : out std_logic;
WB_SIGNALS : out std_logic_vector(1 downto 0);
MEM_SIGNALS : out std_logic_vector(1 downto 0);
RSRC : out std_logic_vector(2 downto 0);
RDST : out std_logic_vector(2 downto 0);
FLAG_REG_OUT : out std_logic_vector(3 downto 0);
OPCODE : out std_logic_vector(4 downto 0);
DECODING_STAGE_OUTPUT : out std_logic_vector(8 downto 0);
PC_OUT : out std_logic_vector(8 downto 0);
EA_OR_SP_SH_VALUE : out std_logic_vector(8 downto 0)
);
END ENTITY DECODE;
ARCHITECTURE ARCH OF DECODE IS
SIGNAL SIG_SP_INC_DETECTED : std_logic;
SIGNAL SIG_PASS_SP : std_logic;
SIGNAL SIG_BRANCH_TAKEN : std_logic;
SIGNAL SIG_ALU_FORWARD_RSRC : std_logic;
SIGNAL SIG_ALU_FORWARD_RDST : std_logic;
SIGNAL SIG_BRANCH_ADDRESS : std_logic_vector(8 downto 0);
SIGNAL SIG_BRANCH_DETECTED : std_logic;
SIGNAL SIG_DH_STALL : std_logic;
SIGNAL SIG_MEM_SIGNALS : std_logic_vector(1 downto 0 );
SIGNAL SIG_WB_SIGNALS : std_logic_vector(1 downto 0 );
SIGNAL SIG_RSRC : std_logic_vector(2 downto 0 );
SIGNAL SIG_RDST : std_logic_vector(2 downto 0 );
SIGNAL SIG_OPCODE : std_logic_vector(4 downto 0 );
SIGNAL SIG_EA_OR_SH_VALUE : std_logic_vector(8 downto 0);
SIGNAL SIG_BRANCH_DETECTOR_DATA : std_logic_vector(15 downto 0);
BEGIN
-- Instruction decoder component.
INSTRUCTION_DECODER: ENTITY work.INSTRUCTION_DECODER PORT MAP
(-- Input.
BUFFERED_PC_SELECTOR_BIT,
I_BUBBLE,
OPCODE_FROM_EXECUTE,
IR,
-- Output.
SIG_BRANCH_DETECTED,
SIG_SP_INC_DETECTED,
SIG_PASS_SP,
SIG_MEM_SIGNALS,
SIG_WB_SIGNALS,
SIG_RSRC,
SIG_RDST,
SIG_OPCODE,
SIG_EA_OR_SH_VALUE
);
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
-- hazard detector component.
HARZARD_DETECTOR: ENTITY work.STALL_DETECTOR PORT MAP
(-- Input.
SIG_OPCODE,
SIG_BRANCH_DETECTED,
SIG_WB_SIGNALS,
SIG_RSRC,
SIG_RDST,
ALU_RSRC,
ALU_RDST,
ALU_MEMR,
ALU_WB_SIGNALS,
MEM_RDST,
MEM_MEMR,
SIG_DH_STALL
);
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--branch detector.
BRANCH_DETECTOR: ENTITY work.BRANCH_DETECTOR PORT MAP
( -- Input.
SIG_BRANCH_DETECTED,
SIG_DH_STALL,
FLAG_REG,
SIG_OPCODE,
SIG_BRANCH_DETECTOR_DATA,
FLAG_REG_OUT,
-- outputs.
SIG_BRANCH_TAKEN,
FLAGS_REG_WRITE,
SIG_BRANCH_ADDRESS
);
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
--ALU to decode forwarding unit.
ALU_TO_DECODE_FORWARDING : ENTITY work.ALU_FORWARD PORT MAP
( -- Input.
SIG_BRANCH_DETECTED,
SIG_RSRC,
SIG_RDST,
ALU_RSRC,
ALU_RDST,
ALU_WB_SIGNALS,
-- Output
SIG_ALU_FORWARD_RSRC,
SIG_ALU_FORWARD_RDST
);
-- 9 bit value for shift value or Effective address.
EA_OR_SP_SH_VALUE <= sp when(SIG_PASS_SP='1')
else SIG_EA_OR_SH_VALUE;
-- RSRC, RDST signals.
RSRC <= SIG_RSRC;
RDST <= SIG_RDST;
-- PC out = pc in, (pass pc).
PC_OUT <= PC;
-- Pass I bubble.
I_BUBBLE_OUT <=I_BUBBLE;
PROCESS(I_BUBBLE, ALU_MEMR, MEM_MEMR, ALU_RSRC, ALU_RDST, MEM_RSRC, MEM_RDST, FLAG_REG,
ALU_WB_SIGNALS, SP, PC, IR, ALU_STAGE_OUTPUT_SRC, ALU_STAGE_OUTPUT_DST, REGISTER_FILE_OUTPUT,
SIG_SP_INC_DETECTED, SIG_BRANCH_TAKEN, SIG_ALU_FORWARD_RSRC, SIG_ALU_FORWARD_RDST,
SIG_BRANCH_ADDRESS, SIG_BRANCH_DETECTED, SIG_DH_STALL, SIG_RSRC, SIG_RDST, SIG_OPCODE, OPCODE_FROM_EXECUTE,
SIG_BRANCH_DETECTOR_DATA,EXECUTE_MEMORY_WB_SIGNALS
)
BEGIN
if(EXECUTE_MEMORY_WB_SIGNALS(0) ='1' and MEM_RDST = SIG_RDST) THEN
SIG_BRANCH_DETECTOR_DATA <= EXECUTE_MEMORY_OUT_ALU_DATA;
elsif(EXECUTE_MEMORY_WB_SIGNALS(1) ='1' and MEM_RSRC = SIG_RDST) then
SIG_BRANCH_DETECTOR_DATA <= EXECUTE_MEMORY_OUT_ADDRESS_SP_SRCRESULT;
ELSIF SIG_ALU_FORWARD_RDST = '1' THEN
SIG_BRANCH_DETECTOR_DATA <= ALU_STAGE_OUTPUT_DST;
ELSIF SIG_ALU_FORWARD_RSRC = '1' THEN
SIG_BRANCH_DETECTOR_DATA <=ALU_STAGE_OUTPUT_SRC;
ELSIF SIG_ALU_FORWARD_RSRC = '0' and SIG_ALU_FORWARD_RDST = '0' THEN
SIG_BRANCH_DETECTOR_DATA <= REGISTER_FILE_OUTPUT;
ELSE SIG_BRANCH_DETECTOR_DATA<=(others=>'0');
END IF;
-- Update sp and out the new value, if no stall.
IF SIG_SP_INC_DETECTED = '1' and SIG_DH_STALL = '0' THEN
SP_INC <= '1';
ELSE
SP_INC <= '0';
END IF;
-- Output bubble if stall in control signals and opcode.
IF SIG_DH_STALL = '1' THEN
WB_SIGNALS <= (others=>'0');
MEM_SIGNALS <= (others=>'0');-- (src, dst(write)).
OPCODE <= (others=>'0');
ELSE
WB_SIGNALS <= SIG_WB_SIGNALS;
MEM_SIGNALS <= SIG_MEM_SIGNALS;-- (src, dst(write)).
OPCODE <= SIG_OPCODE;
END IF;
-- If stall then pass old, stored PC, else pass branch address.
IF SIG_DH_STALL = '1' THEN
DECODING_STAGE_OUTPUT <= PC;
ELSE
DECODING_STAGE_OUTPUT <= SIG_BRANCH_ADDRESS;
END IF;
-- PC_SELECTOR_BIT = 1 if branch taken or stall.
IF SIG_DH_STALL = '1' or SIG_BRANCH_TAKEN = '1'THEN
PC_SELECTOR_BIT <= '1';
ELSE
PC_SELECTOR_BIT <= '0';
END IF;
END PROCESS;
END ARCH;