📄 dcm_adv.v
字号:
// $Header: /devl/xcs/repo/env/Databases/CAEInterfaces/verunilibs/data/virtex4/DCM_ADV.v,v 1.37.4.1 2008/01/04 00:30:55 yanx Exp $///////////////////////////////////////////////////////////////////////////////// Copyright (c) 1995/2004 Xilinx, Inc.// All Right Reserved.///////////////////////////////////////////////////////////////////////////////// ____ ____// / /\/ /// /___/ \ / Vendor : Xilinx// \ \ \/ Version : 10.1// \ \ Description : Xilinx Functional Simulation Library Component// / / Digital Clock Manager with Advanced Features// /___/ /\ Filename : DCM_ADV.v// \ \ / \ Timestamp : Thu Mar 25 16:43:43 PST 2004// \___\/\___\//// Revision:// 03/23/04 - Initial version.// 04/11/05 - Add parameter DFS_OSCILLATOR_MODE to support R.// 04/22/05 - Change DRP set clkfx M/D value effected on RST=1, not rising// edge. (CR 206731)// 05/11/05 - Add parameter DCM_AUTOCALIBRATION (CR 208095).// - Add clkin alignment check control to remove the glitch when// clkin stopped. (CR207409).// 05/19/05 - Add initial to all clock outputs. (CR 208380).// 05/25/05 - Seperate clock_second_pos and neg to another process due to// wait caused unreset. Set fb_delay_found after fb_delay computed.// (CR 208771)// 07/05/05 - Use counter to generate clkdv_out to align with clk0_out. (CR211465).// 07/25/05 - Set CLKIN_PERIOD default to 10.0ns to (CR 213190).// 12/02/05 - Add warning for un-used DRP address use. (CR 221885)// 12/22/05 - LOCKED = x when RST less than 3 clock cycles (CR 222795)// 01/06/06 - Remove GSR from 3 cycle check. (223099).// 01/12/06 - Remove GSR from reset logic. (223099).// 01/12/06 - Add rst_in to period_div and period_ps block to handle clkin frequency // change case. (CR 221989).// 01/26/06 - Remove $finish from DRP Warning and change invalid to unsupported// address. (CR 224743)// Add reset to maximum period check module (CR224287).// 02/28/06 - Add SIM_DEVICE generic to support V5 and V4 M and D for CLKFX (BT#1003).// Add integer and real to parameter declaration.// 03/10/06 - Add wire declaration for lock_period_dly signal (CR 227126)// 08/10/06 - Set PSDONE to 0 when CLKOUT_PHASE_SHIFT=FIXED (CR 227018).// 03/07/07 - Change DRP CLKFX Multiplier to bit 15 to 8 and Divider to bit 7 to 0.// (CR 435600).// 04/06/07 - Enable the clock out in clock low time after reset in model// clock_divide_by_2 (CR 437471).// 06/04/07 - Add wire declaration for internal signals, Remove buf from unisim.// 09/20/07 - Use 1.5 factor for clock stopped check when CLKIN divide by 2 set(CR446707).// 11/01/07 - Add DRP DFS_FREQUENCY_MODE and DLL_FREQUENCY_MODE read/write support (CR435651)// 12/20/07 - Add DRP CLKIN_DIVIDE_BY_2 read/write support (CR457282)// End Revision`timescale 1 ps / 1 ps`define CLKFX_MULTIPLY_ADDR 80`define CLKFX_DIVIDE_ADDR 82`define PHASE_SHIFT_ADDR 85`define PHASE_SHIFT_KICK_OFF_ADDR 17`define DCM_DEFAULT_STATUS_ADDR 0`define DFS_FREQ_MODE_ADDR 65`define DLL_FREQ_MODE_ADDR 81`define CLKIN_DIV_BY2_ADDR 68module DCM_ADV ( CLK0, CLK180, CLK270, CLK2X, CLK2X180, CLK90, CLKDV, CLKFX, CLKFX180, DO, DRDY, LOCKED, PSDONE, CLKFB, CLKIN, DADDR, DCLK, DEN, DI, DWE, PSCLK, PSEN, PSINCDEC, RST);parameter real CLKDV_DIVIDE = 2.0;parameter integer CLKFX_DIVIDE = 1;parameter integer CLKFX_MULTIPLY = 4;parameter CLKIN_DIVIDE_BY_2 = "FALSE";parameter real CLKIN_PERIOD = 10.0; // non-simulatableparameter CLKOUT_PHASE_SHIFT = "NONE";parameter CLK_FEEDBACK = "1X";parameter DCM_AUTOCALIBRATION = "TRUE";parameter DCM_PERFORMANCE_MODE = "MAX_SPEED"; // non-simulatableparameter DESKEW_ADJUST = "SYSTEM_SYNCHRONOUS"; // non-simulatableparameter DFS_FREQUENCY_MODE = "LOW";parameter DLL_FREQUENCY_MODE = "LOW";parameter DUTY_CYCLE_CORRECTION = "TRUE";parameter FACTORY_JF = 16'hF0F0; // non-simulatablelocalparam integer MAXPERCLKIN = 1000000; // non-modifiable simulation parameterlocalparam integer MAXPERPSCLK = 100000000; // non-modifiable simulation parameterparameter integer PHASE_SHIFT = 0;localparam integer SIM_CLKIN_CYCLE_JITTER = 300; // non-modifiable simulation parameterlocalparam integer SIM_CLKIN_PERIOD_JITTER = 1000; // non-modifiable simulation parameterparameter SIM_DEVICE ="VIRTEX4";parameter STARTUP_WAIT = "FALSE"; // non-simulatablelocalparam DFS_OSCILLATOR_MODE = "PHASE_FREQ_LOCK";output CLK0;output CLK180;output CLK270;output CLK2X180;output CLK2X;output CLK90;output CLKDV;output CLKFX180;output CLKFX;output DRDY;output LOCKED;output PSDONE;output [15:0] DO;input CLKFB;input CLKIN;input DCLK;input DEN;input DWE;input PSCLK;input PSEN;input PSINCDEC;tri0 GSR = glbl.GSR;input RST;input [15:0] DI;input [6:0] DADDR;reg CLK0;reg CLK180;reg CLK270;reg CLK2X180;reg CLK2X;reg CLK90;reg CLKDV;reg CLKFX180;reg CLKFX;wire [15:0] di_in;wire [6:0] daddr_in;wire clkfb_in, clkin_in, dssen_in;wire psclk_in, psen_in, psincdec_in, rst_in, gsr_in, rst_input ;wire locked_out_out;wire dwe_in, den_in, dclk_in, clkin_lost_out, clkfx_lost_out, clkfb_lost_out;reg rst_flag;reg clk0_out;reg clk2x_out, clkdv_out;reg clkfx_out, locked_out, psdone_out, ps_overflow_out;reg clkfx_out_avg, clkfx_out_ph;reg ps_lock;reg drdy_out;wire [15:0] do_out;reg [15:0] do_out_s, do_out_drp, do_out_drp1;reg do_stat_en;reg [6:0] daddr_in_lat;reg valid_daddr;reg [1:0] clkfb_type;reg [8:0] divide_type;reg clkin_type_i;wire clkin_type;reg [2:0] ps_type;reg [3:0] deskew_adjust_mode;wire dfs_mode_type;reg dfs_mode_type_i;wire [1:0] dll_mode_type;reg [1:0] dll_mode_type_i;reg sim_device_type;reg clk1x_type;integer ps_in, ps_min, ps_max;integer ps_in_ps, ps_in_psdrp, ps_in_curr;integer ps_delay_ps, ps_delay_drp;integer clkdv_cnt;reg lock_period, lock_delay, lock_clkin, lock_clkfb;reg [1:0] lock_out;reg lock_out1_neg;reg lock_fb, lock_ps, lock_ps_dly;reg fb_delay_found;reg clock_stopped;reg clkin_chkin, clkfb_chkin;wire chk_enable, chk_rst;wire clkin_div;wire locked_out_tmp;wire lock_period_pulse;wire lock_period_dly;reg clkin_ps;reg clkin_fb;time FINE_SHIFT_RANGE;time ps_delay;time delay_edge;time clkin_period [2:0];time period;time period_div;time period_orig;time period_stop_ck;time period_ps;time clkout_delay;time fb_delay;time period_fx, remain_fx;time period_fxtmp, period_fxavg;time period_dv_high, period_dv_low;time cycle_jitter, period_jitter;time clkin_div_edge, clkin_ps_edge, clkin_edge;time tap_delay_step;reg clkin_window, clkfb_window;reg [2:0] rst_reg;reg [12:0] numerator, denominator, gcd;reg [23:0] i, n, d, p;reg first_time_locked;reg en_status;reg [1521:0] mem_drp;reg drp_lock;reg drp_lock1;reg ps_drp_lock, ps_drp_lock_tmp;integer ps_drp, ps_in_drp;reg ps_kick_off_cmd;reg single_step_lock, single_step_lock_tmp, single_step_done;integer clkfx_multiply_drp, clkfx_divide_drp;reg [7:0] clkfx_m_reg, clkfx_d_reg;reg [15:0] clkfx_md_reg, dfs_mode_reg, dll_mode_reg, clkin_div2_reg;reg inc_dec;real clock_stopped_factor;reg notifier;initial begin #1; if ($realtime == 0) begin $display ("Simulator Resolution Error : Simulator resolution is set to a value greater than 1 ps."); $display ("In order to simulate the DCM_ADV, the simulator resolution must be set to 1ps or smaller."); $finish; endendinitial begin case (CLKDV_DIVIDE) 1.5 : divide_type = 'd3; 2.0 : divide_type = 'd4; 2.5 : divide_type = 'd5; 3.0 : divide_type = 'd6; 3.5 : divide_type = 'd7; 4.0 : divide_type = 'd8; 4.5 : divide_type = 'd9; 5.0 : divide_type = 'd10; 5.5 : divide_type = 'd11; 6.0 : divide_type = 'd12; 6.5 : divide_type = 'd13; 7.0 : divide_type = 'd14; 7.5 : divide_type = 'd15; 8.0 : divide_type = 'd16; 9.0 : divide_type = 'd18; 10.0 : divide_type = 'd20; 11.0 : divide_type = 'd22; 12.0 : divide_type = 'd24; 13.0 : divide_type = 'd26; 14.0 : divide_type = 'd28; 15.0 : divide_type = 'd30; 16.0 : divide_type = 'd32; default : begin $display("Attribute Syntax Error : The attribute CLKDV_DIVIDE on DCM_ADV instance %m is set to %0.1f. Legal values for this attribute are 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, or 16.0.", CLKDV_DIVIDE); $finish; end endcase// if (DFS_OSCILLATOR_MODE == "AVE_FREQ_LOCK") // if ((CLKFX_DIVIDE <= 0) || (4096 < CLKFX_DIVIDE)) begin// $display("Attribute Syntax Error : The attribute CLKFX_DIVIDE on DCM_ADV instance %m is set to %d. Legal values for this attribute are 1 ... 4096.", CLKFX_DIVIDE);// $finish;// end// else if ((CLKFX_DIVIDE <= 0) || (32 < CLKFX_DIVIDE)) begin $display("Attribute Syntax Error : The attribute CLKFX_DIVIDE on DCM_ADV instance %m is set to %d. Legal values for this attribute are 1 ... 32.", CLKFX_DIVIDE); $finish; end// if (DFS_OSCILLATOR_MODE == "AVE_FREQ_LOCK")// if ((CLKFX_MULTIPLY <= 1) || (4096 < CLKFX_MULTIPLY)) begin// $display("Attribute Syntax Error : The attribute CLKFX_MULTIPLY on DCM_ADV instance %m is set to %d. Legal values for this attribute are 2 ... 4096.", CLKFX_MULTIPLY);// $finish;// end// else if ((CLKFX_MULTIPLY <= 1) || (32 < CLKFX_MULTIPLY)) begin $display("Attribute Syntax Error : The attribute CLKFX_MULTIPLY on DCM_ADV instance %m is set to %d. Legal values for this attribute are 2 ... 32.", CLKFX_MULTIPLY); $finish; end case (CLKIN_DIVIDE_BY_2) "FALSE" : begin clkin_type_i = 0; clock_stopped_factor = 2.0; end "TRUE" : begin clkin_type_i = 1; clock_stopped_factor = 1.5; end default : begin $display("Attribute Syntax Error : The attribute CLKIN_DIVIDE_BY_2 on DCM_ADV instance %m is set to %s. Legal values for this attribute are TRUE or FALSE.", CLKIN_DIVIDE_BY_2); $finish; end endcase case (CLKOUT_PHASE_SHIFT) "NONE" : begin ps_in = 0 + 256; ps_type = 3'b000; end "FIXED" : begin ps_in = PHASE_SHIFT + 256; ps_max = 255 + 256; ps_min = -255 + 256; ps_type = 3'b001; if ( DCM_PERFORMANCE_MODE == "MAX_RANGE" ) FINE_SHIFT_RANGE = 10000; else FINE_SHIFT_RANGE = 7000; if ((PHASE_SHIFT < -255) || (PHASE_SHIFT > 255)) begin $display("Attribute Syntax Error : The attribute PHASE_SHIFT on DCM_ADV instance %m is set to %d. Legal values for this attribute are -255 ... 255.", PHASE_SHIFT); $display("Error : PHASE_SHIFT = %d is not -255 ... 255.", PHASE_SHIFT); $finish; end end "VARIABLE_POSITIVE" : begin ps_in = PHASE_SHIFT + 256; ps_max = 255 + 256; ps_min = 0 + 256; ps_type = 3'b011; if ( DCM_PERFORMANCE_MODE == "MAX_RANGE" ) FINE_SHIFT_RANGE = 10000; else FINE_SHIFT_RANGE = 7000; if ((PHASE_SHIFT < 0) || (PHASE_SHIFT > 255)) begin $display("Attribute Syntax Error : The attribute PHASE_SHIFT on DCM_ADV instance %m is set to %d. Legal values for this attribute are 0 ... 255.", PHASE_SHIFT); $display("Error : PHASE_SHIFT = %d is not 0 ... 255.", PHASE_SHIFT); $finish; end end "VARIABLE_CENTER" : begin ps_in = PHASE_SHIFT + 256; ps_max = 255 + 256; ps_min = -255 + 256; ps_type = 3'b100; if ( DCM_PERFORMANCE_MODE == "MAX_RANGE" ) FINE_SHIFT_RANGE = 5000; else FINE_SHIFT_RANGE = 3500; if ((PHASE_SHIFT < -255) || (PHASE_SHIFT > 255)) begin $display("Attribute Syntax Error : The attribute PHASE_SHIFT on DCM_ADV instance %m is set to %d. Legal values for this attribute are -255 ... 255.", PHASE_SHIFT); $display("Error : PHASE_SHIFT = %d is not -255 ... 255.", PHASE_SHIFT); $finish; end end "DIRECT" : begin ps_in = PHASE_SHIFT; ps_max = 1023; ps_min = 0; ps_type = 3'b101; if (DCM_PERFORMANCE_MODE == "MAX_RANGE") begin tap_delay_step = 18; FINE_SHIFT_RANGE = 10000; end else begin tap_delay_step = 11; FINE_SHIFT_RANGE = 7000; end if ((PHASE_SHIFT < 0) || (PHASE_SHIFT > 1023)) begin $display("Attribute Syntax Error : The attribute PHASE_SHIFT on DCM_ADV instance %m is set to %d. Legal values for this attribute is 0 to 1023.", PHASE_SHIFT); $display("Error : PHASE_SHIFT = %d is not 0 to 1023.", PHASE_SHIFT); $finish; end end default : begin $display("Attribute Syntax Error : The Attribute CLKOUT_PHASE_SHIFT on DCM_ADV instance %m is set to %s. Legal values for this attribute are NONE, FIXED, VARIABLE_POSITIVE, VARIABLE_CENTER or DIRECT.", CLKOUT_PHASE_SHIFT); $finish; end endcase ps_in_curr = ps_in; ps_in_ps = ps_in; ps_in_psdrp = ps_in; case (CLK_FEEDBACK) "NONE" : begin clkfb_type = 0; $display("Attribute CLK_FEEDBACK is set to value NONE."); $display("In this mode, the output ports CLK0, CLK180, CLK270, CLK2X, CLK2X180, CLK90 and CLKDV can have any random phase relation w.r.t. input port CLKIN"); end "1X" : clkfb_type = 1; default : begin $display("Attribute Syntax Error : The attribute CLK_FEEDBACK on DCM_ADV instance %m is set to %s. Legal values for this attribute are NONE or 1X.", CLK_FEEDBACK); $finish; end endcase case (DCM_PERFORMANCE_MODE) "MAX_SPEED" : ; "MAX_RANGE" : ; default : begin $display("Attribute Syntax Error : The Attribute DCM_PERFORMANCE_MODE on DCM_ADV instance %m is set to %s. Legal values for this attribute are MAX_SPEED or MAX_RANGE.", DCM_PERFORMANCE_MODE); $finish;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -