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

Subversion Repositories edge

[/] [edge/] [trunk/] [HW/] [Verilog/] [ex_mem_pipereg.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 heshamelma
//////////////////////////////////////////////////////////////////
2
//                                                              //
3
//  EX/MEM pipeline register                                    //
4
//                                                              //
5
//  This file is part of the Edge project                       //
6
//  http://www.opencores.org/project,edge                       //
7
//                                                              //
8
//  Description                                                 //
9
//  Pipeline register lies between execute and memory stages    //
10
//                                                              //
11
//  Author(s):                                                  //
12
//      - Hesham AL-Matary, heshamelmatary@gmail.com            //
13
//                                                              //
14
//////////////////////////////////////////////////////////////////
15
//                                                              //
16
// Copyright (C) 2014 Authors and OPENCORES.ORG                 //
17
//                                                              //
18
// This source file may be used and distributed without         //
19
// restriction provided that this copyright statement is not    //
20
// removed from the file and that any derivative work contains  //
21
// the original copyright notice and the associated disclaimer. //
22
//                                                              //
23
// This source file is free software; you can redistribute it   //
24
// and/or modify it under the terms of the GNU Lesser General   //
25
// Public License as published by the Free Software Foundation; //
26
// either version 2.1 of the License, or (at your option) any   //
27
// later version.                                               //
28
//                                                              //
29
// This source is distributed in the hope that it will be       //
30
// useful, but WITHOUT ANY WARRANTY; without even the implied   //
31
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      //
32
// PURPOSE.  See the GNU Lesser General Public License for more //
33
// details.                                                     //
34
//                                                              //
35
// You should have received a copy of the GNU Lesser General    //
36
// Public License along with this source; if not, download it   //
37
// from http://www.opencores.org/lgpl.shtml                     //
38
//                                                              //
39
//////////////////////////////////////////////////////////////////
40
 
41
module ex_mem_pipereg
42
#
43
( parameter N=32,
44
  parameter M=5
45
)
46
(
47
  input clk,
48
  input reset,
49
  input en,
50
  input zero_in,
51
  input sign_in,
52
  input[N-1:0] ALUout_in,
53
  input[N-1:0] WriteData_in,
54
  input[N-1:0] PCBranch_in,
55
  input[N-1:0] PCJump_in,
56
  input[M-1:0] WriteReg_in,
57
  input RegWrite_in,
58
  input[1:0] WBResultSelect_in,
59
 
60
  input[5:0] opcode_in,
61
  input MemWrite_in,
62
  input Branch_in,
63
  input Jump_in,
64
  input JumpR_in,
65
  input[2:0] BHW_in, /* byte or halfword or word ? */
66
  input[N-1:0] lo_in,
67
  input[N-1:0] hi_in,
68
  input loEN,
69
  input hiEN,
70
  input[N-1:0] pcplus4_in,
71
  input link_in,
72
 
73
  /* Coprocessor0 and exceptions signals */
74
  input undefinedEx_in,
75
  input breakEx_in,
76
  input divbyZero_in,
77
  input syscallEx_in,
78
 
79
  input[M-1:0] CP0_wa_in,
80
  input[M-1:0] CP0_ra_in,
81
  input[1:0] CP0_Inst_in,
82
  input[N-1:0] CP0_dout_in,
83
  input[N-1:0] CP0_din_in,
84
 
85
  input[1:0] MemRefSize_in,
86
 
87
  output zero_out,
88
  output sign_out,
89
  output[N-1:0] ALUout_out,
90
  output[N-1:0] WriteData_out,
91
  output[N-1:0] PCBranch_out,
92
  output[N-1:0] PCJump_out,
93
  output[M-1:0] WriteReg_out,
94
  output RegWrite_out,
95
  output[1:0] WBResultSelect_out,
96
  output MemWrite_out,
97
  output Branch_out,
98
  output Jump_out,
99
  output JumpR_out,
100
  output[2:0] BHW_out, /* byte or halfword or word ? */
101
  output[N-1:0] lo_out,
102
  output[N-1:0] hi_out,
103
  output[5:0] opcode_out,
104
  output[N-1:0] pcplus4_out,
105
  output link_out,
106
 
107
  /* Coprocessor0 and exceptions signals */
108
  output undefinedEx_out,
109
  output breakEx_out,
110
  output divbyZero_out,
111
  output syscallEx_out,
112
 
113
  output[M-1:0] CP0_wa_out,
114
  output[M-1:0] CP0_ra_out,
115
  output[1:0] CP0_Inst_out,
116
  output[N-1:0] CP0_dout_out,
117
  output[N-1:0] CP0_din_out,
118
 
119
  output[1:0] MemRefSize_out
120
);
121
 
122
/* Opcode */
123
register #(6)
124
opcode
125
(
126
  .clk(clk), .reset(reset), .en(en),
127
  .d(opcode_in),
128
  .q(opcode_out)
129
);
130
 
131
/* Zero flag */
132
register #(1)
133
zero
134
(
135
  .clk(clk), .reset(reset), .en(en),
136
  .d(zero_in),
137
  .q(zero_out)
138
);
139
 
140
/* Sign Flag */
141
register #(1)
142
sign
143
(
144
  .clk(clk), .reset(reset), .en(en),
145
  .d(sign_in),
146
  .q(sign_out)
147
);
148
 
149
/* ALU output */
150
register ALUout
151
(
152
  .clk(clk), .reset(reset), .en(en),
153
  .d(ALUout_in),
154
  .q(ALUout_out)
155
);
156
 
157
/* PC plus 4 */
158
register pcplus4
159
(
160
  .clk(clk), .reset(reset), .en(en),
161
  .d(pcplus4_in),
162
  .q(pcplus4_out)
163
);
164
 
165
/* hi, lo special purpose registers */
166
register lo
167
(
168
  .clk(clk), .reset(0), .en(loEN),
169
  .d(lo_in),
170
  .q(lo_out)
171
);
172
 
173
register hi
174
(
175
  .clk(clk), .reset(0), .en(hiEN),
176
  .d(hi_in),
177
  .q(hi_out)
178
);
179
 
180
/* Write data in case of store instruction */
181
register WriteData
182
(
183
  .clk(clk), .reset(reset), .en(en),
184
  .d(WriteData_in),
185
  .q(WriteData_out)
186
);
187
 
188
/* Calcualted branch address */
189
register PCBranch
190
(
191
  .clk(clk), .reset(reset), .en(en),
192
  .d(PCBranch_in),
193
  .q(PCBranch_out)
194
);
195
 
196
/* Caluculated jump address */
197
register PCJump
198
(
199
  .clk(clk), .reset(reset), .en(en),
200
  .d(PCJump_in),
201
  .q(PCJump_out)
202
);
203
 
204
/* Write Register address */
205
register #(5)
206
WriteReg
207
(
208
  .clk(clk), .reset(reset), .en(en),
209
  .d(WriteReg_in),
210
  .q(WriteReg_out)
211
);
212
 
213
/* Control Signal */
214
register #(1)
215
RegWrite
216
(
217
  .clk(clk), .reset(reset), .en(en),
218
  .d(RegWrite_in),
219
  .q(RegWrite_out)
220
);
221
 
222
register #(1)
223
link
224
(
225
  .clk(clk), .reset(reset), .en(en),
226
  .d(link_in),
227
  .q(link_out)
228
);
229
 
230
register #(2)
231
WBResultSelect
232
(
233
  .clk(clk), .reset(reset), .en(en),
234
  .d(WBResultSelect_in),
235
  .q(WBResultSelect_out)
236
);
237
 
238
register #(1)
239
MemWrite
240
(
241
  .clk(clk), .reset(reset), .en(en),
242
  .d(MemWrite_in),
243
  .q(MemWrite_out)
244
);
245
 
246
register #(1)
247
Branch
248
(
249
  .clk(clk), .reset(reset), .en(en),
250
  .d(Branch_in),
251
  .q(Branch_out)
252
);
253
 
254
register #(1)
255
Jump
256
(
257
  .clk(clk),
258
  .reset(reset),
259
  .en(en),
260
  .d(Jump_in),
261
  .q(Jump_out)
262
);
263
 
264
register #(1)
265
JumpR
266
(
267
  .clk(clk), .reset(reset), .en(en),
268
  .d(JumpR_in),
269
  .q(JumpR_out)
270
);
271
 
272
register #(3)
273
BHW
274
(
275
  .clk(clk), .reset(reset), .en(en),
276
  .d(BHW_in),
277
  .q(BHW_out)
278
);
279
 
280
/* Coprocessor zero related */
281
register #(1)
282
undefinedEx
283
(
284
  .clk(clk), .reset(reset), .en(en),
285
  .d(undefinedEx_in),
286
  .q(undefinedEx_out)
287
);
288
 
289
register #(1)
290
breakEx
291
(
292
  .clk(clk),
293
  .reset(reset),
294
  .en(en),
295
  .d(breakEx_in),
296
  .q(breakEx_out)
297
);
298
 
299
register #(1)
300
divbyZero
301
(
302
  .clk(clk),
303
  .reset(reset),
304
  .en(en),
305
  .d(divbyZero_in),
306
  .q(divbyZero_out)
307
);
308
 
309
register #(1)
310
syscallEx
311
(
312
  .clk(clk), .reset(reset), .en(en),
313
  .d(syscallEx_in),
314
  .q(syscallEx_out)
315
);
316
 
317
register #(5)
318
CP0_wa
319
(
320
  .clk(clk), .reset(reset), .en(en),
321
  .d(CP0_wa_in),
322
  .q(CP0_wa_out)
323
);
324
 
325
register #(5)
326
CP0_ra
327
(
328
  .clk(clk), .reset(reset), .en(en),
329
  .d(CP0_ra_in),
330
  .q(CP0_ra_out)
331
);
332
 
333
register #(2)
334
CP0_Inst
335
(
336
  .clk(clk), .reset(reset), .en(en),
337
  .d(CP0_Inst_in),
338
  .q(CP0_Inst_out)
339
);
340
 
341
register CP0_dout
342
(
343
  .clk(clk), .reset(reset), .en(en),
344
  .d(CP0_dout_in),
345
  .q(CP0_dout_out)
346
);
347
 
348
register CP0_din
349
(
350
  .clk(clk),
351
  .reset(reset),
352
  .en(en),
353
  .d(CP0_din_in),
354
  .q(CP0_din_out)
355
);
356
 
357
/* Memory referece sizes */
358
register #(2)
359
MemRefSize
360
(
361
  .clk(clk), .reset(reset), .en(en),
362
  .d(MemRefSize_in),
363
  .q(MemRefSize_out)
364
);
365
 
366
endmodule

powered by: WebSVN 2.1.0

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