OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [rtl/] [src_peripheral/] [clk_source/] [xilinx_pll/] [xilinx_pll_sim/] [plle2_base_sim.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
/*
2
 * pll.v: Simulates the pll of the xilinx 7 series. This is used by the
3
 * frontend files "plle2_base.v" and "plle2_adv.v"
4
 * author: Till Mahlburg
5
 * year: 2019-2020
6
 * organization: Universität Leipzig
7
 * license: ISC
8
 *
9
 */
10
 
11
// synthesis translate_off
12
 
13
`timescale 1 ns / 1 ps
14
 
15
/* A reference for the interface can be found in Xilinx UG953 page 503ff */
16
module plle2_base_sim #(
17
        /* not implemented */
18
        parameter BANDWIDTH                     = "OPTIMIZED",
19
 
20
        parameter CLKFBOUT_MULT_F               = 5.0,
21
        parameter CLKFBOUT_PHASE                = 0.0,
22
 
23
        /* need to be set */
24
        parameter CLKIN1_PERIOD                 = 0.0,
25
        parameter CLKIN2_PERIOD                 = 0.0,
26
 
27
        parameter CLKOUT0_DIVIDE_F              = 1.0,
28
        parameter CLKOUT1_DIVIDE                = 1,
29
        parameter CLKOUT2_DIVIDE                = 1,
30
        parameter CLKOUT3_DIVIDE                = 1,
31
        parameter CLKOUT4_DIVIDE                = 1,
32
        parameter CLKOUT5_DIVIDE                = 1,
33
        parameter CLKOUT6_DIVIDE                = 1,
34
 
35
        parameter CLKOUT0_DUTY_CYCLE    = 0.5,
36
        parameter CLKOUT1_DUTY_CYCLE    = 0.5,
37
        parameter CLKOUT2_DUTY_CYCLE    = 0.5,
38
        parameter CLKOUT3_DUTY_CYCLE    = 0.5,
39
        parameter CLKOUT4_DUTY_CYCLE    = 0.5,
40
        parameter CLKOUT5_DUTY_CYCLE    = 0.5,
41
        parameter CLKOUT6_DUTY_CYCLE    = 0.5,
42
 
43
        parameter CLKOUT0_PHASE                 = 0.0,
44
        parameter CLKOUT1_PHASE                 = 0.0,
45
        parameter CLKOUT2_PHASE                 = 0.0,
46
        parameter CLKOUT3_PHASE                 = 0.0,
47
        parameter CLKOUT4_PHASE                 = 0.0,
48
        parameter CLKOUT5_PHASE                 = 0.0,
49
        parameter CLKOUT6_PHASE                 = 0.0,
50
 
51
        parameter CLKOUT4_CASCADE               = "FALSE",
52
 
53
        parameter DIVCLK_DIVIDE                 = 1,
54
 
55
        /* not implemented */
56
        parameter REF_JITTER1                   = 0.010,
57
        parameter REF_JITTER2                   = 0.010,
58
        parameter STARTUP_WAIT                  = "FALSE",
59
        parameter COMPENSATION                  = "ZHOLD",
60
 
61
        /* this is additional, optional information for determining the
62
         * correct hardware limits. By default it uses the most restrictive
63
         * model */
64
        parameter FPGA_TYPE                             = "ARTIX",
65
        parameter SPEED_GRADE                   = "-1",
66
 
67
        /* just for internal use */
68
        parameter MODULE_TYPE                   = "PLLE2_BASE")(
69
        output CLKOUT0,
70
        output CLKOUT0B,
71
        output CLKOUT1,
72
        output CLKOUT1B,
73
        output CLKOUT2,
74
        output CLKOUT2B,
75
        output CLKOUT3,
76
        output CLKOUT3B,
77
        output CLKOUT4,
78
        output CLKOUT5,
79
        output CLKOUT6,
80
        /* PLL feedback output. */
81
        output CLKFBOUT,
82
        output CLKFBOUTB,
83
 
84
        output LOCKED,
85
 
86
        input CLKIN1,
87
        input CLKIN2,
88
        /* Select input clk. 1 for CLKIN1, 0 for CLKIN2 */
89
        input CLKINSEL,
90
        /* PLL feedback input. Is ignored in this implementation, but should be connected to CLKFBOUT for internal feedback. */
91
        input CLKFBIN,
92
 
93
        /* Used to power down instatiated but unused PLLs */
94
        input PWRDWN,
95
        input RST,
96
 
97
        /* Dynamic reconfiguration ports */
98
        /* register address to write to or read from */
99
        input [6:0] DADDR,
100
        /* reference clk */
101
        input DCLK,
102
        /* enable dynamic reconfiguration (read only) */
103
        input DEN,
104
        /* enable writing */
105
        input DWE,
106
        /* what to write */
107
        input [15:0] DI,
108
        /* read values */
109
        output [15:0] DO,
110
        /* ready flag for next operation */
111
        output DRDY);
112
 
113
        /* assign inverted outputs */
114
        assign CLKOUT0B = ~CLKOUT0;
115
        assign CLKOUT1B = ~CLKOUT1;
116
        assign CLKOUT2B = ~CLKOUT2;
117
        assign CLKOUT3B = ~CLKOUT3;
118
        assign CLKFBOUTB = ~CLKFBOUT;
119
 
120
        /* gets assigned to the chosen CLKIN */
121
        reg clkin;
122
        wire [31:0] clkin_period_length_1000;
123
 
124
        /* internal values */
125
        reg [31:0] CLKOUT_DIVIDE_INT_1000[0:6];
126
        reg [31:0] CLKOUT_DUTY_CYCLE_INT_1000[0:6];
127
        reg signed [31:0] CLKOUT_PHASE_INT_1000[0:6];
128
        reg [31:0] CLKFBOUT_MULT_F_INT_1000;
129
        reg signed [31:0] CLKFBOUT_PHASE_INT_1000;
130
        reg [31:0] DIVCLK_DIVIDE_INT;
131
        wire CLKOUT_INT[0:6];
132
 
133
        assign CLKOUT0 = CLKOUT_INT[0];
134
        assign CLKOUT1 = CLKOUT_INT[1];
135
        assign CLKOUT2 = CLKOUT_INT[2];
136
        assign CLKOUT3 = CLKOUT_INT[3];
137
        assign CLKOUT4 = CLKOUT_INT[4];
138
        assign CLKOUT5 = CLKOUT_INT[5];
139
        assign CLKOUT6 = CLKOUT_INT[6];
140
 
141
        /* Used to determine the period length of the divided CLK */
142
        period_count #(
143
                .RESOLUTION(0.01))
144
        period_count (
145
                .RST(RST),
146
                .PWRDWN(PWRDWN),
147
                .clk(clkin),
148
                .period_length_1000(clkin_period_length_1000));
149
 
150
        wire period_stable;
151
 
152
        /* Used to delay the output of the period until it's stable */
153
        period_check period_check (
154
                .RST(RST),
155
                .PWRDWN(PWRDWN),
156
                .clk(clkin),
157
                .period_length((clkin_period_length_1000 / 1000.0)),
158
                .period_stable(period_stable));
159
 
160
        wire out[0:6];
161
        wire [31:0] out_period_length_1000[0:6];
162
        wire lock[0:6];
163
 
164
        /* frequency generators */
165
        genvar i;
166
 
167
        generate
168
                for (i = 0; i <= 6; i = i + 1) begin : fg
169
                        freq_gen fg (
170
                                .M_1000(CLKFBOUT_MULT_F_INT_1000),
171
                                .D(DIVCLK_DIVIDE_INT),
172
                                .O_1000(CLKOUT_DIVIDE_INT_1000[i]),
173
                                .RST(RST),
174
                                .PWRDWN(PWRDWN),
175
                                .period_stable(period_stable),
176
                                .ref_period_1000((clkin_period_length_1000)),
177
                                .clk(clkin),
178
                                .out(out[i]),
179
                                .out_period_length_1000(out_period_length_1000[i]));
180
                end
181
        endgenerate
182
 
183
        /* phase shift */
184
        generate
185
                for (i = 0; i <= 6; i = i + 1) begin : ps
186
                        phase_shift ps (
187
                                .RST(RST),
188
                                .PWRDWN(PWRDWN),
189
                                .clk(out[i]),
190
                                .shift_1000(CLKOUT_PHASE_INT_1000[i] + CLKFBOUT_PHASE_INT_1000),
191
                                .duty_cycle(CLKOUT_DUTY_CYCLE_INT_1000[i] / 10),
192
                                .clk_period_1000(out_period_length_1000[i]),
193
                                .lock(lock[i]),
194
                                .clk_shifted(CLKOUT_INT[i]));
195
                end
196
        endgenerate
197
 
198
        wire fb_out;
199
        wire [31:0] fb_out_period_length_1000;
200
        wire fb_lock;
201
 
202
        /* CLKOUTFB */
203
        freq_gen fb_fg (
204
                .M_1000(CLKFBOUT_MULT_F_INT_1000),
205
                .D(DIVCLK_DIVIDE_INT),
206
                .O_1000(1000.0),
207
                .RST(RST),
208
                .PWRDWN(PWRDWN),
209
                .period_stable(period_stable),
210
                .ref_period_1000((clkin_period_length_1000)),
211
                .clk(clkin),
212
                .out(fb_out),
213
                .out_period_length_1000(fb_out_period_length_1000));
214
 
215
        phase_shift fb_ps (
216
                .RST(RST),
217
                .PWRDWN(PWRDWN),
218
                .clk(fb_out),
219
                .shift_1000(CLKFBOUT_PHASE_INT_1000),
220
                .clk_period_1000(fb_out_period_length_1000),
221
                .duty_cycle(50),
222
                .lock(fb_lock),
223
                .clk_shifted(CLKFBOUT));
224
 
225
        /* dynamically set values */
226
        wire [31:0] CLKOUT_DIVIDE_DYN[0:6];
227
        wire [31:0] CLKOUT_DUTY_CYCLE_DYN_1000[0:6];
228
        wire signed [31:0] CLKOUT_PHASE_DYN[0:6];
229
        wire [31:0] CLKFBOUT_MULT_F_DYN_1000;
230
        wire signed [31:0] CLKFBOUT_PHASE_DYN;
231
        wire [31:0] DIVCLK_DIVIDE_DYN;
232
 
233
        /* reconfiguration */
234
        dyn_reconf dyn_reconf (
235
                .RST(RST),
236
                .PWRDWN(PWRDWN),
237
 
238
                .vco_period_1000(fb_out_period_length_1000),
239
 
240
                .DADDR(DADDR),
241
                .DCLK(DCLK),
242
                .DEN(DEN),
243
                .DWE(DWE),
244
                .DI(DI),
245
                .DO(DO),
246
                .DRDY(DRDY),
247
 
248
                .CLKOUT0_DIVIDE(CLKOUT_DIVIDE_DYN[0]),
249
                .CLKOUT0_DUTY_CYCLE_1000(CLKOUT_DUTY_CYCLE_DYN_1000[0]),
250
                .CLKOUT0_PHASE(CLKOUT_PHASE_DYN[0]),
251
 
252
                .CLKOUT1_DIVIDE(CLKOUT_DIVIDE_DYN[1]),
253
                .CLKOUT1_DUTY_CYCLE_1000(CLKOUT_DUTY_CYCLE_DYN_1000[1]),
254
                .CLKOUT1_PHASE(CLKOUT_PHASE_DYN[1]),
255
 
256
                .CLKOUT2_DIVIDE(CLKOUT_DIVIDE_DYN[2]),
257
                .CLKOUT2_DUTY_CYCLE_1000(CLKOUT_DUTY_CYCLE_DYN_1000[2]),
258
                .CLKOUT2_PHASE(CLKOUT_PHASE_DYN[2]),
259
 
260
                .CLKOUT3_DIVIDE(CLKOUT_DIVIDE_DYN[3]),
261
                .CLKOUT3_DUTY_CYCLE_1000(CLKOUT_DUTY_CYCLE_DYN_1000[3]),
262
                .CLKOUT3_PHASE(CLKOUT_PHASE_DYN[3]),
263
 
264
                .CLKOUT4_DIVIDE(CLKOUT_DIVIDE_DYN[4]),
265
                .CLKOUT4_DUTY_CYCLE_1000(CLKOUT_DUTY_CYCLE_DYN_1000[4]),
266
                .CLKOUT4_PHASE(CLKOUT_PHASE_DYN[4]),
267
 
268
                .CLKOUT5_DIVIDE(CLKOUT_DIVIDE_DYN[5]),
269
                .CLKOUT5_DUTY_CYCLE_1000(CLKOUT_DUTY_CYCLE_DYN_1000[5]),
270
                .CLKOUT5_PHASE(CLKOUT_PHASE_DYN[5]),
271
 
272
                .CLKOUT6_DIVIDE(CLKOUT_DIVIDE_DYN[6]),
273
                .CLKOUT6_DUTY_CYCLE_1000(CLKOUT_DUTY_CYCLE_DYN_1000[6]),
274
                .CLKOUT6_PHASE(CLKOUT_PHASE_DYN[6]),
275
 
276
                .CLKFBOUT_MULT_F_1000(CLKFBOUT_MULT_F_DYN_1000),
277
                .CLKFBOUT_PHASE(CLKFBOUT_PHASE_DYN),
278
 
279
                .DIVCLK_DIVIDE(DIVCLK_DIVIDE_DYN));
280
 
281
 
282
        /* lock detection using the lock information given by the phase shift modules */
283
        assign LOCKED = lock[0] & lock[1] & lock[2] & lock[3] & lock[4] & lock[5] & lock[6] & fb_lock;
284
 
285
        /* set clkin to the correct CLKIN */
286
        always @* begin
287
                if (CLKINSEL === 1'b1) begin
288
                        clkin = CLKIN1;
289
                end else if (CLKINSEL === 1'b0) begin
290
                        clkin = CLKIN2;
291
                end
292
        end
293
 
294
        integer k;
295
        /* set the internal values to the dynamically set */
296
        always @* begin
297
                for (k = 0; k <= 6; k = k + 1) begin
298
                        if (CLKOUT_DIVIDE_DYN[k] != 0)
299
                                CLKOUT_DIVIDE_INT_1000[k] = CLKOUT_DIVIDE_DYN[k] * 1000;
300
                        if (CLKOUT_DUTY_CYCLE_DYN_1000[k] != 0)
301
                                CLKOUT_DUTY_CYCLE_INT_1000[k] = CLKOUT_DUTY_CYCLE_DYN_1000[k];
302
                        if (CLKOUT_PHASE_DYN[k] != 0)
303
                                CLKOUT_PHASE_INT_1000[k] = CLKOUT_PHASE_DYN[k] * 1000;
304
                end
305
                if (CLKFBOUT_MULT_F_DYN_1000 != 0)
306
                        CLKFBOUT_MULT_F_INT_1000 = CLKFBOUT_MULT_F_DYN_1000;
307
                if (CLKFBOUT_PHASE_DYN != 0)
308
                        CLKFBOUT_PHASE_INT_1000 = CLKFBOUT_PHASE_DYN * 1000;
309
                if (DIVCLK_DIVIDE_DYN != 0)
310
                        DIVCLK_DIVIDE_INT = DIVCLK_DIVIDE_DYN;
311
        end
312
 
313
        /* assign initial values */
314
        integer vco_min;
315
        integer vco_max;
316
        initial begin
317
                CLKOUT_DIVIDE_INT_1000[0] = CLKOUT0_DIVIDE_F * 1000;
318
                CLKOUT_DIVIDE_INT_1000[1] = CLKOUT1_DIVIDE * 1000;
319
                CLKOUT_DIVIDE_INT_1000[2] = CLKOUT2_DIVIDE * 1000;
320
                CLKOUT_DIVIDE_INT_1000[3] = CLKOUT3_DIVIDE * 1000;
321
                if (CLKOUT4_CASCADE == "FALSE") begin
322
                        CLKOUT_DIVIDE_INT_1000[4] = CLKOUT4_DIVIDE * 1000;
323
                        CLKOUT_DIVIDE_INT_1000[6] = CLKOUT6_DIVIDE * 1000;
324
                end else if (CLKOUT4_CASCADE == "TRUE") begin
325
                        CLKOUT_DIVIDE_INT_1000[4] = CLKOUT4_DIVIDE * CLKOUT6_DIVIDE * 1000;
326
                        CLKOUT_DIVIDE_INT_1000[6] = 1000;
327
                end
328
                CLKOUT_DIVIDE_INT_1000[5] = CLKOUT5_DIVIDE * 1000;
329
 
330
                CLKOUT_DUTY_CYCLE_INT_1000[0] = CLKOUT0_DUTY_CYCLE * 1000;
331
                CLKOUT_DUTY_CYCLE_INT_1000[1] = CLKOUT1_DUTY_CYCLE * 1000;
332
                CLKOUT_DUTY_CYCLE_INT_1000[2] = CLKOUT2_DUTY_CYCLE * 1000;
333
                CLKOUT_DUTY_CYCLE_INT_1000[3] = CLKOUT3_DUTY_CYCLE * 1000;
334
                CLKOUT_DUTY_CYCLE_INT_1000[4] = CLKOUT4_DUTY_CYCLE * 1000;
335
                CLKOUT_DUTY_CYCLE_INT_1000[5] = CLKOUT5_DUTY_CYCLE * 1000;
336
                CLKOUT_DUTY_CYCLE_INT_1000[6] = CLKOUT6_DUTY_CYCLE * 1000;
337
 
338
                CLKOUT_PHASE_INT_1000[0] = CLKOUT0_PHASE * 1000;
339
                CLKOUT_PHASE_INT_1000[1] = CLKOUT1_PHASE * 1000;
340
                CLKOUT_PHASE_INT_1000[2] = CLKOUT2_PHASE * 1000;
341
                CLKOUT_PHASE_INT_1000[3] = CLKOUT3_PHASE * 1000;
342
                CLKOUT_PHASE_INT_1000[4] = CLKOUT4_PHASE * 1000;
343
                CLKOUT_PHASE_INT_1000[5] = CLKOUT5_PHASE * 1000;
344
                CLKOUT_PHASE_INT_1000[6] = CLKOUT6_PHASE * 1000;
345
 
346
                CLKFBOUT_MULT_F_INT_1000 = CLKFBOUT_MULT_F * 1000;
347
                CLKFBOUT_PHASE_INT_1000 = CLKFBOUT_PHASE * 1000;
348
                DIVCLK_DIVIDE_INT = DIVCLK_DIVIDE;
349
 
350
                /* set up limits correctly */
351
                case (FPGA_TYPE)
352
                        "ARTIX":
353
                                case (SPEED_GRADE)
354
                                        "-3": if (MODULE_TYPE == "PLLE2_ADV" || MODULE_TYPE == "PLLE2_BASE") begin
355
                                                        vco_min = 800;
356
                                                        vco_max = 2133;
357
                                                end else if (MODULE_TYPE == "MMCME2_BASE") begin
358
                                                        vco_min = 600;
359
                                                        vco_max = 1600;
360
                                                end
361
                                        "-2": if (MODULE_TYPE == "PLLE2_ADV" || MODULE_TYPE == "PLLE2_BASE") begin
362
                                                        vco_min = 800;
363
                                                        vco_max = 1866;
364
                                                end else if (MODULE_TYPE == "MMCME2_BASE") begin
365
                                                        vco_min = 600;
366
                                                        vco_max = 1440;
367
                                                end
368
                                        "-1", "-1LI", "-2LE": if (MODULE_TYPE == "PLLE2_ADV" || MODULE_TYPE == "PLLE2_BASE") begin
369
                                                        vco_min = 800;
370
                                                        vco_max = 1600;
371
                                                end else if (MODULE_TYPE == "MMCME2_BASE") begin
372
                                                        vco_min = 600;
373
                                                        vco_max = 1200;
374
                                                end
375
                                        default: begin
376
                                                        $display("The speed grade given is not valid. Please choose one of the following: -3, -2, -2LE, -1, -1LI");
377
                                                        $display("Exiting simulation...");
378
                                                        $finish;
379
                                                end
380
                                endcase
381
                        "KINTEX":
382
                                case (SPEED_GRADE)
383
                                        "-3": if (MODULE_TYPE == "PLLE2_ADV" || MODULE_TYPE == "PLLE2_BASE") begin
384
                                                        vco_min = 800;
385
                                                        vco_max = 2133;
386
                                                end else if (MODULE_TYPE == "MMCME2_BASE") begin
387
                                                        vco_min = 600;
388
                                                        vco_max = 1600;
389
                                                end
390
                                        "-2", "-2LI": if (MODULE_TYPE == "PLLE2_ADV" || MODULE_TYPE == "PLLE2_BASE") begin
391
                                                        vco_min = 800;
392
                                                        vco_max = 1866;
393
                                                end else if (MODULE_TYPE == "MMCME2_BASE") begin
394
                                                        vco_min = 600;
395
                                                        vco_max = 1440;
396
                                                end
397
                                        "-1", "-1M", "-1LM", "-1Q", "-2LE": if (MODULE_TYPE == "PLLE2_ADV" || MODULE_TYPE == "PLLE2_BASE") begin
398
                                                        vco_min = 800;
399
                                                        vco_max = 1600;
400
                                                end else if (MODULE_TYPE == "MMCME2_BASE") begin
401
                                                        vco_min = 600;
402
                                                        vco_max = 1200;
403
                                                end
404
                                        default: begin
405
                                                        $display("The speed grade given is not valid. Please choose one of the following: -3, -2, -2LI, -2LE, -1, -1M, -1LM, -1Q");
406
                                                        $display("Exiting simulation...");
407
                                                        $finish;
408
                                                end
409
                                endcase
410
                        "VIRTEX":
411
                                case (SPEED_GRADE)
412
                                        "-3": if (MODULE_TYPE == "PLLE2_ADV" || MODULE_TYPE == "PLLE2_BASE") begin
413
                                                        vco_min = 800;
414
                                                        vco_max = 2133;
415
                                                end else if (MODULE_TYPE == "MMCME2_BASE") begin
416
                                                        vco_min = 600;
417
                                                        vco_max = 1600;
418
                                                end
419
                                        "-2", "-2L", "-2LG": if (MODULE_TYPE == "PLLE2_ADV" || MODULE_TYPE == "PLLE2_BASE") begin
420
                                                        vco_min = 800;
421
                                                        vco_max = 1833;
422
                                                end else if (MODULE_TYPE == "MMCME2_BASE") begin
423
                                                        vco_min = 600;
424
                                                        vco_max = 1440;
425
                                                end
426
                                        "-1", "-1M": if (MODULE_TYPE == "PLLE2_ADV" || MODULE_TYPE == "PLLE2_BASE") begin
427
                                                        vco_min = 800;
428
                                                        vco_max = 1600;
429
                                                end else if (MODULE_TYPE == "MMCME2_BASE") begin
430
                                                        vco_min = 600;
431
                                                        vco_max = 1200;
432
                                                end
433
                                        default: begin
434
                                                        $display("The speed grade given is not valid. Please choose one of the following: -3, -2, -2L, -2LG, -1, -1M");
435
                                                        $display("Exiting simulation...");
436
                                                        $finish;
437
                                                end
438
                                endcase
439
                        default: begin
440
                                        $display("The FPGA type given is not recognized. Please choose one of the following: ARTIX, VIRTEX, KINTEX");
441
                                        $display("Exiting simulation...");
442
                                        $finish;
443
                                end
444
                endcase
445
        end
446
 
447
        integer l;
448
        reg invalid = 1'b0;
449
        /* check values for validity */
450
        always @(*) begin
451
                /* the same for each version of the pll/mmcm */
452
                if (!(BANDWIDTH == "OPTIMIZED" || BANDWIDTH == "HIGH" || BANDWIDTH == "LOW")) begin
453
                        $display("BANDWIDTH doesn't match any of its allowed inputs.");
454
                        invalid = 1'b1;
455
                end else if (CLKIN1_PERIOD < 0.000 || CLKIN1_PERIOD > 52.631) begin
456
                        $display("CLKIN1_PERIOD is not in the allowed range (0 - 52.631).");
457
                        invalid = 1'b1;
458
                end else if (CLKIN2_PERIOD < 0.000 || CLKIN2_PERIOD > 52.631) begin
459
                        $display("CLKIN2_PERIOD is not in the allowed range (0 - 52.631).");
460
                        invalid = 1'b1;
461
                end else if (CLKFBOUT_PHASE_INT_1000 < -360000 || CLKFBOUT_PHASE_INT_1000 > 360000) begin
462
                        $display("CLKFBOUT_PHASE is not in the allowed range (-360-360).");
463
                        invalid = 1'b1;
464
                end else if (DIVCLK_DIVIDE_INT < 1 || DIVCLK_DIVIDE_INT > 56) begin
465
                        $display("DIVCLK_DIVIDE is not in the allowed range (1-56).");
466
                        invalid = 1'b1;
467
                end else if (REF_JITTER1 < 0.000 || REF_JITTER1 > 0.999) begin
468
                        $display("REF_JITTER1 is not in the allowed range (0.000 - 0.999).");
469
                        invalid = 1'b1;
470
                end else if (REF_JITTER2 < 0.000 || REF_JITTER2 > 0.999) begin
471
                        $display("REF_JITTER2 is not in the allowed range (0.000 - 0.999).");
472
                        invalid = 1'b1;
473
                end else if (!(STARTUP_WAIT == "FALSE" || STARTUP_WAIT == "TRUE")) begin
474
                        $display("STARTUP_WAIT doesn't match any of its allowed inputs");
475
                        invalid = 1'b1;
476
                end else if (!(COMPENSATION == "ZHOLD" || COMPENSATION == "BUF_IN" || COMPENSATION == "EXTERNAL" || COMPENSATION == "INTERNAL")) begin
477
                        $display("COMPENSATION doesn't match any of its allowed inputs");
478
                        invalid = 1'b1;
479
                end else if (!(CLKOUT4_CASCADE == "TRUE" || CLKOUT4_CASCADE == "FALSE")) begin
480
                        $display("CLKOUT4_CASCADE doesn't match any of its allowed inputs");
481
                        invalid = 1'b1;
482
                end
483
 
484
                for (l = 0; l <= 6; l = l + 1) begin
485
                        if (l != 0) begin
486
                                if ((CLKOUT_DIVIDE_INT_1000[l] / 1000.0) < 1 || (CLKOUT_DIVIDE_INT_1000[l] / 1000.0) > 128 || ((((CLKOUT_DIVIDE_INT_1000[l] / 1000.0) - $floor((CLKOUT_DIVIDE_INT_1000[l] / 1000.0)) > 0.001)))) begin
487
                                        $display("CLKOUT%0d_DIVIDE is not in the allowed range (1-128) or it is a floating point number", l);
488
                                        invalid = 1'b1;
489
                                end
490
                        end
491
                        if (CLKOUT_DUTY_CYCLE_INT_1000[l] < 1 || CLKOUT_DUTY_CYCLE_INT_1000[l] > 999) begin
492
                                $display("CLKOUT%0d_DUTY_CYCLE is not in the allowed range(0.001-0.999)", l);
493
                                invalid = 1'b1;
494
                        end else if (CLKOUT_PHASE_INT_1000[l] < -360000 || CLKOUT_PHASE_INT_1000[l] > 360000) begin
495
                                $display("CLKOUT%0d_PHASE is not in the allowed range(-360.000-360.000)", l);
496
                                invalid = 1'b1;
497
                        end
498
                end
499
 
500
                /* different on pll and mmcm */
501
                if (MODULE_TYPE == "PLLE2_BASE" || MODULE_TYPE == "PLLE2_ADV") begin
502
                        if (CLKFBOUT_MULT_F_INT_1000 < 2000 || CLKFBOUT_MULT_F_INT_1000 > 64000 || ((CLKFBOUT_MULT_F_INT_1000 / 1000.0) - $floor((CLKFBOUT_MULT_F_INT_1000 / 1000.0)) > 0.001)) begin
503
                                $display("CLKFBOUT_MULT is not in the allowed range (2-64) or a floating point number.");
504
                                invalid = 1'b1;
505
                        end else if ((CLKOUT_DIVIDE_INT_1000[0] / 1000.0) < 1 || (CLKOUT_DIVIDE_INT_1000[0] / 1000.0) > 128 || (((CLKOUT_DIVIDE_INT_1000[0] / 1000.0) - $floor((CLKOUT_DIVIDE_INT_1000[0] / 1000.0)) > 0.001))) begin
506
                                $display("CLKOUT0_DIVIDE is not in the allowed range (1-128) or it is a floating point number");
507
                                invalid = 1'b1;
508
                        end
509
                end else if (MODULE_TYPE == "MMCME2_BASE") begin
510
                        if (CLKFBOUT_MULT_F_INT_1000 < 2000 || CLKFBOUT_MULT_F_INT_1000 > 64000) begin
511
                                $display("CLKFBOUT_MULT_F is not in the allowed range (2.000-64.000)");
512
                                invalid = 1'b1;
513
                        end else if (CLKOUT_DIVIDE_INT_1000[0] < 1000 || CLKOUT_DIVIDE_INT_1000[0] > 128000) begin
514
                                $display("CLKOUT0_DIVIDE_F is not in the allowed range(2.000-64.000)");
515
                                invalid = 1'b1;
516
                        end
517
                end
518
 
519
                if (CLKINSEL == 1 && ((CLKFBOUT_MULT_F_INT_1000 / (CLKIN1_PERIOD * 1.0 * DIVCLK_DIVIDE)) < vco_min || (CLKFBOUT_MULT_F_INT_1000 / (CLKIN1_PERIOD * 1.0 * DIVCLK_DIVIDE_INT)) > vco_max)) begin
520
                        $display("The calculated VCO frequency is not in the allowed range (%0d-%0d). Change either CLKFBOUT_MULT_F, CLKIN1_PERIOD or DIVCLK_DIVIDE to an appropiate value.", vco_min, vco_max);
521
                        $display("To calculate the VCO frequency use this formula: (CLKFBOUT_MULT_F * 1000) / (CLKIN1_PERIOD * DIVCLK_DIVIDE).");
522
                        $display("Currently the value is %0f.", (CLKFBOUT_MULT_F_INT_1000 / (CLKIN1_PERIOD * 1.0 * DIVCLK_DIVIDE_INT)));
523
                        invalid = 1'b1;
524
                end else if (CLKINSEL == 0 && ((CLKFBOUT_MULT_F_INT_1000 / (CLKIN2_PERIOD * 1.0 * DIVCLK_DIVIDE)) < vco_min || (CLKFBOUT_MULT_F_INT_1000 / (CLKIN2_PERIOD * 1.0 * DIVCLK_DIVIDE_INT)) > vco_max)) begin
525
                        $display("The calculated VCO frequency is not in the allowed range (%0d-%0d). Change either CLKFBOUT_MULT_F, CLKIN2_PERIOD or DIVCLK_DIVIDE to an appropiate value.", vco_min, vco_max);
526
                        $display("To calculate the VCO frequency use this formula: (CLKFBOUT_MULT_F * 1000) / (CLKIN2_PERIOD * DIVCLK_DIVIDE).");
527
                        $display("Currently the value is %0f.", (CLKFBOUT_MULT_F_INT_1000 / (CLKIN2_PERIOD * 1.0 * DIVCLK_DIVIDE_INT)));
528
                        invalid = 1'b1;
529
                end
530
 
531
 
532
                /* NOTE: delete this to simulate even if there are invalid values */
533
                if (invalid) begin
534
                        $display("Exiting simulation...");
535
                        $finish;
536
                end
537
        end
538
endmodule
539
 
540
// synthesis translate_on

powered by: WebSVN 2.1.0

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