hdk/common/verif/models/ddr4_rdimm_wrapper/ddr4_rdimm_wrapper.sv (574 lines of code) (raw):

// (c) Copyright 2023 Advanced Micro Devices, Inc. All rights reserved. // // This file contains confidential and proprietary information // of AMD and is protected under U.S. and international copyright // and other intellectual property laws. // // DISCLAIMER // This disclaimer is not a license and does not grant any // rights to the materials distributed herewith. Except as // otherwise provided in a valid license issued to you by // AMD, and to the maximum extent permitted by applicable // law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND // WITH ALL FAULTS, AND AMD HEREBY DISCLAIMS ALL WARRANTIES // AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING // BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- // INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and // (2) AMD shall not be liable (whether in contract or tort, // including negligence, or under any other theory of // liability) for any loss or damage of any kind or nature // related to, arising under or in connection with these // materials, including for any direct, or any indirect, // special, incidental, or consequential loss or damage // (including loss of data, profits, goodwill, or any type of // loss or damage suffered as a result of any action brought // by a third party) even if such damage or loss was // reasonably foreseeable or AMD had been advised of the // possibility of the same. // // CRITICAL APPLICATIONS // AMD products are not designed or intended to be fail- // safe, or for use in any application requiring fail-safe // performance, such as life-support or safety devices or // systems, Class III medical devices, nuclear facilities, // applications related to the deployment of airbags, or any // other applications that could lead to death, personal // injury, or severe property or environmental damage // (individually and collectively, "Critical // Applications"). Customer assumes the sole risk and // liability of any use of AMD products in Critical // Applications, subject only to applicable laws and // regulations governing limitations on product liability. // // THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS // PART OF THIS FILE AT ALL TIMES. //////////////////////////////////////////////////////////// import arch_package::*; //typedef enum bit {SIDE_B, SIDE_A} components_side_e; `timescale 1ps/1ps module ddr4_rdimm_wrapper #( parameter MC_DQ_WIDTH = 16, // Memory DQ bus width parameter MC_DQS_BITS = 4, // Number of DQS bits parameter MC_DM_WIDTH = 4, // Number of DM bits parameter MC_CKE_NUM = 1, // Number of CKE outputs to memory parameter MC_ODT_WIDTH = 1, // Number of ODT pins parameter MC_ABITS = 18, // Number of Address bits parameter MC_BANK_WIDTH = 2, // Memory Bank address bits parameter MC_BANK_GROUP = 2, // Memory Bank Groups `ifdef THREE_DS parameter MC_LR_WIDTH = 2, `endif parameter MC_CS_NUM = 1, // Number of unique CS output to Memory parameter MC_RANKS_NUM = 1, // Number of Ranks parameter NUM_PHYSICAL_PARTS = 4, // Number of SDRAMs in a Single Rank parameter CALIB_EN = "NO", // When is set to "YES" ,R2R and FBT delays will be added parameter tCK = 1000, // CK clock period in ps parameter tPDM = 0, // Propagation delay Timing - range= from 1000 to 1300 ps. parameter MIN_TOTAL_R2R_DELAY = 150, // Parameter shows the min range of Rank to Rank delay parameter MAX_TOTAL_R2R_DELAY = 1000, // Parameter shows the max range of Rank to Rank delay parameter TOTAL_FBT_DELAY = 2700, // Total Fly-by-Topology delay parameter MEM_PART_WIDTH = "x4", // Single Device width parameter MC_CA_MIRROR = "OFF", // Address Mirroring "ON"/"OFF" // Shows which SDRAMs are connected to side A(first half) and side B(second half) of RCD. //parameter components_side_e [NUM_PHYSICAL_PARTS-1:0] SDRAM = { {(NUM_PHYSICAL_PARTS/2){SIDE_B}}, {(NUM_PHYSICAL_PARTS/2){SIDE_A}} }, // SDRAM parameter DDR_SIM_MODEL = "MICRON", // "MICRON" or "DENALI" memory model parameter DM_DBI = "", // Disables dm_dbi_n if set to NONE parameter MC_REG_CTRL = "ON", // Implement "ON" or "OFF" the RCD in rdimm wrapper parameter DIMM_MODEL = "LRDIMM", parameter RDIMM_SLOTS = 1, parameter UTYPE_density CONFIGURED_DENSITY = _16G ) ( input ddr4_act_n, input [MC_ABITS-1:0] ddr4_addr, input [MC_BANK_WIDTH-1:0] ddr4_ba, input [MC_BANK_GROUP-1:0] ddr4_bg, `ifdef THREE_DS input [MC_LR_WIDTH-1:0] ddr4_c, `endif input ddr4_par, input [MC_CKE_NUM-1:0] ddr4_cke, input [MC_ODT_WIDTH-1:0] ddr4_odt, input [MC_CS_NUM-1:0] ddr4_cs_n, input ddr4_ck_t, input ddr4_ck_c, input ddr4_reset_n, inout [MC_DM_WIDTH-1:0] ddr4_dm_dbi_n, inout [MC_DQ_WIDTH-1:0] ddr4_dq, inout [MC_DQS_BITS-1:0] ddr4_dqs_t, inout [MC_DQS_BITS-1:0] ddr4_dqs_c, inout ddr4_alert_n, input initDone, input scl, // I2C Bus Clock input sa0, // I2C Bus Address signals input sa1, // I2C Bus Address signals input sa2, // I2C Bus Address signals inout sda, // I2C Bus Data input bfunc, // Function pin. BFUNC=VSS for primary register, BFUNC=VDD for secondary register input vddspd // I2C Bus power input ); // Local parameters // input/output ports of idt_ddr4_rcd is not parameterized - they are static max values of the signals. // Redundants bits from idt_ddr4_rcd's signals localparam RCD_ADDR_REDUNDANTS_BITS = 18 - MC_ABITS; localparam RCD_BG_REDUNDANTS_BITS = 2 - MC_BANK_GROUP; `ifdef THREE_DS localparam RCD_CS_N_REDUNDANTS_BITS = 2 - MC_CS_NUM; localparam RCD_LR_REDUNDANTS_BITS = 2 - MC_LR_WIDTH; `else localparam RCD_CS_N_REDUNDANTS_BITS = 4 - MC_CS_NUM; `endif localparam RCD_CKE_REDUNDANTS_BITS = 2 - MC_CKE_NUM; localparam RCD_ODT_REDUNDANTS_BITS = 2 - MC_ODT_WIDTH; //Inputs of idt_ddr4_rcd - static max values of the signals wire [17:0] rcd_da; wire [1:0] rcd_dbg; `ifdef THREE_DS wire [1:0] rcd_c; wire [1:0] rcd_cs_n; `else wire [3:0] rcd_cs_n; `endif wire [1:0] rcd_dcke; wire [1:0] rcd_dodt; // Outputs of idt_ddr4_rcd (inputs for ddr4_dimm) // Side A of the RCD wire qa_act_n; wire [17:0] qa_addr; wire [1:0] qa_ba; wire [1:0] qa_bg; wire qa_par; wire [1:0] qa_cke; wire [1:0] qa_odt; `ifdef THREE_DS wire [1:0] qa_c; wire [1:0] qa_cs_n; `else wire [3:0] qa_cs_n; `endif // Side B of the RCD wire qb_act_n; wire [17:0] qb_addr; wire [1:0] qb_ba; wire [1:0] qb_bg; wire qb_par; wire [1:0] qb_cke; wire [1:0] qb_odt; `ifdef THREE_DS wire [1:0] qb_c; wire [1:0] qb_cs_n; `else wire [3:0] qb_cs_n; `endif // outputs of the RCD - one pair ck to each rank wire [7:0] ck; // ck[0]->ck_c; ck[1]->ck_t wire reset_n; wire [MC_DQ_WIDTH-1:0] ddr4_dimm_dq; wire [MC_DQS_BITS-1:0] ddr4_dimm_dqs_t; wire [MC_DQS_BITS-1:0] ddr4_dimm_dqs_c; wire db_dly_dir; // tran bidiDQ[MC_DQ_WIDTH-1:0] (ddr4_dq[MC_DQ_WIDTH-1:0], ddr4_dimm_dq[MC_DQ_WIDTH-1:0]); // Left side - Right side (MC - Mem) // tran bidiDQS_t[MC_DQS_BITS-1:0] (ddr4_dqs_t[MC_DQS_BITS-1:0], ddr4_dimm_dqs_t[MC_DQS_BITS-1:0]); // Left side - Right side (MC - Mem) // tran bidiDQS_c[MC_DQS_BITS-1:0] (ddr4_dqs_c[MC_DQS_BITS-1:0], ddr4_dimm_dqs_c[MC_DQS_BITS-1:0]); // Left side - Right side (MC - Mem) //************** These generate blocks are valid only if MC_REG_CTRL=="ON" *********************// // In case ddr4_addr signal have less than 18 bits, to upper bits will be added static zeroes. generate if (MC_REG_CTRL == "ON") begin: addr_only_with_rcd if(RCD_ADDR_REDUNDANTS_BITS>0) // ddr4_addr<18 begin assign rcd_da = {{RCD_ADDR_REDUNDANTS_BITS{1'b0}}, ddr4_addr}; end else begin assign rcd_da = ddr4_addr; end end // begin: addr_only_with_rcd endgenerate // In case ddr4_bg signal have less than 2 bits, to upper bit will be added static zeroe. generate if (MC_REG_CTRL == "ON") begin: bg_only_with_rcd if(RCD_BG_REDUNDANTS_BITS>0) // ddr4_bg<2 begin assign rcd_dbg = {{RCD_BG_REDUNDANTS_BITS{1'b0}}, ddr4_bg}; end else begin assign rcd_dbg = ddr4_bg; end end // begin: bg_only_with_rcd endgenerate // In case ddr4_cs_n signal have less than 4 bits, to upper bits will be added static 1'b1. generate if (MC_REG_CTRL == "ON") begin: cs_n_only_with_rcd if(RCD_CS_N_REDUNDANTS_BITS>0) // ddr4_cs_n<4 begin assign rcd_cs_n = {{RCD_CS_N_REDUNDANTS_BITS{1'b1}},ddr4_cs_n }; end else begin assign rcd_cs_n = ddr4_cs_n; end end // begin: cs_n_only_with_rcd endgenerate `ifdef THREE_DS generate if (MC_REG_CTRL == "ON") begin: c_only_with_rcd if(RCD_LR_REDUNDANTS_BITS>0) // ddr4_c<4 begin assign rcd_c = {{RCD_LR_REDUNDANTS_BITS{1'b0}},ddr4_c}; end else begin assign rcd_c = ddr4_c; end end // begin: c_only_with_rcd endgenerate `endif // In case ddr4_cke signal have less than 2 bits, to upper bit will be added static zeroe. generate if (MC_REG_CTRL == "ON") begin: cke_only_with_rcd if(RCD_CKE_REDUNDANTS_BITS>0) // ddr4_cke<2 begin assign rcd_dcke = {{RCD_CKE_REDUNDANTS_BITS{1'b0}}, ddr4_cke}; end else begin assign rcd_dcke = ddr4_cke; end end // begin: cke_only_with_rcd endgenerate // In case ddr4_odt signal have less than 2 bits, to upper bit will be added static zeroe. generate if (MC_REG_CTRL == "ON") begin: odt_only_with_rcd if(RCD_ODT_REDUNDANTS_BITS>0) // ddr4_odt<2 begin assign rcd_dodt = {{RCD_ODT_REDUNDANTS_BITS{1'b0}}, ddr4_odt}; end else begin assign rcd_dodt = ddr4_odt; end end // begin: odt_only_with_rcd endgenerate //**********************************************************************************************// // Integration of the DDR4 RCD and the DDR4 DIMM generate if (MC_REG_CTRL == "ON") // RDIMM Wrapper with DDR4 RCD begin: rcd_enabled //Intergration of the RCD model ddr4_rcd_model #( .tCK (tCK), .tPDM (tPDM), .MC_CA_MIRROR (MC_CA_MIRROR) ) u_ddr4_rcd_model ( .BCKE (), // output .BCK_c (), // output .BCK_t (), // output .BCOM (), // output [3:0] .BODT (), // output .BVREFCA (), // output .CPCAP (), // output .NU3 (), // output .QAA (qa_addr), // output [17:0] .QAACT_n (qa_act_n), // output .QABA (qa_ba), // output [1:0] .QABG (qa_bg), // output [1:0] `ifdef THREE_DS .QAC0 (qa_c[0]), // output .QAC1 (qa_c[1]), // output `else .QAC0 (qa_cs_n[2]), // output .QAC1 (qa_cs_n[3]), // output `endif .QAC2 (), // output .QACKE (qa_cke), // output [1:0] .QACS0_n (qa_cs_n[0]), // output .QACS1_n (qa_cs_n[1]), // output .QAODT (qa_odt), // output [1:0] .QAPAR (qa_par), // output .QBA (qb_addr), // output [17:0] .QBACT_n (qb_act_n), // output .QBBA (qb_ba), // output [1:0] .QBBG (qb_bg), // output [1:0] `ifdef THREE_DS .QBC0 (qb_c[0]), // output .QBC1 (qb_c[1]), // output `else .QBC0 (qb_cs_n[2]), // output .QBC1 (qb_cs_n[3]), // output `endif .QBC2 (), // output .QBCKE (qb_cke), // output [1:0] .QBCS0_n (qb_cs_n[0]), // output .QBCS1_n (qb_cs_n[1]), // output .QBODT (qb_odt), // output [1:0] .QBPAR (qb_par), // output .QRST_n (reset_n), // output .QVREFCA (), // output .Y0_c (ck[0]), // output .Y0_t (ck[1]), // output .Y1_c (ck[2]), // output .Y1_t (ck[3]), // output .Y2_c (ck[4]), // output .Y2_t (ck[5]), // output .Y3_c (ck[6]), // output .Y3_t (ck[7]), // output .ALERT_n (ddr4_alert_n), // inout .ERROR_IN_n (), // inout .NU1 (), // inout .RFU1 (), // inout .SDA (sda), // inout .AVDD (), // input .AVSS (), // input .BFUNC (bfunc), // input .CK_c (ddr4_ck_c), // input .CK_t (ddr4_ck_t), // input .DA (rcd_da), // input [17:0] //.DA (ddr4_addr), // input [17:0] .DACT_n (ddr4_act_n), // input .DBA (ddr4_ba), // input [1:0] .DBG (rcd_dbg), // input [1:0] `ifdef THREE_DS .DC0 (rcd_c[0]), // input .DC1 (rcd_c[1]), // input `else .DC0 (rcd_cs_n[2]), // input .DC1 (rcd_cs_n[3]), // input `endif .DC2 (), // input .DCKE (rcd_dcke), // input [1:0] .DCS0_n (rcd_cs_n[0]), // input .DCS1_n (rcd_cs_n[1]), // input .DODT (rcd_dodt), // input [1:0] .DPAR (ddr4_par), // input .DRST_n (ddr4_reset_n), // input .NU0 (), // input .NU2 (), // input .PVDD (), // input .PVSS (), // input .RFU0 (), // input .RFU2 (), // input .RFU3 (), // input .SA0 (sa0), // input .SA1 (sa1), // input .SA2 (sa2), // input .SCL (scl), // input .VDD (), // input .VDD1 (), // input .VDDSPD (vddspd), // input .VREFCA (), // input .VSS (), // input .VSS1 (), // input .ZQCAL () // input ); //Integration of MIG if(DIMM_MODEL == "LRDIMM") begin : LRDIMM ddr4_db_delay_model #(.MC_DQ_WIDTH (MC_DQ_WIDTH) ,.MC_DQS_BITS (MC_DQS_BITS) ,.NUM_PHYSICAL_PARTS (NUM_PHYSICAL_PARTS) ,.MEM_PART_WIDTH (MEM_PART_WIDTH) ,.tCK (tCK) ) u_ddr4_db_delay_model ( .ddr4_reset_n (ddr4_reset_n) ,.ddr4_db_dq (ddr4_dq) ,.ddr4_db_dqs_t (ddr4_dqs_t) ,.ddr4_db_dqs_c (ddr4_dqs_c) ,.ddr4_dimm_dq (ddr4_dimm_dq) ,.ddr4_dimm_dqs_t (ddr4_dimm_dqs_t) ,.ddr4_dimm_dqs_c (ddr4_dimm_dqs_c) ); ddr4_dimm #( .MC_DQ_WIDTH (MC_DQ_WIDTH), .MC_DQS_BITS (MC_DQS_BITS), .MC_DM_WIDTH (MC_DM_WIDTH), .MC_CKE_NUM (MC_CKE_NUM), .MC_ODT_WIDTH (MC_ODT_WIDTH), .MC_ABITS (MC_ABITS), .MC_BANK_WIDTH (MC_BANK_WIDTH), .MC_BANK_GROUP (MC_BANK_GROUP), `ifdef THREE_DS .MC_LR_WIDTH (MC_LR_WIDTH), `endif .MC_CS_NUM (MC_CS_NUM), .MC_RANKS_NUM (MC_RANKS_NUM), .NUM_PHYSICAL_PARTS (NUM_PHYSICAL_PARTS), .CALIB_EN (CALIB_EN), .MIN_TOTAL_R2R_DELAY (MIN_TOTAL_R2R_DELAY), .MAX_TOTAL_R2R_DELAY (MAX_TOTAL_R2R_DELAY), .TOTAL_FBT_DELAY (TOTAL_FBT_DELAY), .MEM_PART_WIDTH (MEM_PART_WIDTH), .MC_CA_MIRROR (MC_CA_MIRROR), //.SDRAM (SDRAM), .DDR_SIM_MODEL (DDR_SIM_MODEL), .DM_DBI (DM_DBI), .MC_REG_CTRL (MC_REG_CTRL), .CONFIGURED_DENSITY (CONFIGURED_DENSITY) ) u_ddr4_dimm ( .qa_act_n (qa_act_n), // input .qa_addr (qa_addr[MC_ABITS-1:0]), // input [MC_ABITS-1:0] .qa_ba (qa_ba[MC_BANK_WIDTH-1:0]), // input [MC_BANK_WIDTH-1:0] .qa_bg (qa_bg[MC_BANK_GROUP-1:0]), // input [MC_BANK_GROUP-1:0] .qa_par (qa_par), // input .qa_cke (qa_cke[MC_CKE_NUM-1:0]), // input [MC_CKE_NUM-1:0] .qa_odt (qa_odt[MC_ODT_WIDTH-1:0]), // input [MC_ODT_WIDTH-1:0] `ifdef THREE_DS .qa_c (qa_c[MC_LR_WIDTH-1:0]), // input [MC_LR_WIDTH-1:0] `endif .qa_cs_n (qa_cs_n[MC_CS_NUM-1:0]), // input [MC_CS_NUM-1:0] .qb_act_n (qb_act_n), // input .qb_addr (qb_addr[MC_ABITS-1:0]), // input [MC_ABITS-1:0] .qb_ba (qb_ba[MC_BANK_WIDTH-1:0]), // input [MC_BANK_WIDTH-1:0] .qb_bg (qb_bg[MC_BANK_GROUP-1:0]), // input [MC_BANK_GROUP-1:0] .qb_par (qb_par), // input .qb_cke (qb_cke[MC_CKE_NUM-1:0]), // input [MC_CKE_NUM-1:0] .qb_odt (qb_odt[MC_ODT_WIDTH-1:0]), // input [MC_ODT_WIDTH-1:0] `ifdef THREE_DS .qb_c (qb_c[MC_LR_WIDTH-1:0]), // input [MC_LR_WIDTH-1:0] `endif .qb_cs_n (qb_cs_n[MC_CS_NUM-1:0]), // input [MC_CS_NUM-1:0] .ck (ck[MC_CS_NUM*2-1:0]), // input [MC_CS_NUM*2-1:0] .reset_n (reset_n), // input .dm_dbi_n (ddr4_dm_dbi_n[MC_DM_WIDTH-1:0]), // inout [MC_DQS_BITS-1:0] .dq (ddr4_dimm_dq[MC_DQ_WIDTH-1:0] ), // inout [MC_DQ_WIDTH-1:0] .dqs_t (ddr4_dimm_dqs_t[MC_DQS_BITS-1:0]), // inout [MC_DQS_BITS-1:0] .dqs_c (ddr4_dimm_dqs_c[MC_DQS_BITS-1:0] ), // inout [MC_DQS_BITS-1:0] .alert_n (ddr4_alert_n) // output ); end : LRDIMM else begin : NOT_LRDIMM ddr4_dimm #( .MC_DQ_WIDTH (MC_DQ_WIDTH), .MC_DQS_BITS (MC_DQS_BITS), .MC_DM_WIDTH (MC_DM_WIDTH), .MC_CKE_NUM (MC_CKE_NUM), .MC_ODT_WIDTH (MC_ODT_WIDTH), .MC_ABITS (MC_ABITS), .MC_BANK_WIDTH (MC_BANK_WIDTH), .MC_BANK_GROUP (MC_BANK_GROUP), `ifdef THREE_DS .MC_LR_WIDTH (MC_LR_WIDTH), `endif .MC_CS_NUM (MC_CS_NUM), .MC_RANKS_NUM (MC_RANKS_NUM), .NUM_PHYSICAL_PARTS (NUM_PHYSICAL_PARTS), .CALIB_EN (CALIB_EN), .MIN_TOTAL_R2R_DELAY (MIN_TOTAL_R2R_DELAY), .MAX_TOTAL_R2R_DELAY (MAX_TOTAL_R2R_DELAY), .TOTAL_FBT_DELAY (TOTAL_FBT_DELAY), .MEM_PART_WIDTH (MEM_PART_WIDTH), .MC_CA_MIRROR (MC_CA_MIRROR), //.SDRAM (SDRAM), .DDR_SIM_MODEL (DDR_SIM_MODEL), .DM_DBI (DM_DBI), .MC_REG_CTRL (MC_REG_CTRL), .CONFIGURED_DENSITY (CONFIGURED_DENSITY) ) u_ddr4_dimm ( .qa_act_n (qa_act_n), // input .qa_addr (qa_addr[MC_ABITS-1:0]), // input [MC_ABITS-1:0] .qa_ba (qa_ba[MC_BANK_WIDTH-1:0]), // input [MC_BANK_WIDTH-1:0] .qa_bg (qa_bg[MC_BANK_GROUP-1:0]), // input [MC_BANK_GROUP-1:0] .qa_par (qa_par), // input .qa_cke (qa_cke[MC_CKE_NUM-1:0]), // input [MC_CKE_NUM-1:0] .qa_odt (qa_odt[MC_ODT_WIDTH-1:0]), // input [MC_ODT_WIDTH-1:0] `ifdef THREE_DS .qa_c (qa_c[MC_LR_WIDTH-1:0]), // input [MC_LR_WIDTH-1:0] `endif .qa_cs_n (qa_cs_n[MC_CS_NUM-1:0]), // input [MC_CS_NUM-1:0] .qb_act_n (qb_act_n), // input .qb_addr (qb_addr[MC_ABITS-1:0]), // input [MC_ABITS-1:0] .qb_ba (qb_ba[MC_BANK_WIDTH-1:0]), // input [MC_BANK_WIDTH-1:0] .qb_bg (qb_bg[MC_BANK_GROUP-1:0]), // input [MC_BANK_GROUP-1:0] .qb_par (qb_par), // input .qb_cke (qb_cke[MC_CKE_NUM-1:0]), // input [MC_CKE_NUM-1:0] .qb_odt (qb_odt[MC_ODT_WIDTH-1:0]), // input [MC_ODT_WIDTH-1:0] `ifdef THREE_DS .qb_c (qb_c[MC_LR_WIDTH-1:0]), // input [MC_LR_WIDTH-1:0] `endif .qb_cs_n (qb_cs_n[MC_CS_NUM-1:0]), // input [MC_CS_NUM-1:0] .ck (ck[MC_CS_NUM*2-1:0]), // input [MC_CS_NUM*2-1:0] .reset_n (reset_n), // input .dm_dbi_n (ddr4_dm_dbi_n[MC_DM_WIDTH-1:0]), // inout [MC_DQS_BITS-1:0] .dq (ddr4_dq[MC_DQ_WIDTH-1:0] ), // inout [MC_DQ_WIDTH-1:0] .dqs_t (ddr4_dqs_t[MC_DQS_BITS-1:0]), // inout [MC_DQS_BITS-1:0] .dqs_c (ddr4_dqs_c[MC_DQS_BITS-1:0] ), // inout [MC_DQS_BITS-1:0] .alert_n (ddr4_alert_n) // output ); end // !LRDIMM end // block: rcd_enabled else // if (MC_REG_CTRL == "OFF") // RDIMM Wrapper without DDR4 RCD - in that case RDIMM Wrapper will work like UDIMM begin: rcd_disabled // Integration of ddr4_dimm.v ddr4_dimm #( .MC_DQ_WIDTH (MC_DQ_WIDTH), .MC_DQS_BITS (MC_DQS_BITS), .MC_DM_WIDTH (MC_DM_WIDTH), .MC_CKE_NUM (MC_CKE_NUM), .MC_ODT_WIDTH (MC_ODT_WIDTH), .MC_ABITS (MC_ABITS), .MC_BANK_WIDTH (MC_BANK_WIDTH), .MC_BANK_GROUP (MC_BANK_GROUP), `ifdef THREE_DS .MC_LR_WIDTH (MC_LR_WIDTH), `endif .MC_CS_NUM (MC_CS_NUM), .MC_RANKS_NUM (MC_RANKS_NUM), .NUM_PHYSICAL_PARTS (NUM_PHYSICAL_PARTS), .CALIB_EN (CALIB_EN), .MIN_TOTAL_R2R_DELAY(MIN_TOTAL_R2R_DELAY), .MAX_TOTAL_R2R_DELAY(MAX_TOTAL_R2R_DELAY), .TOTAL_FBT_DELAY (TOTAL_FBT_DELAY), .MEM_PART_WIDTH (MEM_PART_WIDTH), .MC_CA_MIRROR ("OFF"), // .SDRAM ({NUM_PHYSICAL_PARTS{1'b0}}), // All of the components will be connected to side A .DDR_SIM_MODEL(DDR_SIM_MODEL), .DM_DBI (DM_DBI), .MC_REG_CTRL (MC_REG_CTRL), .CONFIGURED_DENSITY (CONFIGURED_DENSITY) ) u_ddr4_dimm ( .qa_act_n (ddr4_act_n), // input .qa_addr (ddr4_addr), // input [MC_ABITS-1:0] .qa_ba (ddr4_ba), // input [MC_BANK_WIDTH-1:0] .qa_bg (ddr4_bg), // input [MC_BANK_GROUP-1:0] .qa_par (ddr4_par), // input .qa_cke (ddr4_cke), // input [MC_CKE_NUM-1:0] .qa_odt (ddr4_odt), // input [MC_ODT_WIDTH-1:0] `ifdef THREE_DS .qa_c (ddr4_c), // input `endif .qa_cs_n (ddr4_cs_n), // input [MC_CS_NUM-1:0] // qb_* signals are connected to static values. These signals are not used without RCD. .qb_act_n (1'b1), // input .qb_addr ({(MC_ABITS){1'b0}}), // input [MC_ABITS-1:0] .qb_ba ({(MC_BANK_WIDTH){1'b0}}), // input [MC_BANK_WIDTH-1:0] .qb_bg ({(MC_BANK_GROUP){1'b0}}), // input [MC_BANK_GROUP-1:0] .qb_par (1'b0), // input .qb_cke ({(MC_CKE_NUM){1'b0}}), // input [MC_CKE_NUM-1:0] .qb_odt ({(MC_ODT_WIDTH){1'b0}}), // input [MC_ODT_WIDTH-1:0] `ifdef THREE_DS .qb_c ({(MC_LR_WIDTH){1'b0}}), // input `endif .qb_cs_n ({(MC_CS_NUM){1'b1}}), // input [MC_CS_NUM-1:0] .ck (ck[MC_CS_NUM*2-1:0]), // input [MC_CS_NUM*2-1:0] .reset_n (ddr4_reset_n), // input .dm_dbi_n (ddr4_dm_dbi_n), // inout [MC_DQS_BITS-1:0] .dq (ddr4_dq), // inout [MC_DQ_WIDTH-1:0] .dqs_t (ddr4_dqs_t), // inout [MC_DQS_BITS-1:0] .dqs_c (ddr4_dqs_c), // inout [MC_DQS_BITS-1:0] .alert_n (ddr4_alert_n) // output ); // In case without RCD, there are replication of the incoming ddr4_ck signal assign ck = {(MC_CS_NUM){ddr4_ck_t, ddr4_ck_c}}; end // block: rcd_disabled endgenerate endmodule // ddr4_rdimm_wrapper