OpenCores
URL https://opencores.org/ocsvn/fluid_core_2/fluid_core_2/trunk

Subversion Repositories fluid_core_2

[/] [fluid_core_2/] [trunk/] [xilinx14.5 project/] [FluidCore.v] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 azmathmoos
`timescale 1ns / 1ps
2
`include "Configuration.v"
3
 
4
module FluidCore(
5
        input [0:`inst_w] exInstruction,
6
        input Clk,
7
        input RST,
8
        input [0:`intr_msb] Interrupt,
9
        output [0:`pc_w] exInstAddr,
10
        output [0:`memory_bus_w] exMemoryAddr,
11
        inout [0:`dpw] exMemoryData,
12
        output exMemoryClk,
13
        output exMemoryWrite
14
        );
15
 
16
        wire Return, linked;
17
        wire wb_write, write_intr, write_uop, intr, branch;
18
        wire [0:`pc_w] intr_vector;
19
        wire [0:`uop_vector_msb] uop_vector;
20
        wire [0:`uop_msb] uop;
21
        wire [0:4] bubble_lines;
22
        wire stall_IF_ID_EX, load_hazard;
23
        Staller Staller_inst(.Clk(Clk),.RST(RST),.bubble(branch|Return),.bubble_lines(bubble_lines),.load_hazard(load_hazard),.stall(stall_IF_ID_EX));
24
 
25
        wire [0:`IF_ID_reg_w] IF_ID_reg_in, IF_ID_reg_out;
26
        P_Reg #(`IF_ID_reg_w) IF_ID_reg(.Clk(Clk),.RST(RST),.stall(stall_IF_ID_EX),.bubble(bubble_lines[0]),.prev_stage(IF_ID_reg_in),.next_stage(IF_ID_reg_out));
27
 
28
        wire [0:`ID_EX_reg_w] ID_EX_reg_in, ID_EX_reg_out;
29
        P_Reg #(`ID_EX_reg_w) ID_EX_reg(.Clk(Clk),.RST(RST),.stall(stall_IF_ID_EX),.bubble(bubble_lines[1]),.prev_stage(ID_EX_reg_in),.next_stage(ID_EX_reg_out));
30
 
31
        wire [0:`EX_MEM_reg_w] EX_MEM_reg_in, EX_MEM_reg_out;
32
        P_Reg #(`EX_MEM_reg_w) EX_MEM_reg(.Clk(Clk),.RST(RST),.stall(stall_IF_ID_EX),.bubble(bubble_lines[2]),.prev_stage(EX_MEM_reg_in),.next_stage(EX_MEM_reg_out));
33
 
34
        wire [0:`MEM_WB_reg_w] MEM_WB_reg_in, MEM_WB_reg_out;
35
        P_Reg #(`MEM_WB_reg_w) MEM_WB_reg(.Clk(Clk),.RST(RST),.stall(0),.bubble(bubble_lines[3]),.prev_stage(MEM_WB_reg_in),.next_stage(MEM_WB_reg_out));
36
 
37
 
38
        wire [0:`dpw] op_reg_a, op_reg_b, wb_data;
39
        wire [0:`reg_sel_w] reg_a, reg_b;
40
        wire [0:`bc_msb] wb_dst;
41
        wire [0:`pc_w] branch_target;
42
        wire [0:3] stkFlag;
43
 
44
        //------Forwarding Logic-----------//
45
        wire s_EX_MEM_reg, s_ID_EX_reg, rrr_adm, rri_adm, not_ID_EX_branch, not_EX_MEM_branch, ID_EX_load, not_branch;
46
        wire [0:`reg_sel_w] d_EX_MEM_reg, d_ID_EX_reg;
47
        wire [0:`dpw] b_EX_MEM_reg, b_MEM_WB_reg;
48
        wire [0:1] reg_src_A, reg_src_B, st_src;
49
        wire [0:2] load_hazard_abs;
50
        wire [0:3] adm;
51
        wire [0:`type_msb] t_ID_EX_reg, t_EX_MEM_reg, t_IF_ID_reg;
52
        /*
53
                d prefixed wires carry previous stage destination registers, these are compared with current inst's dest reg
54
                if they match, current inst is associated with some bits to specify fwding from that stage
55
        */
56
        assign s_EX_MEM_reg = bubble_lines[3]; //actual reg is populated a cycle after so sample it after a cycle hence 3 instead of 2
57
        assign s_ID_EX_reg = bubble_lines[2]; //same as above
58
        assign t_ID_EX_reg = ID_EX_reg_out[0:`type_msb];
59
        assign t_EX_MEM_reg = EX_MEM_reg_out[0:`type_msb];
60
        assign d_ID_EX_reg = ID_EX_reg_out[`type_msb+1+`wb_dst_msb+1+`mod_sel_msb+1+`operation_msb+1:`type_msb+1+`wb_dst_msb+1+`mod_sel_msb+1+`operation_msb+1+`bc_msb];
61
        assign d_EX_MEM_reg = EX_MEM_reg_out[`type_msb+1+`wb_dst_msb+1:`type_msb+1+`wb_dst_msb+1+`bc_msb];
62
        assign b_EX_MEM_reg = EX_MEM_reg_out[`type_msb+1+`wb_dst_msb+1+`bc_msb+1+`dpw+1:`type_msb+1+`wb_dst_msb+1+`bc_msb+1+`dpw+1+`dpw];
63
        assign b_MEM_WB_reg = MEM_WB_reg_out[`type_msb+1+`wb_dst_msb+1+`reg_sel_w+1:`type_msb+1+`wb_dst_msb+1+`reg_sel_w+1+`dpw];
64
        assign not_ID_EX_branch = ~(t_ID_EX_reg == `type_branch);//(|(t_ID_EX_reg ^ `type_branch));
65
        assign not_EX_MEM_branch = ~(t_EX_MEM_reg == `type_branch);// (|(t_EX_MEM_reg ^ `type_branch));
66
        assign ID_EX_load = (t_ID_EX_reg == `type_load);//~(|(t_ID_EX_reg ^ `type_load));
67
        assign fw_c_1 = s_ID_EX_reg & not_branch & not_ID_EX_branch;
68
        assign fw_c_2 = s_EX_MEM_reg & not_branch & not_EX_MEM_branch;
69
//--------Clock and Reset Behaviour--------//
70
 
71
//always@(posedge Clk or posedge RST) begin
72
//      if (RST) begin
73
//              
74
//              ID_EX_reg <= 0;
75
//              EX_MEM_reg <= 0;
76
//              MEM_WB_reg <= 0;
77
//      end
78
//      else begin
79
//              
80
//              ID_EX_reg <= ID_EX_reg_wire;
81
//              EX_MEM_reg <= EX_MEM_reg_wire;
82
//              MEM_WB_reg <= MEM_WB_reg_wire;
83
//      end
84
//end
85
 
86
//--------Sub Modules-------------------//      
87
 
88
//Instruction Fetch Stage
89
IF_Stage IF_Stage_inst (
90
.Clk(Clk),
91
.RST(RST),
92
.intr(intr),
93
.stkFlag(stkFlag),
94
.return_back(Return),
95
.linked(linked),
96
.intr_vector(intr_vector),
97
.exInstruction(exInstruction),
98
.exInstAddr(exInstAddr),
99
.IF_ID_reg(IF_ID_reg_in),
100
.branch_target(branch_target),
101
.branch(branch),
102
.stall(stall_IF_ID_EX)
103
);
104
 
105
//Register File
106
Reg_File Reg_File_inst (
107
.Clk(Clk),
108
.RST(RST),
109
.reg_a(reg_a),
110
.reg_b(reg_b),
111
.wb_reg(wb_dst),
112
.op_a(op_reg_a),
113
.op_b(op_reg_b),
114
.word(wb_data),
115
.write(wb_write)
116
);
117
 
