add DDR2 controller, generated via MIG
[fleet.git] / src / edu / berkeley / fleet / fpga / ddr2 / ddr2_sdram.v
1 //*****************************************************************************
2 // DISCLAIMER OF LIABILITY
3 //
4 // This text/file contains proprietary, confidential
5 // information of Xilinx, Inc., is distributed under license
6 // from Xilinx, Inc., and may be used, copied and/or
7 // disclosed only pursuant to the terms of a valid license
8 // agreement with Xilinx, Inc. Xilinx hereby grants you a
9 // license to use this text/file solely for design, simulation,
10 // implementation and creation of design files limited
11 // to Xilinx devices or technologies. Use with non-Xilinx
12 // devices or technologies is expressly prohibited and
13 // immediately terminates your license unless covered by
14 // a separate agreement.
15 //
16 // Xilinx is providing this design, code, or information
17 // "as-is" solely for use in developing programs and
18 // solutions for Xilinx devices, with no obligation on the
19 // part of Xilinx to provide support. By providing this design,
20 // code, or information as one possible implementation of
21 // this feature, application or standard, Xilinx is making no
22 // representation that this implementation is free from any
23 // claims of infringement. You are responsible for
24 // obtaining any rights you may require for your implementation.
25 // Xilinx expressly disclaims any warranty whatsoever with
26 // respect to the adequacy of the implementation, including
27 // but not limited to any warranties or representations that this
28 // implementation is free from claims of infringement, implied
29 // warranties of merchantability or fitness for a particular
30 // purpose.
31 //
32 // Xilinx products are not intended for use in life support
33 // appliances, devices, or systems. Use in such applications is
34 // expressly prohibited.
35 //
36 // Any modifications that are made to the Source Code are
37 // done at the users sole risk and will be unsupported.
38 //
39 // Copyright (c) 2006-2007 Xilinx, Inc. All rights reserved.
40 //
41 // This copyright and support notice must be retained as part
42 // of this text at all times.
43 //*****************************************************************************
44 //   ____  ____
45 //  /   /\/   /
46 // /___/  \  /    Vendor: Xilinx
47 // \   \   \/     Version: 2.3
48 //  \   \         Application: MIG
49 //  /   /         Filename: ddr2_sdram.v
50 // /___/   /\     Date Last Modified: $Date: 2008/07/09 12:33:12 $
51 // \   \  /  \    Date Created: Wed Aug 16 2006
52 //  \___\/\___\
53 //
54 //Device: Virtex-5
55 //Design Name: DDR2
56 //Purpose:
57 //   Top-level  module. Simple model for what the user might use
58 //   Typically, the user will only instantiate MEM_INTERFACE_TOP in their
59 //   code, and generate all backend logic (test bench) separately. 
60 //   In addition to the memory controller, the module instantiates:
61 //     1. Clock generation/distribution, reset logic
62 //     2. IDELAY control block
63 //Reference:
64 //Revision History:
65 //*****************************************************************************
66
67 `timescale 1ns/1ps
68
69 (* X_CORE_INFO = "mig_v2_3_ddr2_sdram_v5, Coregen 10.1.02" , CORE_GENERATION_INFO = "ddr2_sdram_v5,mig_v2_3,{component_name=ddr2_sdram, BANK_WIDTH=2, CKE_WIDTH=1, CLK_WIDTH=2, COL_WIDTH=10, CS_NUM=1, CS_WIDTH=1, DM_WIDTH=8, DQ_WIDTH=64, DQ_PER_DQS=8, DQS_WIDTH=8, ODT_WIDTH=1, ROW_WIDTH=13, ADDITIVE_LAT=0, BURST_LEN=4, BURST_TYPE=0, CAS_LAT=4, ECC_ENABLE=0, MULTI_BANK_EN=1, TWO_T_TIME_EN=1, ODT_TYPE=1, REDUCE_DRV=0, REG_ENABLE=0, TREFI_NS=7800, TRAS=40000, TRCD=15000, TRFC=127500, TRP=15000, TRTP=7500, TWR=15000, TWTR=7500, DDR2_CLK_PERIOD=5000, RST_ACT_LOW=1}" *)
70 module ddr2_sdram #
71   (
72    parameter BANK_WIDTH              = 2,       
73                                        // # of memory bank addr bits.
74    parameter CKE_WIDTH               = 1,       
75                                        // # of memory clock enable outputs.
76    parameter CLK_WIDTH               = 2,       
77                                        // # of clock outputs.
78    parameter COL_WIDTH               = 10,       
79                                        // # of memory column bits.
80    parameter CS_NUM                  = 1,       
81                                        // # of separate memory chip selects.
82    parameter CS_WIDTH                = 1,       
83                                        // # of total memory chip selects.
84    parameter CS_BITS                 = 0,       
85                                        // set to log2(CS_NUM) (rounded up).
86    parameter DM_WIDTH                = 8,       
87                                        // # of data mask bits.
88    parameter DQ_WIDTH                = 64,       
89                                        // # of data width.
90    parameter DQ_PER_DQS              = 8,       
91                                        // # of DQ data bits per strobe.
92    parameter DQS_WIDTH               = 8,       
93                                        // # of DQS strobes.
94    parameter DQ_BITS                 = 6,       
95                                        // set to log2(DQS_WIDTH*DQ_PER_DQS).
96    parameter DQS_BITS                = 3,       
97                                        // set to log2(DQS_WIDTH).
98    parameter ODT_WIDTH               = 1,       
99                                        // # of memory on-die term enables.
100    parameter ROW_WIDTH               = 13,       
101                                        // # of memory row and # of addr bits.
102    parameter ADDITIVE_LAT            = 0,       
103                                        // additive write latency.
104    parameter BURST_LEN               = 4,       
105                                        // burst length (in double words).
106    parameter BURST_TYPE              = 0,       
107                                        // burst type (=0 seq; =1 interleaved).
108    parameter CAS_LAT                 = 4,       
109                                        // CAS latency.
110    parameter ECC_ENABLE              = 0,       
111                                        // enable ECC (=1 enable).
112    parameter APPDATA_WIDTH           = 128,       
113                                        // # of usr read/write data bus bits.
114    parameter MULTI_BANK_EN           = 1,       
115                                        // Keeps multiple banks open. (= 1 enable).
116    parameter TWO_T_TIME_EN           = 1,       
117                                        // 2t timing for unbuffered dimms.
118    parameter ODT_TYPE                = 1,       
119                                        // ODT (=0(none),=1(75),=2(150),=3(50)).
120    parameter REDUCE_DRV              = 0,       
121                                        // reduced strength mem I/O (=1 yes).
122    parameter REG_ENABLE              = 0,       
123                                        // registered addr/ctrl (=1 yes).
124    parameter TREFI_NS                = 7800,       
125                                        // auto refresh interval (ns).
126    parameter TRAS                    = 40000,       
127                                        // active->precharge delay.
128    parameter TRCD                    = 15000,       
129                                        // active->read/write delay.
130    parameter TRFC                    = 127500,       
131                                        // refresh->refresh, refresh->active delay.
132    parameter TRP                     = 15000,       
133                                        // precharge->command delay.
134    parameter TRTP                    = 7500,       
135                                        // read->precharge delay.
136    parameter TWR                     = 15000,       
137                                        // used to determine write->precharge.
138    parameter TWTR                    = 7500,       
139                                        // write->read delay.
140    parameter HIGH_PERFORMANCE_MODE   = "TRUE",       
141                               // # = TRUE, the IODELAY performance mode is set
142                               // to high.
143                               // # = FALSE, the IODELAY performance mode is set
144                               // to low.
145    parameter SIM_ONLY                = 0,       
146                                        // = 1 to skip SDRAM power up delay.
147    parameter DEBUG_EN                = 0,       
148                                        // Enable debug signals/controls.
149                                        // When this parameter is changed from 0 to 1,
150                                        // make sure to uncomment the coregen commands
151                                        // in ise_flow.bat or create_ise.bat files in
152                                        // par folder.
153    parameter CLK_PERIOD              = 5000,       
154                                        // Core/Memory clock period (in ps).
155    parameter DQS_IO_COL              = 16'b0000000000000000,       
156                                        // I/O column location of DQS groups
157                                        // (=0, left; =1 center, =2 right).
158
159    //parameter DQ_IO_MS                = 64'b10100101_10100101_10100101_10100101_10100101_10100101_10100101_10100101,       
160    parameter DQ_IO_MS                = 64'b01110101_00111101_00001111_00011110_00101110_11000011_11000001_10111100,
161                                        // Master/Slave location of DQ I/O (=0 slave).
162    parameter CLK_TYPE                = "SINGLE_ENDED",       
163                                        // # = "DIFFERENTIAL " ->; Differential input clocks ,
164                                        // # = "SINGLE_ENDED" -> Single ended input clocks.
165    parameter DLL_FREQ_MODE           = "HIGH",       
166                                        // DCM Frequency range.
167    parameter RST_ACT_LOW             = 1        
168                                        // =1 for active low reset, =0 for active high.
169    )
170   (
171    inout  [DQ_WIDTH-1:0]              ddr2_dq,
172    output [ROW_WIDTH-1:0]             ddr2_a,
173    output [BANK_WIDTH-1:0]            ddr2_ba,
174    output                             ddr2_ras_n,
175    output                             ddr2_cas_n,
176    output                             ddr2_we_n,
177    output [CS_WIDTH-1:0]              ddr2_cs_n,
178    output [ODT_WIDTH-1:0]             ddr2_odt,
179    output [CKE_WIDTH-1:0]             ddr2_cke,
180    output [DM_WIDTH-1:0]              ddr2_dm,
181    input                              sys_clk,
182    input                              idly_clk_200,
183    input                              sys_rst_n,
184    output                             phy_init_done,
185    output                             rst0_tb,
186    output                             clk0_tb,
187    output                             app_wdf_afull,
188    output                             app_af_afull,
189    output                             rd_data_valid,
190    input                              app_wdf_wren,
191    input                              app_af_wren,
192    input  [30:0]                      app_af_addr,
193    input  [2:0]                       app_af_cmd,
194    output [(APPDATA_WIDTH)-1:0]                rd_data_fifo_out,
195    input  [(APPDATA_WIDTH)-1:0]                app_wdf_data,
196    input  [(APPDATA_WIDTH/8)-1:0]              app_wdf_mask_data,
197    inout  [DQS_WIDTH-1:0]             ddr2_dqs,
198    inout  [DQS_WIDTH-1:0]             ddr2_dqs_n,
199    output [CLK_WIDTH-1:0]             ddr2_ck,
200    output [CLK_WIDTH-1:0]             ddr2_ck_n
201    );
202
203   /////////////////////////////////////////////////////////////////////////////
204   // The following parameter "IDELAYCTRL_NUM" indicates the number of
205   // IDELAYCTRLs that are LOCed for the design. The IDELAYCTRL LOCs are
206   // provided in the UCF file of par folder. MIG provides the parameter value
207   // and the LOCs in the UCF file based on the selected Data Read banks for
208   // the design. You must not alter this value unless it is needed. If you
209   // modify this value, you should make sure that the value of "IDELAYCTRL_NUM"
210   // and IDELAYCTRL LOCs in UCF file are same and are relavent to the Data Read
211   // banks used.
212   /////////////////////////////////////////////////////////////////////////////
213
214   localparam IDELAYCTRL_NUM = 3;
215
216
217
218
219
220   wire                              sys_clk_p;
221   wire                              sys_clk_n;
222   wire                              clk200_p;
223   wire                              clk200_n;
224   wire                              rst0;
225   wire                              rst90;
226   wire                              rstdiv0;
227   wire                              rst200;
228   wire                              clk0;
229   wire                              clk90;
230   wire                              clkdiv0;
231   wire                              clk200;
232   wire                              idelay_ctrl_rdy;
233
234
235   //Debug signals
236
237
238   wire [3:0]                        dbg_calib_done;
239   wire [3:0]                        dbg_calib_err;
240   wire [(6*DQ_WIDTH)-1:0]           dbg_calib_dq_tap_cnt;
241   wire [(6*DQS_WIDTH)-1:0]          dbg_calib_dqs_tap_cnt;
242   wire [(6*DQS_WIDTH)-1:0]          dbg_calib_gate_tap_cnt;
243   wire [DQS_WIDTH-1:0]              dbg_calib_rd_data_sel;
244   wire [(5*DQS_WIDTH)-1:0]          dbg_calib_rden_dly;
245   wire [(5*DQS_WIDTH)-1:0]          dbg_calib_gate_dly;
246   wire                              dbg_idel_up_all;
247   wire                              dbg_idel_down_all;
248   wire                              dbg_idel_up_dq;
249   wire                              dbg_idel_down_dq;
250   wire                              dbg_idel_up_dqs;
251   wire                              dbg_idel_down_dqs;
252   wire                              dbg_idel_up_gate;
253   wire                              dbg_idel_down_gate;
254   wire [DQ_BITS-1:0]                dbg_sel_idel_dq;
255   wire                              dbg_sel_all_idel_dq;
256   wire [DQS_BITS:0]                 dbg_sel_idel_dqs;
257   wire                              dbg_sel_all_idel_dqs;
258   wire [DQS_BITS:0]                 dbg_sel_idel_gate;
259   wire                              dbg_sel_all_idel_gate;
260
261
262     // Debug signals (optional use)
263
264   //***********************************
265   // PHY Debug Port demo
266   //***********************************
267   wire [35:0]                        cs_control0;
268   wire [35:0]                        cs_control1;
269   wire [35:0]                        cs_control2;
270   wire [35:0]                        cs_control3;
271   wire [191:0]                       vio0_in;
272   wire [95:0]                        vio1_in;
273   wire [99:0]                        vio2_in;
274   wire [31:0]                        vio3_out;
275
276
277
278   //***************************************************************************
279
280   assign  rst0_tb = rst0;
281   assign  clk0_tb = clk0;
282   assign sys_clk_p = 1'b1;
283   assign sys_clk_n = 1'b0;
284   assign clk200_p = 1'b1;
285   assign clk200_n = 1'b0;
286
287    ddr2_idelay_ctrl #
288    (
289     .IDELAYCTRL_NUM         (IDELAYCTRL_NUM)
290    )
291    u_ddr2_idelay_ctrl
292    (
293    .rst200                 (rst200),
294    .clk200                 (clk200),
295    .idelay_ctrl_rdy        (idelay_ctrl_rdy)
296    );
297
298  ddr2_infrastructure #
299  (
300    .CLK_PERIOD             (CLK_PERIOD),
301    .CLK_TYPE               (CLK_TYPE),
302    .DLL_FREQ_MODE          (DLL_FREQ_MODE),
303    .RST_ACT_LOW            (RST_ACT_LOW)
304    )
305 u_ddr2_infrastructure
306  (
307    .sys_clk_p              (sys_clk_p),
308    .sys_clk_n              (sys_clk_n),
309    .sys_clk                (sys_clk),
310    .clk200_p               (clk200_p),
311    .clk200_n               (clk200_n),
312    .idly_clk_200           (idly_clk_200),
313    .sys_rst_n              (sys_rst_n),
314    .rst0                   (rst0),
315    .rst90                  (rst90),
316    .rstdiv0                (rstdiv0),
317    .rst200                 (rst200),
318    .clk0                   (clk0),
319    .clk90                  (clk90),
320    .clkdiv0                (clkdiv0),
321    .clk200                 (clk200),
322    .idelay_ctrl_rdy        (idelay_ctrl_rdy)
323    );
324
325  ddr2_top #
326  (
327    .BANK_WIDTH             (BANK_WIDTH),
328    .CKE_WIDTH              (CKE_WIDTH),
329    .CLK_WIDTH              (CLK_WIDTH),
330    .COL_WIDTH              (COL_WIDTH),
331    .CS_NUM                 (CS_NUM),
332    .CS_WIDTH               (CS_WIDTH),
333    .CS_BITS                (CS_BITS),
334    .DM_WIDTH               (DM_WIDTH),
335    .DQ_WIDTH               (DQ_WIDTH),
336    .DQ_PER_DQS             (DQ_PER_DQS),
337    .DQS_WIDTH              (DQS_WIDTH),
338    .DQ_BITS                (DQ_BITS),
339    .DQS_BITS               (DQS_BITS),
340    .ODT_WIDTH              (ODT_WIDTH),
341    .ROW_WIDTH              (ROW_WIDTH),
342    .ADDITIVE_LAT           (ADDITIVE_LAT),
343    .BURST_LEN              (BURST_LEN),
344    .BURST_TYPE             (BURST_TYPE),
345    .CAS_LAT                (CAS_LAT),
346    .ECC_ENABLE             (ECC_ENABLE),
347    .APPDATA_WIDTH          (APPDATA_WIDTH),
348    .MULTI_BANK_EN          (MULTI_BANK_EN),
349    .TWO_T_TIME_EN          (TWO_T_TIME_EN),
350    .ODT_TYPE               (ODT_TYPE),
351    .REDUCE_DRV             (REDUCE_DRV),
352    .REG_ENABLE             (REG_ENABLE),
353    .TREFI_NS               (TREFI_NS),
354    .TRAS                   (TRAS),
355    .TRCD                   (TRCD),
356    .TRFC                   (TRFC),
357    .TRP                    (TRP),
358    .TRTP                   (TRTP),
359    .TWR                    (TWR),
360    .TWTR                   (TWTR),
361    .HIGH_PERFORMANCE_MODE  (HIGH_PERFORMANCE_MODE),
362    .SIM_ONLY               (SIM_ONLY),
363    .DEBUG_EN               (DEBUG_EN),
364    .CLK_PERIOD             (CLK_PERIOD),
365    .DQS_IO_COL             (DQS_IO_COL),
366    .DQ_IO_MS               (DQ_IO_MS),
367    .USE_DM_PORT            (1)
368    )
369 u_ddr2_top_0
370 (
371    .ddr2_dq                (ddr2_dq),
372    .ddr2_a                 (ddr2_a),
373    .ddr2_ba                (ddr2_ba),
374    .ddr2_ras_n             (ddr2_ras_n),
375    .ddr2_cas_n             (ddr2_cas_n),
376    .ddr2_we_n              (ddr2_we_n),
377    .ddr2_cs_n              (ddr2_cs_n),
378    .ddr2_odt               (ddr2_odt),
379    .ddr2_cke               (ddr2_cke),
380    .ddr2_dm                (ddr2_dm),
381    .phy_init_done          (phy_init_done),
382    .rst0                   (rst0),
383    .rst90                  (rst90),
384    .rstdiv0                (rstdiv0),
385    .clk0                   (clk0),
386    .clk90                  (clk90),
387    .clkdiv0                (clkdiv0),
388    .app_wdf_afull          (app_wdf_afull),
389    .app_af_afull           (app_af_afull),
390    .rd_data_valid          (rd_data_valid),
391    .app_wdf_wren           (app_wdf_wren),
392    .app_af_wren            (app_af_wren),
393    .app_af_addr            (app_af_addr),
394    .app_af_cmd             (app_af_cmd),
395    .rd_data_fifo_out       (rd_data_fifo_out),
396    .app_wdf_data           (app_wdf_data),
397    .app_wdf_mask_data      (app_wdf_mask_data),
398    .ddr2_dqs               (ddr2_dqs),
399    .ddr2_dqs_n             (ddr2_dqs_n),
400    .ddr2_ck                (ddr2_ck),
401    .rd_ecc_error           (),
402    .ddr2_ck_n              (ddr2_ck_n),
403
404    .dbg_calib_done         (dbg_calib_done),
405    .dbg_calib_err          (dbg_calib_err),
406    .dbg_calib_dq_tap_cnt   (dbg_calib_dq_tap_cnt),
407    .dbg_calib_dqs_tap_cnt  (dbg_calib_dqs_tap_cnt),
408    .dbg_calib_gate_tap_cnt  (dbg_calib_gate_tap_cnt),
409    .dbg_calib_rd_data_sel  (dbg_calib_rd_data_sel),
410    .dbg_calib_rden_dly     (dbg_calib_rden_dly),
411    .dbg_calib_gate_dly     (dbg_calib_gate_dly),
412    .dbg_idel_up_all        (dbg_idel_up_all),
413    .dbg_idel_down_all      (dbg_idel_down_all),
414    .dbg_idel_up_dq         (dbg_idel_up_dq),
415    .dbg_idel_down_dq       (dbg_idel_down_dq),
416    .dbg_idel_up_dqs        (dbg_idel_up_dqs),
417    .dbg_idel_down_dqs      (dbg_idel_down_dqs),
418    .dbg_idel_up_gate       (dbg_idel_up_gate),
419    .dbg_idel_down_gate     (dbg_idel_down_gate),
420    .dbg_sel_idel_dq        (dbg_sel_idel_dq),
421    .dbg_sel_all_idel_dq    (dbg_sel_all_idel_dq),
422    .dbg_sel_idel_dqs       (dbg_sel_idel_dqs),
423    .dbg_sel_all_idel_dqs   (dbg_sel_all_idel_dqs),
424    .dbg_sel_idel_gate      (dbg_sel_idel_gate),
425    .dbg_sel_all_idel_gate  (dbg_sel_all_idel_gate)
426    );
427
428  
429    //*****************************************************************
430   // Hooks to prevent sim/syn compilation errors (mainly for VHDL - but
431   // keep it also in Verilog version of code) w/ floating inputs if
432   // DEBUG_EN = 0.
433   //*****************************************************************
434
435   generate
436     if (DEBUG_EN == 0) begin: gen_dbg_tie_off
437       assign dbg_idel_up_all       = 'b0;
438       assign dbg_idel_down_all     = 'b0;
439       assign dbg_idel_up_dq        = 'b0;
440       assign dbg_idel_down_dq      = 'b0;
441       assign dbg_idel_up_dqs       = 'b0;
442       assign dbg_idel_down_dqs     = 'b0;
443       assign dbg_idel_up_gate      = 'b0;
444       assign dbg_idel_down_gate    = 'b0;
445       assign dbg_sel_idel_dq       = 'b0;
446       assign dbg_sel_all_idel_dq   = 'b0;
447       assign dbg_sel_idel_dqs      = 'b0;
448       assign dbg_sel_all_idel_dqs  = 'b0;
449       assign dbg_sel_idel_gate     = 'b0;
450       assign dbg_sel_all_idel_gate = 'b0;
451     end else begin: gen_dbg_enable
452       
453       //*****************************************************************
454       // PHY Debug Port example - see MIG User's Guide, XAPP858 or 
455       // Answer Record 29443
456       // This logic supports up to 32 DQ and 8 DQS I/O
457       // NOTES:
458       //   1. PHY Debug Port demo connects to 4 VIO modules:
459       //     - 3 VIO modules with only asynchronous inputs
460       //      * Monitor IDELAY taps for DQ, DQS, DQS Gate
461       //      * Calibration status
462       //     - 1 VIO module with synchronous outputs
463       //      * Allow dynamic adjustment o f IDELAY taps
464       //   2. User may need to modify this code to incorporate other
465       //      chipscope-related modules in their larger design (e.g.
466       //      if they have other ILA/VIO modules, they will need to
467       //      for example instantiate a larger ICON module). In addition
468       //      user may want to instantiate more VIO modules to control
469       //      IDELAY for more DQ, DQS than is shown here
470       //*****************************************************************
471
472       icon4 u_icon
473         (
474          .control0 (cs_control0),
475          .control1 (cs_control1),
476          .control2 (cs_control2),
477          .control3 (cs_control3)
478          );
479
480       //*****************************************************************
481       // VIO ASYNC input: Display current IDELAY setting for up to 32
482       // DQ taps (32x6) = 192
483       //*****************************************************************
484
485       vio_async_in192 u_vio0
486         (
487          .control  (cs_control0),
488          .async_in (vio0_in)
489          );
490
491       //*****************************************************************
492       // VIO ASYNC input: Display current IDELAY setting for up to 8 DQS
493       // and DQS Gate taps (8x6x2) = 96
494       //*****************************************************************
495
496       vio_async_in96 u_vio1
497         (
498          .control  (cs_control1),
499          .async_in (vio1_in)
500          );
501
502       //*****************************************************************
503       // VIO ASYNC input: Display other calibration results
504       //*****************************************************************
505
506       vio_async_in100 u_vio2
507         (
508          .control  (cs_control2),
509          .async_in (vio2_in)
510          );
511       
512       //*****************************************************************
513       // VIO SYNC output: Dynamically change IDELAY taps
514       //*****************************************************************
515       
516       vio_sync_out32 u_vio3
517         (
518          .control  (cs_control3),
519          .clk      (clkdiv0),
520          .sync_out (vio3_out)
521          );
522
523       //*****************************************************************
524       // Bit assignments:
525       // NOTE: Not all VIO, ILA inputs/outputs may be used - these will
526       //       be dependent on the user's particular bit width
527       //*****************************************************************
528
529       if (DQ_WIDTH <= 32) begin: gen_dq_le_32
530         assign vio0_in[(6*DQ_WIDTH)-1:0] 
531                  = dbg_calib_dq_tap_cnt[(6*DQ_WIDTH)-1:0];
532       end else begin: gen_dq_gt_32
533         assign vio0_in = dbg_calib_dq_tap_cnt[191:0];
534       end
535
536       if (DQS_WIDTH <= 8) begin: gen_dqs_le_8
537         assign vio1_in[(6*DQS_WIDTH)-1:0]
538                  = dbg_calib_dqs_tap_cnt[(6*DQS_WIDTH)-1:0];
539         assign vio1_in[(12*DQS_WIDTH)-1:(6*DQS_WIDTH)] 
540                  =  dbg_calib_gate_tap_cnt[(6*DQS_WIDTH)-1:0];
541       end else begin: gen_dqs_gt_32
542         assign vio1_in[47:0]  = dbg_calib_dqs_tap_cnt[47:0];
543         assign vio1_in[95:48] = dbg_calib_gate_tap_cnt[47:0];
544       end
545  
546 //dbg_calib_rd_data_sel
547
548      if (DQS_WIDTH <= 8) begin: gen_rdsel_le_8
549         assign vio2_in[(DQS_WIDTH)+7:8]    
550                  = dbg_calib_rd_data_sel[(DQS_WIDTH)-1:0];
551      end else begin: gen_rdsel_gt_32
552       assign vio2_in[15:8]    
553                  = dbg_calib_rd_data_sel[7:0];
554      end
555  
556 //dbg_calib_rden_dly
557
558      if (DQS_WIDTH <= 8) begin: gen_calrd_le_8
559        assign vio2_in[(5*DQS_WIDTH)+19:20]   
560                  = dbg_calib_rden_dly[(5*DQS_WIDTH)-1:0];
561      end else begin: gen_calrd_gt_32
562        assign vio2_in[59:20]   
563                  = dbg_calib_rden_dly[39:0];
564      end
565
566 //dbg_calib_gate_dly
567
568      if (DQS_WIDTH <= 8) begin: gen_calgt_le_8
569        assign vio2_in[(5*DQS_WIDTH)+59:60]   
570                  = dbg_calib_gate_dly[(5*DQS_WIDTH)-1:0];
571      end else begin: gen_calgt_gt_32
572        assign vio2_in[99:60]   
573                  = dbg_calib_gate_dly[39:0];
574      end
575
576 //dbg_sel_idel_dq
577
578      if (DQ_BITS <= 5) begin: gen_selid_le_5
579        assign dbg_sel_idel_dq[DQ_BITS-1:0]      
580                  = vio3_out[DQ_BITS+7:8];
581      end else begin: gen_selid_gt_32
582        assign dbg_sel_idel_dq[4:0]      
583                  = vio3_out[12:8];
584      end
585
586 //dbg_sel_idel_dqs
587
588      if (DQS_BITS <= 3) begin: gen_seldqs_le_3
589        assign dbg_sel_idel_dqs[DQS_BITS:0]     
590                  = vio3_out[(DQS_BITS+16):16];
591      end else begin: gen_seldqs_gt_32
592        assign dbg_sel_idel_dqs[3:0]     
593                  = vio3_out[19:16];
594      end
595
596 //dbg_sel_idel_gate
597
598      if (DQS_BITS <= 3) begin: gen_gtdqs_le_3
599        assign dbg_sel_idel_gate[DQS_BITS:0]    
600                  = vio3_out[(DQS_BITS+21):21];
601      end else begin: gen_gtdqs_gt_32
602        assign dbg_sel_idel_gate[3:0]    
603                  = vio3_out[24:21];
604      end
605
606
607       assign vio2_in[3:0]              = dbg_calib_done;
608       assign vio2_in[7:4]              = dbg_calib_err;
609       
610       assign dbg_idel_up_all           = vio3_out[0];
611       assign dbg_idel_down_all         = vio3_out[1];
612       assign dbg_idel_up_dq            = vio3_out[2];
613       assign dbg_idel_down_dq          = vio3_out[3];
614       assign dbg_idel_up_dqs           = vio3_out[4];
615       assign dbg_idel_down_dqs         = vio3_out[5];
616       assign dbg_idel_up_gate          = vio3_out[6];
617       assign dbg_idel_down_gate        = vio3_out[7];
618       assign dbg_sel_all_idel_dq       = vio3_out[15];
619       assign dbg_sel_all_idel_dqs      = vio3_out[20];
620       assign dbg_sel_all_idel_gate     = vio3_out[25];
621     end
622   endgenerate
623
624 endmodule