From cb3538a0de613236d6998609f6644b72699b0b9c Mon Sep 17 00:00:00 2001 From: Alex Forencich Date: Mon, 15 Dec 2025 20:21:24 -0800 Subject: [PATCH] dma: Add interface configuration checks to DMA PSDPRAM module Signed-off-by: Alex Forencich --- src/dma/rtl/taxi_dma_psdpram.sv | 11 +++++++++-- src/dma/rtl/taxi_dma_psdpram_async.sv | 11 +++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/dma/rtl/taxi_dma_psdpram.sv b/src/dma/rtl/taxi_dma_psdpram.sv index 6189740..e06e15a 100644 --- a/src/dma/rtl/taxi_dma_psdpram.sv +++ b/src/dma/rtl/taxi_dma_psdpram.sv @@ -37,6 +37,7 @@ module taxi_dma_psdpram # taxi_dma_ram_if.rd_slv dma_ram_rd ); +// extract parameters localparam SEGS = dma_ram_wr.SEGS; localparam SEG_ADDR_W = dma_ram_wr.SEG_ADDR_W; localparam SEG_DATA_W = dma_ram_wr.SEG_DATA_W; @@ -45,8 +46,14 @@ localparam SEG_BE_W = dma_ram_wr.SEG_BE_W; localparam INT_ADDR_W = $clog2(SIZE/(SEGS*SEG_BE_W)); // check configuration -if (SEG_ADDR_W < INT_ADDR_W) - $fatal(0, "Error: SEG_ADDR_W not sufficient for requested size (min %d for size %d) (instance %m)", INT_ADDR_W, SIZE); +if (dma_ram_wr.SEG_ADDR_W < INT_ADDR_W) + $fatal(0, "Error: dma_ram_wr.SEG_ADDR_W not sufficient for requested size (min %d for size %d) (instance %m)", INT_ADDR_W, SIZE); + +if (dma_ram_rd.SEG_ADDR_W < INT_ADDR_W) + $fatal(0, "Error: dma_ram_wr.SEG_ADDR_W not sufficient for requested size (min %d for size %d) (instance %m)", INT_ADDR_W, SIZE); + +if (SEGS != dma_ram_rd.SEGS || SEG_DATA_W != dma_ram_rd.SEG_DATA_W) + $fatal(0, "Error: Interface segment configuration mismatch (instance %m)"); for (genvar n = 0; n < SEGS; n = n + 1) begin diff --git a/src/dma/rtl/taxi_dma_psdpram_async.sv b/src/dma/rtl/taxi_dma_psdpram_async.sv index 55c6e0c..25648d8 100644 --- a/src/dma/rtl/taxi_dma_psdpram_async.sv +++ b/src/dma/rtl/taxi_dma_psdpram_async.sv @@ -38,6 +38,7 @@ module taxi_dma_psdpram_async # taxi_dma_ram_if.rd_slv dma_ram_rd ); +// extract parameters localparam SEGS = dma_ram_wr.SEGS; localparam SEG_ADDR_W = dma_ram_wr.SEG_ADDR_W; localparam SEG_DATA_W = dma_ram_wr.SEG_DATA_W; @@ -46,8 +47,14 @@ localparam SEG_BE_W = dma_ram_wr.SEG_BE_W; localparam INT_ADDR_W = $clog2(SIZE/(SEGS*SEG_BE_W)); // check configuration -if (SEG_ADDR_W < INT_ADDR_W) - $fatal(0, "Error: SEG_ADDR_W not sufficient for requested size (min %d for size %d) (instance %m)", INT_ADDR_W, SIZE); +if (dma_ram_wr.SEG_ADDR_W < INT_ADDR_W) + $fatal(0, "Error: dma_ram_wr.SEG_ADDR_W not sufficient for requested size (min %d for size %d) (instance %m)", INT_ADDR_W, SIZE); + +if (dma_ram_rd.SEG_ADDR_W < INT_ADDR_W) + $fatal(0, "Error: dma_ram_wr.SEG_ADDR_W not sufficient for requested size (min %d for size %d) (instance %m)", INT_ADDR_W, SIZE); + +if (SEGS != dma_ram_rd.SEGS || SEG_DATA_W != dma_ram_rd.SEG_DATA_W) + $fatal(0, "Error: Interface segment configuration mismatch (instance %m)"); for (genvar n = 0; n < SEGS; n = n + 1) begin