From 155fac5e072ce68484de1568cb5bcb844deed26d Mon Sep 17 00:00:00 2001 From: Alex Forencich Date: Wed, 11 Mar 2026 02:23:13 -0700 Subject: [PATCH] cndm: Add register to RC path from PCIe HIP to improve timing performance Signed-off-by: Alex Forencich --- src/cndm/rtl/cndm_lite_pcie_us.f | 1 + src/cndm/rtl/cndm_lite_pcie_us.sv | 31 +++++++++++++++++++++++++++++- src/cndm/rtl/cndm_micro_pcie_us.f | 1 + src/cndm/rtl/cndm_micro_pcie_us.sv | 31 +++++++++++++++++++++++++++++- 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/cndm/rtl/cndm_lite_pcie_us.f b/src/cndm/rtl/cndm_lite_pcie_us.f index 0075f39..300a674 100644 --- a/src/cndm/rtl/cndm_lite_pcie_us.f +++ b/src/cndm/rtl/cndm_lite_pcie_us.f @@ -1,5 +1,6 @@ cndm_lite_pcie_us.sv cndm_lite_core.f +../lib/taxi/src/axis/rtl/taxi_axis_register.sv ../lib/taxi/src/pcie/rtl/taxi_pcie_us_axil_master.sv ../lib/taxi/src/pcie/rtl/taxi_pcie_us_msi.sv ../lib/taxi/src/pcie/rtl/taxi_pcie_us_cfg.sv diff --git a/src/cndm/rtl/cndm_lite_pcie_us.sv b/src/cndm/rtl/cndm_lite_pcie_us.sv index 04c9c53..b263a61 100644 --- a/src/cndm/rtl/cndm_lite_pcie_us.sv +++ b/src/cndm/rtl/cndm_lite_pcie_us.sv @@ -318,6 +318,35 @@ always_ff @(posedge pcie_clk) begin end end +// Register on RC path to break timing paths from PCIe HIP +// The HIP commonly has some combination of long clock-to-output delays +// and/or a 500 MHz to 250 MHz multicycle path +taxi_axis_if #( + .DATA_W(s_axis_pcie_rc.DATA_W), + .KEEP_EN(1), + .KEEP_W(s_axis_pcie_rc.KEEP_W), + .USER_EN(1), + .USER_W(s_axis_pcie_rc.USER_W) +) axis_pcie_rc_int(); + +taxi_axis_register #( + .REG_TYPE(2) +) +rc_reg_inst ( + .clk(pcie_clk), + .rst(pcie_rst), + + /* + * AXI4-Stream input (sink) + */ + .s_axis(s_axis_pcie_rc), + + /* + * AXI4-Stream output (source) + */ + .m_axis(axis_pcie_rc_int) +); + taxi_dma_if_pcie_us #( .RQ_SEQ_NUM_W(RQ_SEQ_NUM_W), .RQ_SEQ_NUM_EN(RQ_SEQ_NUM_EN), @@ -339,7 +368,7 @@ dma_if_inst ( * UltraScale PCIe interface */ .m_axis_rq(m_axis_pcie_rq), - .s_axis_rc(s_axis_pcie_rc), + .s_axis_rc(axis_pcie_rc_int), /* * Transmit sequence number input diff --git a/src/cndm/rtl/cndm_micro_pcie_us.f b/src/cndm/rtl/cndm_micro_pcie_us.f index 821da12..effaa19 100644 --- a/src/cndm/rtl/cndm_micro_pcie_us.f +++ b/src/cndm/rtl/cndm_micro_pcie_us.f @@ -1,5 +1,6 @@ cndm_micro_pcie_us.sv cndm_micro_core.f +../lib/taxi/src/axis/rtl/taxi_axis_register.sv ../lib/taxi/src/pcie/rtl/taxi_pcie_us_axil_master.sv ../lib/taxi/src/pcie/rtl/taxi_pcie_us_msi.sv ../lib/taxi/src/pcie/rtl/taxi_pcie_us_cfg.sv diff --git a/src/cndm/rtl/cndm_micro_pcie_us.sv b/src/cndm/rtl/cndm_micro_pcie_us.sv index bd52aed..3749d13 100644 --- a/src/cndm/rtl/cndm_micro_pcie_us.sv +++ b/src/cndm/rtl/cndm_micro_pcie_us.sv @@ -318,6 +318,35 @@ always_ff @(posedge pcie_clk) begin end end +// Register on RC path to break timing paths from PCIe HIP +// The HIP commonly has some combination of long clock-to-output delays +// and/or a 500 MHz to 250 MHz multicycle path +taxi_axis_if #( + .DATA_W(s_axis_pcie_rc.DATA_W), + .KEEP_EN(1), + .KEEP_W(s_axis_pcie_rc.KEEP_W), + .USER_EN(1), + .USER_W(s_axis_pcie_rc.USER_W) +) axis_pcie_rc_int(); + +taxi_axis_register #( + .REG_TYPE(2) +) +rc_reg_inst ( + .clk(pcie_clk), + .rst(pcie_rst), + + /* + * AXI4-Stream input (sink) + */ + .s_axis(s_axis_pcie_rc), + + /* + * AXI4-Stream output (source) + */ + .m_axis(axis_pcie_rc_int) +); + taxi_dma_if_pcie_us #( .RQ_SEQ_NUM_W(RQ_SEQ_NUM_W), .RQ_SEQ_NUM_EN(RQ_SEQ_NUM_EN), @@ -339,7 +368,7 @@ dma_if_inst ( * UltraScale PCIe interface */ .m_axis_rq(m_axis_pcie_rq), - .s_axis_rc(s_axis_pcie_rc), + .s_axis_rc(axis_pcie_rc_int), /* * Transmit sequence number input