hdk/common/lib/aws_clk_gen.sv (743 lines of code) (raw):
// ============================================================================
// Amazon FPGA Hardware Development Kit
//
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Amazon Software License (the "License"). You may not use
// this file except in compliance with the License. A copy of the License is
// located at
//
// http://aws.amazon.com/asl/
//
// or in the "license" file accompanying this file. This file is distributed on
// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or
// implied. See the License for the specific language governing permissions and
// limitations under the License.
// ============================================================================
// Module
// -------
// AWS_CLK_GEN
//
// Description
// -----------
// * Generate clocks and resets to the CL design
//
///////////////////////////////////////////////////////////////////////////////////
module aws_clk_gen
#(
parameter CLK_GRP_A_EN = 1,
parameter CLK_GRP_B_EN = 1,
parameter CLK_GRP_C_EN = 1,
parameter CLK_HBM_EN = 1
)
(
input logic i_clk_main_a0, // clk_main_a0 from AWS Shell
input logic i_rst_main_n, // rst_main_n from AWS Shell
input logic i_clk_hbm_ref, // clk_hbm_ref 100MHz HBM reference clock from AWS Shell
// AXIL Control interface in i_clk_main_a0 domain
input logic [31:0] s_axil_ctrl_awaddr,
input logic s_axil_ctrl_awvalid,
output logic s_axil_ctrl_awready,
input logic [31:0] s_axil_ctrl_wdata,
input logic [3:0] s_axil_ctrl_wstrb,
input logic s_axil_ctrl_wvalid,
output logic s_axil_ctrl_wready,
output logic [1:0] s_axil_ctrl_bresp,
output logic s_axil_ctrl_bvalid,
input logic s_axil_ctrl_bready,
input logic [31:0] s_axil_ctrl_araddr,
input logic s_axil_ctrl_arvalid,
output logic s_axil_ctrl_arready,
output logic [31:0] s_axil_ctrl_rdata,
output logic [1:0] s_axil_ctrl_rresp,
output logic s_axil_ctrl_rvalid,
input logic s_axil_ctrl_rready,
// Pass through clocks
output logic o_clk_hbm_ref, // same as i_clk_hbm_ref 100 MHz
output logic o_clk_main_a0, // same as i_clk_main_a0
// Clock group A:
output logic o_clk_extra_a1,
output logic o_clk_extra_a2,
output logic o_clk_extra_a3,
// Clock group B:
output logic o_clk_extra_b0, // This also ap_clk0 for Vitis
output logic o_clk_extra_b1,
// Clock group C:
output logic o_clk_extra_c0, // This also ap_clk1 for Vitis
output logic o_clk_extra_c1,
// HBM Axi clock:
output logic o_clk_hbm_axi, // HBM AXI clock (max 450 MHz)
// Resets
output logic o_cl_rst_hbm_axi_n , // reset sync'd to o_clk_hbm_axi
output logic o_cl_rst_hbm_ref_n , // reset sync'd to o_clk_hbm_ref
output logic o_cl_rst_c1_n , // reset sync'd to o_clk_extra_c1
output logic o_cl_rst_c0_n , // reset sync'd to o_clk_extra_c0
output logic o_cl_rst_b1_n , // reset sync'd to o_clk_extra_b1
output logic o_cl_rst_b0_n , // reset sync'd to o_clk_extra_b0
output logic o_cl_rst_a3_n , // reset sync'd to o_clk_extra_a3
output logic o_cl_rst_a2_n , // reset sync'd to o_clk_extra_a2
output logic o_cl_rst_a1_n , // reset sync'd to o_clk_extra_a1
output logic o_cl_rst_main_n // CL(user) design should use this as main reset. Sync'd to clk_main_a0.
);
//===================================================================
// local signals/params
//===================================================================
localparam MAX_NUM_CLKS = 10;
logic rst_main_n = '0;
logic rst_hbm_n;
logic [31:0] hclk_axil_awaddr;
logic hclk_axil_awvalid;
logic hclk_axil_awready;
logic [31:0] hclk_axil_wdata;
logic [3:0] hclk_axil_wstrb;
logic hclk_axil_wvalid;
logic hclk_axil_wready;
logic [1:0] hclk_axil_bresp;
logic hclk_axil_bvalid;
logic hclk_axil_bready;
logic [31:0] hclk_axil_araddr;
logic hclk_axil_arvalid;
logic hclk_axil_arready;
logic [31:0] hclk_axil_rdata;
logic [1:0] hclk_axil_rresp;
logic hclk_axil_rvalid;
logic hclk_axil_rready;
// AXIL Structure
typedef struct {
logic [31:0] awaddr;
logic awvalid;
logic awready;
logic [31:0] wdata;
logic [3:0] wstrb;
logic wvalid;
logic wready;
logic [1:0] bresp;
logic bvalid;
logic bready;
logic [31:0] araddr;
logic arvalid;
logic arready;
logic [31:0] rdata;
logic [1:0] rresp;
logic rvalid;
logic rready;
} st_axil_cctrl;
st_axil_cctrl base_a_axil;
st_axil_cctrl base_b_axil;
st_axil_cctrl base_c_axil;
st_axil_cctrl base_hbm_axil;
st_axil_cctrl base_reg_axil;
logic glbl_rst;
logic [MAX_NUM_CLKS-1:0] cl_rst_n;
//===================================================================
// Rest sync
//===================================================================
always_ff @(posedge i_clk_main_a0)
rst_main_n <= i_rst_main_n;
xpm_cdc_async_rst
#(
.DEST_SYNC_FF (4),
.INIT_SYNC_FF (0),
.RST_ACTIVE_HIGH (0)
)
CDC_ASYNC_HBM_RST_I
(
.src_arst (rst_main_n ),
.dest_clk (i_clk_hbm_ref ),
.dest_arst (rst_hbm_n )
);
//===================================================================
// Convert AXIL interface from clk_main_a0 to i_clk_hbm_ref domain
//===================================================================
cl_axi_clock_converter_light AXIL_CLK_CNV_I
(
.s_axi_aclk (i_clk_main_a0 ),
.s_axi_aresetn (rst_main_n ),
.s_axi_awaddr (s_axil_ctrl_awaddr ),
.s_axi_awprot (3'd0 ),
.s_axi_awvalid (s_axil_ctrl_awvalid ),
.s_axi_awready (s_axil_ctrl_awready ),
.s_axi_wdata (s_axil_ctrl_wdata ),
.s_axi_wstrb (s_axil_ctrl_wstrb ),
.s_axi_wvalid (s_axil_ctrl_wvalid ),
.s_axi_wready (s_axil_ctrl_wready ),
.s_axi_bresp (s_axil_ctrl_bresp ),
.s_axi_bvalid (s_axil_ctrl_bvalid ),
.s_axi_bready (s_axil_ctrl_bready ),
.s_axi_araddr (s_axil_ctrl_araddr ),
.s_axi_arprot (3'd0 ),
.s_axi_arvalid (s_axil_ctrl_arvalid ),
.s_axi_arready (s_axil_ctrl_arready ),
.s_axi_rdata (s_axil_ctrl_rdata ),
.s_axi_rresp (s_axil_ctrl_rresp ),
.s_axi_rvalid (s_axil_ctrl_rvalid ),
.s_axi_rready (s_axil_ctrl_rready ),
.m_axi_aclk (i_clk_hbm_ref ),
.m_axi_aresetn (rst_hbm_n ),
.m_axi_awaddr (hclk_axil_awaddr ),
.m_axi_awprot ( ),
.m_axi_awvalid (hclk_axil_awvalid ),
.m_axi_awready (hclk_axil_awready ),
.m_axi_wdata (hclk_axil_wdata ),
.m_axi_wstrb (hclk_axil_wstrb ),
.m_axi_wvalid (hclk_axil_wvalid ),
.m_axi_wready (hclk_axil_wready ),
.m_axi_bresp (hclk_axil_bresp ),
.m_axi_bvalid (hclk_axil_bvalid ),
.m_axi_bready (hclk_axil_bready ),
.m_axi_araddr (hclk_axil_araddr ),
.m_axi_arprot ( ),
.m_axi_arvalid (hclk_axil_arvalid ),
.m_axi_arready (hclk_axil_arready ),
.m_axi_rdata (hclk_axil_rdata ),
.m_axi_rresp (hclk_axil_rresp ),
.m_axi_rvalid (hclk_axil_rvalid ),
.m_axi_rready (hclk_axil_rready )
);
//===================================================================
// AXIL XBAR address range:
// 0x5_0000 - 0x5_0FFF : BASE_B
// 0x5_1000 - 0x5_1FFF : BASE_C
// 0x5_2000 - 0x5_2FFF : BASE_A
// 0x5_4000 - 0x5_4FFF : BASE_HBM
// 0x5_8000 - 0x5_8FFF : BASE_REG
//
//===================================================================
cl_clk_axil_xbar AXIL_XBAR_I
(
.aclk (i_clk_hbm_ref ),
.aresetn (rst_hbm_n ),
.s_axi_awaddr (hclk_axil_awaddr ),
.s_axi_awprot (3'd0 ),
.s_axi_awvalid (hclk_axil_awvalid ),
.s_axi_awready (hclk_axil_awready ),
.s_axi_wdata (hclk_axil_wdata ),
.s_axi_wstrb (hclk_axil_wstrb ),
.s_axi_wvalid (hclk_axil_wvalid ),
.s_axi_wready (hclk_axil_wready ),
.s_axi_bresp (hclk_axil_bresp ),
.s_axi_bvalid (hclk_axil_bvalid ),
.s_axi_bready (hclk_axil_bready ),
.s_axi_araddr (hclk_axil_araddr ),
.s_axi_arprot (3'd0 ),
.s_axi_arvalid (hclk_axil_arvalid ),
.s_axi_arready (hclk_axil_arready ),
.s_axi_rdata (hclk_axil_rdata ),
.s_axi_rresp (hclk_axil_rresp ),
.s_axi_rvalid (hclk_axil_rvalid ),
.s_axi_rready (hclk_axil_rready ),
.m_axi_awaddr ({base_reg_axil.awaddr , base_hbm_axil.awaddr , base_a_axil.awaddr , base_c_axil.awaddr , base_b_axil.awaddr }),
.m_axi_awprot ( ),
.m_axi_awvalid ({base_reg_axil.awvalid , base_hbm_axil.awvalid , base_a_axil.awvalid , base_c_axil.awvalid , base_b_axil.awvalid }),
.m_axi_awready ({base_reg_axil.awready , base_hbm_axil.awready , base_a_axil.awready , base_c_axil.awready , base_b_axil.awready }),
.m_axi_wdata ({base_reg_axil.wdata , base_hbm_axil.wdata , base_a_axil.wdata , base_c_axil.wdata , base_b_axil.wdata }),
.m_axi_wstrb ({base_reg_axil.wstrb , base_hbm_axil.wstrb , base_a_axil.wstrb , base_c_axil.wstrb , base_b_axil.wstrb }),
.m_axi_wvalid ({base_reg_axil.wvalid , base_hbm_axil.wvalid , base_a_axil.wvalid , base_c_axil.wvalid , base_b_axil.wvalid }),
.m_axi_wready ({base_reg_axil.wready , base_hbm_axil.wready , base_a_axil.wready , base_c_axil.wready , base_b_axil.wready }),
.m_axi_bresp ({base_reg_axil.bresp , base_hbm_axil.bresp , base_a_axil.bresp , base_c_axil.bresp , base_b_axil.bresp }),
.m_axi_bvalid ({base_reg_axil.bvalid , base_hbm_axil.bvalid , base_a_axil.bvalid , base_c_axil.bvalid , base_b_axil.bvalid }),
.m_axi_bready ({base_reg_axil.bready , base_hbm_axil.bready , base_a_axil.bready , base_c_axil.bready , base_b_axil.bready }),
.m_axi_araddr ({base_reg_axil.araddr , base_hbm_axil.araddr , base_a_axil.araddr , base_c_axil.araddr , base_b_axil.araddr }),
.m_axi_arprot ( ),
.m_axi_arvalid ({base_reg_axil.arvalid , base_hbm_axil.arvalid , base_a_axil.arvalid , base_c_axil.arvalid , base_b_axil.arvalid }),
.m_axi_arready ({base_reg_axil.arready , base_hbm_axil.arready , base_a_axil.arready , base_c_axil.arready , base_b_axil.arready }),
.m_axi_rdata ({base_reg_axil.rdata , base_hbm_axil.rdata , base_a_axil.rdata , base_c_axil.rdata , base_b_axil.rdata }),
.m_axi_rresp ({base_reg_axil.rresp , base_hbm_axil.rresp , base_a_axil.rresp , base_c_axil.rresp , base_b_axil.rresp }),
.m_axi_rvalid ({base_reg_axil.rvalid , base_hbm_axil.rvalid , base_a_axil.rvalid , base_c_axil.rvalid , base_b_axil.rvalid }),
.m_axi_rready ({base_reg_axil.rready , base_hbm_axil.rready , base_a_axil.rready , base_c_axil.rready , base_b_axil.rready })
);
//===================================================================
// Reg Slice for each AXI-Lite interface
//===================================================================
st_axil_cctrl base_a_axil_q;
st_axil_cctrl base_b_axil_q;
st_axil_cctrl base_c_axil_q;
st_axil_cctrl base_hbm_axil_q;
st_axil_cctrl base_reg_axil_q;
// BASE_A
cl_axi_register_slice_light SLICE_AXIL_A
(
.aclk (i_clk_hbm_ref ),
.aresetn (rst_hbm_n ),
.s_axi_awaddr (base_a_axil.awaddr ),
.s_axi_awvalid (base_a_axil.awvalid ),
.s_axi_awready (base_a_axil.awready ),
.s_axi_wdata (base_a_axil.wdata ),
.s_axi_wstrb (base_a_axil.wstrb ),
.s_axi_wvalid (base_a_axil.wvalid ),
.s_axi_wready (base_a_axil.wready ),
.s_axi_bresp (base_a_axil.bresp ),
.s_axi_bvalid (base_a_axil.bvalid ),
.s_axi_bready (base_a_axil.bready ),
.s_axi_araddr (base_a_axil.araddr ),
.s_axi_arvalid (base_a_axil.arvalid ),
.s_axi_arready (base_a_axil.arready ),
.s_axi_rdata (base_a_axil.rdata ),
.s_axi_rresp (base_a_axil.rresp ),
.s_axi_rvalid (base_a_axil.rvalid ),
.s_axi_rready (base_a_axil.rready ),
.m_axi_awaddr (base_a_axil_q.awaddr ),
.m_axi_awvalid (base_a_axil_q.awvalid ),
.m_axi_awready (base_a_axil_q.awready ),
.m_axi_wdata (base_a_axil_q.wdata ),
.m_axi_wstrb (base_a_axil_q.wstrb ),
.m_axi_wvalid (base_a_axil_q.wvalid ),
.m_axi_wready (base_a_axil_q.wready ),
.m_axi_bresp (base_a_axil_q.bresp ),
.m_axi_bvalid (base_a_axil_q.bvalid ),
.m_axi_bready (base_a_axil_q.bready ),
.m_axi_araddr (base_a_axil_q.araddr ),
.m_axi_arvalid (base_a_axil_q.arvalid ),
.m_axi_arready (base_a_axil_q.arready ),
.m_axi_rdata (base_a_axil_q.rdata ),
.m_axi_rresp (base_a_axil_q.rresp ),
.m_axi_rvalid (base_a_axil_q.rvalid ),
.m_axi_rready (base_a_axil_q.rready )
);
// BASE_B
cl_axi_register_slice_light SLICE_AXIL_B
(
.aclk (i_clk_hbm_ref ),
.aresetn (rst_hbm_n ),
.s_axi_awaddr (base_b_axil.awaddr ),
.s_axi_awvalid (base_b_axil.awvalid ),
.s_axi_awready (base_b_axil.awready ),
.s_axi_wdata (base_b_axil.wdata ),
.s_axi_wstrb (base_b_axil.wstrb ),
.s_axi_wvalid (base_b_axil.wvalid ),
.s_axi_wready (base_b_axil.wready ),
.s_axi_bresp (base_b_axil.bresp ),
.s_axi_bvalid (base_b_axil.bvalid ),
.s_axi_bready (base_b_axil.bready ),
.s_axi_araddr (base_b_axil.araddr ),
.s_axi_arvalid (base_b_axil.arvalid ),
.s_axi_arready (base_b_axil.arready ),
.s_axi_rdata (base_b_axil.rdata ),
.s_axi_rresp (base_b_axil.rresp ),
.s_axi_rvalid (base_b_axil.rvalid ),
.s_axi_rready (base_b_axil.rready ),
.m_axi_awaddr (base_b_axil_q.awaddr ),
.m_axi_awvalid (base_b_axil_q.awvalid ),
.m_axi_awready (base_b_axil_q.awready ),
.m_axi_wdata (base_b_axil_q.wdata ),
.m_axi_wstrb (base_b_axil_q.wstrb ),
.m_axi_wvalid (base_b_axil_q.wvalid ),
.m_axi_wready (base_b_axil_q.wready ),
.m_axi_bresp (base_b_axil_q.bresp ),
.m_axi_bvalid (base_b_axil_q.bvalid ),
.m_axi_bready (base_b_axil_q.bready ),
.m_axi_araddr (base_b_axil_q.araddr ),
.m_axi_arvalid (base_b_axil_q.arvalid ),
.m_axi_arready (base_b_axil_q.arready ),
.m_axi_rdata (base_b_axil_q.rdata ),
.m_axi_rresp (base_b_axil_q.rresp ),
.m_axi_rvalid (base_b_axil_q.rvalid ),
.m_axi_rready (base_b_axil_q.rready )
);
// BASE_C
cl_axi_register_slice_light SLICE_AXIL_C
(
.aclk (i_clk_hbm_ref ),
.aresetn (rst_hbm_n ),
.s_axi_awaddr (base_c_axil.awaddr ),
.s_axi_awvalid (base_c_axil.awvalid ),
.s_axi_awready (base_c_axil.awready ),
.s_axi_wdata (base_c_axil.wdata ),
.s_axi_wstrb (base_c_axil.wstrb ),
.s_axi_wvalid (base_c_axil.wvalid ),
.s_axi_wready (base_c_axil.wready ),
.s_axi_bresp (base_c_axil.bresp ),
.s_axi_bvalid (base_c_axil.bvalid ),
.s_axi_bready (base_c_axil.bready ),
.s_axi_araddr (base_c_axil.araddr ),
.s_axi_arvalid (base_c_axil.arvalid ),
.s_axi_arready (base_c_axil.arready ),
.s_axi_rdata (base_c_axil.rdata ),
.s_axi_rresp (base_c_axil.rresp ),
.s_axi_rvalid (base_c_axil.rvalid ),
.s_axi_rready (base_c_axil.rready ),
.m_axi_awaddr (base_c_axil_q.awaddr ),
.m_axi_awvalid (base_c_axil_q.awvalid ),
.m_axi_awready (base_c_axil_q.awready ),
.m_axi_wdata (base_c_axil_q.wdata ),
.m_axi_wstrb (base_c_axil_q.wstrb ),
.m_axi_wvalid (base_c_axil_q.wvalid ),
.m_axi_wready (base_c_axil_q.wready ),
.m_axi_bresp (base_c_axil_q.bresp ),
.m_axi_bvalid (base_c_axil_q.bvalid ),
.m_axi_bready (base_c_axil_q.bready ),
.m_axi_araddr (base_c_axil_q.araddr ),
.m_axi_arvalid (base_c_axil_q.arvalid ),
.m_axi_arready (base_c_axil_q.arready ),
.m_axi_rdata (base_c_axil_q.rdata ),
.m_axi_rresp (base_c_axil_q.rresp ),
.m_axi_rvalid (base_c_axil_q.rvalid ),
.m_axi_rready (base_c_axil_q.rready )
);
// BASE_HBM
cl_axi_register_slice_light SLICE_AXIL_HBM
(
.aclk (i_clk_hbm_ref ),
.aresetn (rst_hbm_n ),
.s_axi_awaddr (base_hbm_axil.awaddr ),
.s_axi_awvalid (base_hbm_axil.awvalid ),
.s_axi_awready (base_hbm_axil.awready ),
.s_axi_wdata (base_hbm_axil.wdata ),
.s_axi_wstrb (base_hbm_axil.wstrb ),
.s_axi_wvalid (base_hbm_axil.wvalid ),
.s_axi_wready (base_hbm_axil.wready ),
.s_axi_bresp (base_hbm_axil.bresp ),
.s_axi_bvalid (base_hbm_axil.bvalid ),
.s_axi_bready (base_hbm_axil.bready ),
.s_axi_araddr (base_hbm_axil.araddr ),
.s_axi_arvalid (base_hbm_axil.arvalid ),
.s_axi_arready (base_hbm_axil.arready ),
.s_axi_rdata (base_hbm_axil.rdata ),
.s_axi_rresp (base_hbm_axil.rresp ),
.s_axi_rvalid (base_hbm_axil.rvalid ),
.s_axi_rready (base_hbm_axil.rready ),
.m_axi_awaddr (base_hbm_axil_q.awaddr ),
.m_axi_awvalid (base_hbm_axil_q.awvalid ),
.m_axi_awready (base_hbm_axil_q.awready ),
.m_axi_wdata (base_hbm_axil_q.wdata ),
.m_axi_wstrb (base_hbm_axil_q.wstrb ),
.m_axi_wvalid (base_hbm_axil_q.wvalid ),
.m_axi_wready (base_hbm_axil_q.wready ),
.m_axi_bresp (base_hbm_axil_q.bresp ),
.m_axi_bvalid (base_hbm_axil_q.bvalid ),
.m_axi_bready (base_hbm_axil_q.bready ),
.m_axi_araddr (base_hbm_axil_q.araddr ),
.m_axi_arvalid (base_hbm_axil_q.arvalid ),
.m_axi_arready (base_hbm_axil_q.arready ),
.m_axi_rdata (base_hbm_axil_q.rdata ),
.m_axi_rresp (base_hbm_axil_q.rresp ),
.m_axi_rvalid (base_hbm_axil_q.rvalid ),
.m_axi_rready (base_hbm_axil_q.rready )
);
// BASE_REG
cl_axi_register_slice_light SLICE_AXIL_REG
(
.aclk (i_clk_hbm_ref ),
.aresetn (rst_hbm_n ),
.s_axi_awaddr (base_reg_axil.awaddr ),
.s_axi_awvalid (base_reg_axil.awvalid ),
.s_axi_awready (base_reg_axil.awready ),
.s_axi_wdata (base_reg_axil.wdata ),
.s_axi_wstrb (base_reg_axil.wstrb ),
.s_axi_wvalid (base_reg_axil.wvalid ),
.s_axi_wready (base_reg_axil.wready ),
.s_axi_bresp (base_reg_axil.bresp ),
.s_axi_bvalid (base_reg_axil.bvalid ),
.s_axi_bready (base_reg_axil.bready ),
.s_axi_araddr (base_reg_axil.araddr ),
.s_axi_arvalid (base_reg_axil.arvalid ),
.s_axi_arready (base_reg_axil.arready ),
.s_axi_rdata (base_reg_axil.rdata ),
.s_axi_rresp (base_reg_axil.rresp ),
.s_axi_rvalid (base_reg_axil.rvalid ),
.s_axi_rready (base_reg_axil.rready ),
.m_axi_awaddr (base_reg_axil_q.awaddr ),
.m_axi_awvalid (base_reg_axil_q.awvalid ),
.m_axi_awready (base_reg_axil_q.awready ),
.m_axi_wdata (base_reg_axil_q.wdata ),
.m_axi_wstrb (base_reg_axil_q.wstrb ),
.m_axi_wvalid (base_reg_axil_q.wvalid ),
.m_axi_wready (base_reg_axil_q.wready ),
.m_axi_bresp (base_reg_axil_q.bresp ),
.m_axi_bvalid (base_reg_axil_q.bvalid ),
.m_axi_bready (base_reg_axil_q.bready ),
.m_axi_araddr (base_reg_axil_q.araddr ),
.m_axi_arvalid (base_reg_axil_q.arvalid ),
.m_axi_arready (base_reg_axil_q.arready ),
.m_axi_rdata (base_reg_axil_q.rdata ),
.m_axi_rresp (base_reg_axil_q.rresp ),
.m_axi_rvalid (base_reg_axil_q.rvalid ),
.m_axi_rready (base_reg_axil_q.rready )
);
//===================================================================
// MMCM_A
//===================================================================
logic mmcm_a_locked;
if (CLK_GRP_A_EN) begin : CLK_GRP_A_EN_I //{
clk_mmcm_a CLK_MMCM_A_I
(
.s_axi_aclk (i_clk_hbm_ref ),
.s_axi_aresetn (rst_hbm_n ),
.s_axi_awaddr (base_a_axil_q.awaddr ),
.s_axi_awvalid (base_a_axil_q.awvalid ),
.s_axi_awready (base_a_axil_q.awready ),
.s_axi_wdata (base_a_axil_q.wdata ),
.s_axi_wstrb (base_a_axil_q.wstrb ),
.s_axi_wvalid (base_a_axil_q.wvalid ),
.s_axi_wready (base_a_axil_q.wready ),
.s_axi_bresp (base_a_axil_q.bresp ),
.s_axi_bvalid (base_a_axil_q.bvalid ),
.s_axi_bready (base_a_axil_q.bready ),
.s_axi_araddr (base_a_axil_q.araddr ),
.s_axi_arvalid (base_a_axil_q.arvalid ),
.s_axi_arready (base_a_axil_q.arready ),
.s_axi_rdata (base_a_axil_q.rdata ),
.s_axi_rresp (base_a_axil_q.rresp ),
.s_axi_rvalid (base_a_axil_q.rvalid ),
.s_axi_rready (base_a_axil_q.rready ),
.clk_out1 (o_clk_extra_a1 ),
.clk_out2 (o_clk_extra_a2 ),
.clk_out3 (o_clk_extra_a3 ),
.locked (mmcm_a_locked ),
.clk_in1 (i_clk_hbm_ref )
);
end : CLK_GRP_A_EN_I //}
else begin : NO_CLK_GRP_A_EN_I //{
always_comb begin
base_a_axil_q.awready = '0;
base_a_axil_q.wready = '0;
base_a_axil_q.bresp = '0;
base_a_axil_q.bvalid = '0;
base_a_axil_q.arready = '0;
base_a_axil_q.rdata = '0;
base_a_axil_q.rresp = '0;
base_a_axil_q.rvalid = '0;
o_clk_extra_a1 = '0;
o_clk_extra_a2 = '0;
o_clk_extra_a3 = '0;
mmcm_a_locked = '0;
end
end : NO_CLK_GRP_A_EN_I //}
//===================================================================
// MMCM_B
//===================================================================
logic mmcm_b_locked;
if (CLK_GRP_B_EN) begin : CLK_GRP_B_EN_I //{
clk_mmcm_b CLK_MMCM_B_I
(
.s_axi_aclk (i_clk_hbm_ref ),
.s_axi_aresetn (rst_hbm_n ),
.s_axi_awaddr (base_b_axil_q.awaddr ),
.s_axi_awvalid (base_b_axil_q.awvalid ),
.s_axi_awready (base_b_axil_q.awready ),
.s_axi_wdata (base_b_axil_q.wdata ),
.s_axi_wstrb (base_b_axil_q.wstrb ),
.s_axi_wvalid (base_b_axil_q.wvalid ),
.s_axi_wready (base_b_axil_q.wready ),
.s_axi_bresp (base_b_axil_q.bresp ),
.s_axi_bvalid (base_b_axil_q.bvalid ),
.s_axi_bready (base_b_axil_q.bready ),
.s_axi_araddr (base_b_axil_q.araddr ),
.s_axi_arvalid (base_b_axil_q.arvalid ),
.s_axi_arready (base_b_axil_q.arready ),
.s_axi_rdata (base_b_axil_q.rdata ),
.s_axi_rresp (base_b_axil_q.rresp ),
.s_axi_rvalid (base_b_axil_q.rvalid ),
.s_axi_rready (base_b_axil_q.rready ),
.clk_out1 (o_clk_extra_b0 ),
.clk_out2 (o_clk_extra_b1 ),
.locked (mmcm_b_locked ),
.clk_in1 (i_clk_hbm_ref )
);
end : CLK_GRP_B_EN_I //}
else begin : NO_CLK_GRP_B_EN_I //{
always_comb begin
base_b_axil_q.awready = '0;
base_b_axil_q.wready = '0;
base_b_axil_q.bresp = '0;
base_b_axil_q.bvalid = '0;
base_b_axil_q.arready = '0;
base_b_axil_q.rdata = '0;
base_b_axil_q.rresp = '0;
base_b_axil_q.rvalid = '0;
o_clk_extra_b0 = '0;
o_clk_extra_b1 = '0;
mmcm_b_locked = '0;
end
end : NO_CLK_GRP_B_EN_I //}
//===================================================================
// MMCM_C
//===================================================================
logic mmcm_c_locked;
if (CLK_GRP_C_EN) begin : CLK_GRP_C_EN_I //{
clk_mmcm_c CLK_MMCM_C_I
(
.s_axi_aclk (i_clk_hbm_ref ),
.s_axi_aresetn (rst_hbm_n ),
.s_axi_awaddr (base_c_axil_q.awaddr ),
.s_axi_awvalid (base_c_axil_q.awvalid ),
.s_axi_awready (base_c_axil_q.awready ),
.s_axi_wdata (base_c_axil_q.wdata ),
.s_axi_wstrb (base_c_axil_q.wstrb ),
.s_axi_wvalid (base_c_axil_q.wvalid ),
.s_axi_wready (base_c_axil_q.wready ),
.s_axi_bresp (base_c_axil_q.bresp ),
.s_axi_bvalid (base_c_axil_q.bvalid ),
.s_axi_bready (base_c_axil_q.bready ),
.s_axi_araddr (base_c_axil_q.araddr ),
.s_axi_arvalid (base_c_axil_q.arvalid ),
.s_axi_arready (base_c_axil_q.arready ),
.s_axi_rdata (base_c_axil_q.rdata ),
.s_axi_rresp (base_c_axil_q.rresp ),
.s_axi_rvalid (base_c_axil_q.rvalid ),
.s_axi_rready (base_c_axil_q.rready ),
.clk_out1 (o_clk_extra_c0 ),
.clk_out2 (o_clk_extra_c1 ),
.locked (mmcm_c_locked ),
.clk_in1 (i_clk_hbm_ref )
);
end : CLK_GRP_C_EN_I //}
else begin : NO_CLK_GRP_C_EN_I //{
always_comb begin
base_c_axil_q.awready = '0;
base_c_axil_q.wready = '0;
base_c_axil_q.bresp = '0;
base_c_axil_q.bvalid = '0;
base_c_axil_q.arready = '0;
base_c_axil_q.rdata = '0;
base_c_axil_q.rresp = '0;
base_c_axil_q.rvalid = '0;
o_clk_extra_c0 = '0;
o_clk_extra_c1 = '0;
mmcm_c_locked = '0;
end
end : NO_CLK_GRP_C_EN_I //}
//===================================================================
// MMCM_HBM
//===================================================================
logic mmcm_hbm_locked;
if (CLK_HBM_EN) begin : CLK_HBM_EN_I //{
clk_mmcm_hbm CLK_MMCM_HBM_I
(
.s_axi_aclk (i_clk_hbm_ref ),
.s_axi_aresetn (rst_hbm_n ),
.s_axi_awaddr (base_hbm_axil_q.awaddr ),
.s_axi_awvalid (base_hbm_axil_q.awvalid ),
.s_axi_awready (base_hbm_axil_q.awready ),
.s_axi_wdata (base_hbm_axil_q.wdata ),
.s_axi_wstrb (base_hbm_axil_q.wstrb ),
.s_axi_wvalid (base_hbm_axil_q.wvalid ),
.s_axi_wready (base_hbm_axil_q.wready ),
.s_axi_bresp (base_hbm_axil_q.bresp ),
.s_axi_bvalid (base_hbm_axil_q.bvalid ),
.s_axi_bready (base_hbm_axil_q.bready ),
.s_axi_araddr (base_hbm_axil_q.araddr ),
.s_axi_arvalid (base_hbm_axil_q.arvalid ),
.s_axi_arready (base_hbm_axil_q.arready ),
.s_axi_rdata (base_hbm_axil_q.rdata ),
.s_axi_rresp (base_hbm_axil_q.rresp ),
.s_axi_rvalid (base_hbm_axil_q.rvalid ),
.s_axi_rready (base_hbm_axil_q.rready ),
.clk_out1 (o_clk_hbm_axi ),
.locked (mmcm_hbm_locked ),
.clk_in1 (i_clk_hbm_ref )
);
end : CLK_HBM_EN_I //}
else begin : NO_CLK_HBM_EN_I //{
always_comb begin
base_hbm_axil_q.awready = '0;
base_hbm_axil_q.wready = '0;
base_hbm_axil_q.bresp = '0;
base_hbm_axil_q.bvalid = '0;
base_hbm_axil_q.arready = '0;
base_hbm_axil_q.rdata = '0;
base_hbm_axil_q.rresp = '0;
base_hbm_axil_q.rvalid = '0;
o_clk_hbm_axi = '0;
mmcm_hbm_locked = '0;
end
end : NO_CLK_HBM_EN_I //}
//===================================================================
// pass-through clocks
//===================================================================
assign o_clk_hbm_ref = i_clk_hbm_ref;
assign o_clk_main_a0 = i_clk_main_a0;
//===================================================================
// AWS_REGS
//===================================================================
aws_clk_regs
#(
.CLK_GRP_A_EN (CLK_GRP_A_EN),
.CLK_GRP_B_EN (CLK_GRP_B_EN),
.CLK_GRP_C_EN (CLK_GRP_C_EN),
.CLK_HBM_EN (CLK_HBM_EN ),
.MAX_NUM_CLKS (MAX_NUM_CLKS)
)
AWS_CLK_REGS_I
(
.i_clk (i_clk_hbm_ref ),
.i_rst_n (rst_hbm_n ),
.s_axil_awaddr (base_reg_axil_q.awaddr ),
.s_axil_awvalid (base_reg_axil_q.awvalid ),
.s_axil_awready (base_reg_axil_q.awready ),
.s_axil_wdata (base_reg_axil_q.wdata ),
.s_axil_wstrb (base_reg_axil_q.wstrb ),
.s_axil_wvalid (base_reg_axil_q.wvalid ),
.s_axil_wready (base_reg_axil_q.wready ),
.s_axil_bresp (base_reg_axil_q.bresp ),
.s_axil_bvalid (base_reg_axil_q.bvalid ),
.s_axil_bready (base_reg_axil_q.bready ),
.s_axil_araddr (base_reg_axil_q.araddr ),
.s_axil_arvalid (base_reg_axil_q.arvalid ),
.s_axil_arready (base_reg_axil_q.arready ),
.s_axil_rdata (base_reg_axil_q.rdata ),
.s_axil_rresp (base_reg_axil_q.rresp ),
.s_axil_rvalid (base_reg_axil_q.rvalid ),
.s_axil_rready (base_reg_axil_q.rready ),
.i_mmcm_a_lock (mmcm_a_locked ),
.i_mmcm_b_lock (mmcm_b_locked ),
.i_mmcm_c_lock (mmcm_c_locked ),
.i_mmcm_hbm_lock (mmcm_hbm_locked ),
.o_glbl_rst (glbl_rst ),
.o_cl_rst_hbm_axi_n (cl_rst_n[9] ),
.o_cl_rst_hbm_ref_n (cl_rst_n[8] ),
.o_cl_rst_c1_n (cl_rst_n[7] ),
.o_cl_rst_c0_n (cl_rst_n[6] ),
.o_cl_rst_b1_n (cl_rst_n[5] ),
.o_cl_rst_b0_n (cl_rst_n[4] ),
.o_cl_rst_a3_n (cl_rst_n[3] ),
.o_cl_rst_a2_n (cl_rst_n[2] ),
.o_cl_rst_a1_n (cl_rst_n[1] ),
.o_cl_rst_main_n (cl_rst_n[0] )
);
//===================================================================
// AWS Clock Reset synchronizers
//===================================================================
logic [MAX_NUM_CLKS-1:0] s_clks;
logic [MAX_NUM_CLKS-1:0] sync_rst_out_n;
always_comb begin //{
s_clks = { o_clk_hbm_axi,
o_clk_hbm_ref,
o_clk_extra_c1,
o_clk_extra_c0,
o_clk_extra_b1,
o_clk_extra_b0,
o_clk_extra_a3,
o_clk_extra_a2,
o_clk_extra_a1,
o_clk_main_a0 };
// Output reset synchronized to their clock domain.
{o_cl_rst_hbm_axi_n,
o_cl_rst_hbm_ref_n,
o_cl_rst_c1_n,
o_cl_rst_c0_n,
o_cl_rst_b1_n,
o_cl_rst_b0_n,
o_cl_rst_a3_n,
o_cl_rst_a2_n,
o_cl_rst_a1_n,
o_cl_rst_main_n} = sync_rst_out_n;
end //}
// Instantiate synchronizers
generate //{
for (genvar gg = 0; gg < MAX_NUM_CLKS; gg++) begin : CDC_RST_OUT //{
xpm_cdc_async_rst
#(
.DEST_SYNC_FF (2),
.INIT_SYNC_FF (0),
.RST_ACTIVE_HIGH (0)
)
CDC_ASYNC_RST_OUT_I
(
.src_arst (cl_rst_n[gg] ),
.dest_clk (s_clks[gg] ),
.dest_arst (sync_rst_out_n[gg] )
);
end : CDC_RST_OUT //}
endgenerate //}
endmodule // aws_clk_gen