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

Subversion Repositories or1200_hp

[/] [or1200_hp/] [trunk/] [rtl/] [rtl_cm3/] [verilog/] [or1200_pm.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 tobil
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  OR1200's Power Management                                   ////
4
////                                                              ////
5
////  This file is part of the OpenRISC 1200 project              ////
6
////  http://www.opencores.org/cores/or1k/                        ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  PM according to OR1K architectural specification.           ////
10
////                                                              ////
11
////  To Do:                                                      ////
12
////   - add support for dynamic clock gating                     ////
13
////                                                              ////
14
////  Author(s):                                                  ////
15
////      - Damjan Lampret, lampret@opencores.org                 ////
16
////                                                              ////
17
//////////////////////////////////////////////////////////////////////
18
////                                                              ////
19
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
20
////                                                              ////
21
//// This source file may be used and distributed without         ////
22
//// restriction provided that this copyright statement is not    ////
23
//// removed from the file and that any derivative work contains  ////
24
//// the original copyright notice and the associated disclaimer. ////
25
////                                                              ////
26
//// This source file is free software; you can redistribute it   ////
27
//// and/or modify it under the terms of the GNU Lesser General   ////
28
//// Public License as published by the Free Software Foundation; ////
29
//// either version 2.1 of the License, or (at your option) any   ////
30
//// later version.                                               ////
31
////                                                              ////
32
//// This source is distributed in the hope that it will be       ////
33
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
34
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
35
//// PURPOSE.  See the GNU Lesser General Public License for more ////
36
//// details.                                                     ////
37
////                                                              ////
38
//// You should have received a copy of the GNU Lesser General    ////
39
//// Public License along with this source; if not, download it   ////
40
//// from http://www.opencores.org/lgpl.shtml                     ////
41
////                                                              ////
42
//////////////////////////////////////////////////////////////////////
43
//
44
// CVS Revision History
45
//
46
// $Log: not supported by cvs2svn $
47
// Revision 1.8  2001/10/21 17:57:16  lampret
48
// Removed params from generic_XX.v. Added translate_off/on in sprs.v and id.v. Removed spr_addr from dc.v and ic.v. Fixed CR+LF.
49
//
50
// Revision 1.7  2001/10/14 13:12:10  lampret
51
// MP3 version.
52
//
53
// Revision 1.1.1.1  2001/10/06 10:18:35  igorm
54
// no message
55
//
56
// Revision 1.2  2001/08/09 13:39:33  lampret
57
// Major clean-up.
58
//
59
// Revision 1.1  2001/07/20 00:46:21  lampret
60
// Development version of RTL. Libraries are missing.
61
//
62
//
63
 
64
// synopsys translate_off
65
`include "timescale.v"
66
// synopsys translate_on
67
`include "or1200_defines.v"
68
 
69
module or1200_pm_cm3(
70
                clk_i_cml_1,
71
                clk_i_cml_2,
72
 
73
        // RISC Internal Interface
74
        clk, rst, pic_wakeup, spr_write, spr_addr, spr_dat_i, spr_dat_o,
75
 
76
        // Power Management Interface
77
        pm_clksd, pm_cpustall, pm_dc_gate, pm_ic_gate, pm_dmmu_gate,
78
        pm_immu_gate, pm_tt_gate, pm_cpu_gate, pm_wakeup, pm_lvolt
79
);
80
 
81
 
82
input clk_i_cml_1;
83
input clk_i_cml_2;
84
reg  pic_wakeup_cml_2;
85
reg  spr_write_cml_2;
86
reg [ 31 : 0 ] spr_addr_cml_2;
87
reg [ 31 : 0 ] spr_addr_cml_1;
88
reg [ 31 : 0 ] spr_dat_i_cml_2;
89
reg [ 31 : 0 ] spr_dat_i_cml_1;
90
reg  pm_cpustall_cml_2;
91
reg  pm_cpustall_cml_1;
92
reg  pm_cpu_gate_cml_2;
93
reg [ 3 : 0 ] sdf_cml_2;
94
reg [ 3 : 0 ] sdf_cml_1;
95
reg  dme_cml_2;
96
reg  dme_cml_1;
97
reg  sme_cml_2;
98
reg  sme_cml_1;
99
reg  dcge_cml_2;
100
reg  dcge_cml_1;
101
 
102
 
103
 
104
//
105
// RISC Internal Interface
106
//
107
input           clk;            // Clock
108
input           rst;            // Reset
109
input           pic_wakeup;     // Wakeup from the PIC
110
input           spr_write;      // SPR Read/Write
111
input   [31:0]   spr_addr;       // SPR Address
112
input   [31:0]   spr_dat_i;      // SPR Write Data
113
output  [31:0]   spr_dat_o;      // SPR Read Data
114
 
115
//
116
// Power Management Interface
117
//
118
input           pm_cpustall;    // Stall the CPU
119
output  [3:0]    pm_clksd;       // Clock Slowdown factor
120
output          pm_dc_gate;     // Gate DCache clock
121
output          pm_ic_gate;     // Gate ICache clock
122
output          pm_dmmu_gate;   // Gate DMMU clock
123
output          pm_immu_gate;   // Gate IMMU clock
124
output          pm_tt_gate;     // Gate Tick Timer clock
125
output          pm_cpu_gate;    // Gate main RISC/CPU clock
126
output          pm_wakeup;      // Activate (de-gate) all clocks
127
output          pm_lvolt;       // Lower operating voltage
128
 
129
`ifdef OR1200_PM_IMPLEMENTED
130
 
131
//
132
// Power Management Register bits
133
//
134
reg     [3:0]    sdf;    // Slow-down factor
135
reg             dme;    // Doze Mode Enable
136
reg             sme;    // Sleep Mode Enable
137
reg             dcge;   // Dynamic Clock Gating Enable
138
 
139
//
140
// Internal wires
141
//
142
wire            pmr_sel; // PMR select
143
 
144
//
145
// PMR address decoder (partial decoder)
146
//
147
`ifdef OR1200_PM_PARTIAL_DECODING
148
 
149
// SynEDA CoreMultiplier
150
// assignment(s): pmr_sel
151
// replace(s): spr_addr
152
assign pmr_sel = (spr_addr_cml_2[`OR1200_SPR_GROUP_BITS] == `OR1200_SPRGRP_PM) ? 1'b1 : 1'b0;
153
`else
154
assign pmr_sel = ((spr_addr[`OR1200_SPR_GROUP_BITS] == `OR1200_SPRGRP_PM) &&
155
                  (spr_addr[`OR1200_SPR_OFS_BITS] == `OR1200_PM_OFS_PMR)) ? 1'b1 : 1'b0;
156
`endif
157
 