118
//----Operand Forwarding----//
119
Reg_Hist Reg_Hist_inst (
120
//.Clk(Clk),
121
//.RST(RST),
122
//.s_ID_EX_reg(s_ID_EX_reg),
123
//.s_EX_MEM_reg(s_EX_MEM_reg),
124
.ID_EX_reg(d_ID_EX_reg),
125
.EX_MEM_reg(d_EX_MEM_reg),
126
//.ID_EX_type(t_ID_EX_reg),
127
.nxt_reg_A(IF_ID_reg_out[`uop_vector_msb+1+`bc_msb+1+`reg_sel_w+1:`uop_vector_msb+1+`bc_msb+1+`reg_sel_w+1+`reg_sel_w]),
128
.nxt_reg_B(IF_ID_reg_out[`uop_vector_msb+1+`bc_msb+1:`uop_vector_msb+1+`bc_msb+1+`reg_sel_w]),
129
.st_reg(IF_ID_reg_out[`uop_vector_msb+1+`bc_msb-`reg_sel_w:`uop_vector_msb+1+`bc_msb]),
130
//.type(t_IF_ID_reg),
131
.reg_src_A(reg_src_A),
132
.reg_src_B(reg_src_B),
133
.load_hazard(load_hazard),
134
.load_hazard_abs(load_hazard_abs),
135
.st_src(st_src),
136
.rrr_adm(rrr_adm),
137
.rri_adm(rri_adm),
138
//.not_ID_EX_branch(not_ID_EX_branch),
139
//.not_EX_MEM_branch(not_EX_MEM_branch),
140
.ID_EX_load(ID_EX_load),
141
//.not_branch(not_branch),
142
.fw_c_1(fw_c_1),
143
.fw_c_2(fw_c_2)
144
//.stall(stall_IF_ID_EX)
145
);
146
//Instruction Decode Stage
147
ID_Stage ID_Stage_inst (
148
.Clk(Clk),
149
.RST(RST),
150
.IF_ID_reg(IF_ID_reg_out),
151
.RF_a(reg_a),
152
.RF_b(reg_b),
153
.RF_op_a(op_reg_a),
154
.RF_op_b(op_reg_b),
155
.ID_EX_reg(ID_EX_reg_in),
156
.reg_src_A(reg_src_A),
157
.reg_src_B(reg_src_B),
158
//.curr_type(t_IF_ID_reg),
159
.load_hazard_abs(load_hazard_abs),
160
.st_src(st_src),
161
.rrr_adm(rrr_adm),
162
.rri_adm(rri_adm),
163
.not_branch(not_branch),
164
.uop_vector(uop_vector),
165
.uop(uop)
166
);
167
 
168
//uOP Store
169
uOP_Store uOP_Store_inst(
170
                .Clk(Clk),
171
                .uop_vector(uop_vector),
172
                .uop(uop),
173
                .write(write_uop),
174
                .write_vector(wb_dst),
175
                .write_uop(wb_data)
176
        );
177
 
178
//Execute Stage
179
EX_Stage EX_Stage_inst (
180
.Clk(Clk),
181
.RST(RST),
182
.ret(Return),
183
.stkFlag(stkFlag),
184
.ID_EX_reg(ID_EX_reg_out),
185
.EX_MEM_reg(EX_MEM_reg_in),
186
.b_EX_MEM_reg(b_EX_MEM_reg),
187
.b_MEM_WB_reg(b_MEM_WB_reg)
188
);
189
 
190
//Memory Stage
191
MEM_Stage MEM_Stage_inst (
192
.Clk(Clk),
193
.RST(RST),
194
.linked(linked),
195
.EX_MEM_reg(EX_MEM_reg_out),
196
.MEM_WB_reg(MEM_WB_reg_in),
197
.ex_mem_addr(exMemoryAddr),
198
.ex_mem_data(exMemoryData),
199
.mem_Clk(exMemoryClk),
200
.mem_wr(exMemoryWrite),
201
.branch_target(branch_target),
202
.branch(branch),
203
.return_back(Return)
204
);
205
 
206
//Write Back Stage
207
WB_Stage WB_Stage_inst (
208
.Clk(Clk),
209
.RST(RST),
210
.MEM_WB_reg(MEM_WB_reg_out),
211
.wb_dst(wb_dst),
212
.wb_data(wb_data),
213
.write_rf(wb_write),
214
.write_intr(write_intr),
215
.write_uop(write_uop),
216
.branch(branch),
217
.bubble_free(bubble_lines[4])
218
);
219
 
220
//Interrupt Unit
221
interrupt_unit interrupt_unit_inst(
222
.Clk(Clk),
223
.return_back(Return),
224
.intr_req(Interrupt),
225
.intr_inx(wb_dst),
226
.intr(intr),
227
.vector(intr_vector),
228
.new_vector(wb_data),
229
.write(write_intr)
230
);
231
 
232
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.