158
//
159
// Write to PMR and also PMR[DME]/PMR[SME] reset when
160
// pic_wakeup is asserted
161
//
162
 
163
// SynEDA CoreMultiplier
164
// assignment(s): sdf, dme, sme, dcge
165
// replace(s): spr_write, spr_dat_i, sdf, pic_wakeup, dme, sme, dcge
166
always @(posedge clk or posedge rst)
167
        if (rst)
168
                {dcge, sme, dme, sdf} <= 7'b0;
169
        else begin  dcge <= dcge_cml_2; sme <= sme_cml_2; dme <= dme_cml_2; sdf <= sdf_cml_2; if (pmr_sel && spr_write_cml_2) begin
170
                sdf <= #1 spr_dat_i_cml_2[`OR1200_PM_PMR_SDF];
171
                dme <= #1 spr_dat_i_cml_2[`OR1200_PM_PMR_DME];
172
                sme <= #1 spr_dat_i_cml_2[`OR1200_PM_PMR_SME];
173
                dcge <= #1 spr_dat_i_cml_2[`OR1200_PM_PMR_DCGE];
174
        end
175
        else if (pic_wakeup_cml_2) begin
176
                dme <= #1 1'b0;
177
                sme <= #1 1'b0;
178
        end end
179
 
180
//
181
// Read PMR
182
//
183
`ifdef OR1200_PM_READREGS
184
assign spr_dat_o[`OR1200_PM_PMR_SDF] = sdf_cml_1;
185
assign spr_dat_o[`OR1200_PM_PMR_DME] = dme_cml_1;
186
assign spr_dat_o[`OR1200_PM_PMR_SME] = sme_cml_1;
187
assign spr_dat_o[`OR1200_PM_PMR_DCGE] = dcge_cml_1;
188
`ifdef OR1200_PM_UNUSED_ZERO
189
 
190
// SynEDA CoreMultiplier
191
// assignment(s): spr_dat_o
192
// replace(s): sdf, dme, sme, dcge
193
assign spr_dat_o[`OR1200_PM_PMR_UNUSED] = 25'b0;
194
`endif
195
`endif
196
 
197
//
198
// Generate pm_clksd
199
//
200
 
201
// SynEDA CoreMultiplier
202
// assignment(s): pm_clksd
203
// replace(s): sdf
204
assign pm_clksd = sdf_cml_2;
205
 
206
//
207
// Statically generate all clock gate outputs
208
// TODO: add dynamic clock gating feature
209
//
210
 
211
// SynEDA CoreMultiplier
212
// assignment(s): pm_cpu_gate
213
// replace(s): dme, sme
214
assign pm_cpu_gate = (dme_cml_1 | sme_cml_1) & ~pic_wakeup;
215
 
216
// SynEDA CoreMultiplier
217
// assignment(s): pm_dc_gate
218
// replace(s): pm_cpu_gate
219
assign pm_dc_gate = pm_cpu_gate_cml_2;
220
 
221
// SynEDA CoreMultiplier
222
// assignment(s): pm_ic_gate
223
// replace(s): pm_cpu_gate
224
assign pm_ic_gate = pm_cpu_gate_cml_2;
225
 
226
// SynEDA CoreMultiplier
227
// assignment(s): pm_dmmu_gate
228
// replace(s): pm_cpu_gate
229
assign pm_dmmu_gate = pm_cpu_gate_cml_2;
230
 
231
// SynEDA CoreMultiplier
232
// assignment(s): pm_immu_gate
233
// replace(s): pm_cpu_gate
234
assign pm_immu_gate = pm_cpu_gate_cml_2;
235
 
236
// SynEDA CoreMultiplier
237
// assignment(s): pm_tt_gate
238
// replace(s): pic_wakeup, sme
239
assign pm_tt_gate = sme_cml_2 & ~pic_wakeup_cml_2;
240
 
241
//
242
// Assert pm_wakeup when pic_wakeup is asserted
243
//
244
 
245
// SynEDA CoreMultiplier
246
// assignment(s): pm_wakeup
247
// replace(s): pic_wakeup
248
assign pm_wakeup = pic_wakeup_cml_2;
249
 
250
//
251
// Assert pm_lvolt when pm_cpu_gate or pm_cpustall are asserted
252
//
253
 
254
// SynEDA CoreMultiplier
255
// assignment(s): pm_lvolt
256
// replace(s): pm_cpustall, pm_cpu_gate
257
assign pm_lvolt = pm_cpu_gate_cml_2 | pm_cpustall_cml_2;
258
 
259
`else
260
 
261
//
262
// When PM is not implemented, drive all outputs as would when PM is disabled
263
//
264
assign pm_clksd = 4'b0;
265
assign pm_cpu_gate = 1'b0;
266
assign pm_dc_gate = 1'b0;
267
assign pm_ic_gate = 1'b0;
268
assign pm_dmmu_gate = 1'b0;
269
assign pm_immu_gate = 1'b0;
270
assign pm_tt_gate = 1'b0;
271
assign pm_wakeup = 1'b1;
272
assign pm_lvolt = 1'b0;
273
 
274
//
275
// Read PMR
276
//
277
`ifdef OR1200_PM_READREGS
278
assign spr_dat_o[`OR1200_PM_PMR_SDF] = 4'b0;
279
assign spr_dat_o[`OR1200_PM_PMR_DME] = 1'b0;
280
assign spr_dat_o[`OR1200_PM_PMR_SME] = 1'b0;
281
assign spr_dat_o[`OR1200_PM_PMR_DCGE] = 1'b0;
282
`ifdef OR1200_PM_UNUSED_ZERO
283
assign spr_dat_o[`OR1200_PM_PMR_UNUSED] = 25'b0;
284
`endif
285
`endif
286
 
287
`endif
288
 
289
 
290
always @ (posedge clk_i_cml_1) begin
291
spr_addr_cml_1 <= spr_addr;
292
spr_dat_i_cml_1 <= spr_dat_i;
293
pm_cpustall_cml_1 <= pm_cpustall;
294
sdf_cml_1 <= sdf;
295
dme_cml_1 <= dme;
296
sme_cml_1 <= sme;
297
dcge_cml_1 <= dcge;
298
end
299
always @ (posedge clk_i_cml_2) begin
300
pic_wakeup_cml_2 <= pic_wakeup;
301
spr_write_cml_2 <= spr_write;
302
spr_addr_cml_2 <= spr_addr_cml_1;
303
spr_dat_i_cml_2 <= spr_dat_i_cml_1;
304
pm_cpustall_cml_2 <= pm_cpustall_cml_1;
305
pm_cpu_gate_cml_2 <= pm_cpu_gate;
306
sdf_cml_2 <= sdf_cml_1;
307
dme_cml_2 <= dme_cml_1;
308
sme_cml_2 <= sme_cml_1;
309
dcge_cml_2 <= dcge_cml_1;
310
end
311
endmodule
312
 

powered by: WebSVN 2.1.0

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