uhd/fpga/usrp3/top/x400/regmap/XmlSvPkgDIG_IFC_REGMAP.sv
Max Becker e6470cf8ce fpga: x4xx: Extend GPIO SPI support
Extend GPIO SPI transactions up to 64 bits and update the X4xx FPGA
register map and RTL to support the new access width.
Migrate the GPIO SPI register definitions to SystemVerilog.

Add testbench for X4xx GPIO SPI module covering both exisiting
32bit functionality and added 64bit functionality.
Separate TB Makefiles for X4xx and X410 implementation variant.

Bump the FPGA compatibility number so host and MPM software can reject
images that do not provide the required GPIO SPI register interface.
2026-09-29 13:12:32 +02:00

164 lines
7.6 KiB
Systemverilog

//-----------------------------------------------------------------------------
// File: XmlSvPkgDIG_IFC_REGMAP.sv
// Author: Autogenerated by XmlParse
// Original Project: --
// Date: --
//-----------------------------------------------------------------------------
// (c) 2026 National Instruments Corporation. All Rights Reserved.
//-----------------------------------------------------------------------------
// Purpose:
// The constants in this file are autogenerated by XmlParse.
//-----------------------------------------------------------------------------
package XmlSvPkgDIG_IFC_REGMAP;
//===============================================================================
// A numerically ordered list of registers and their HDL source files
//===============================================================================
// SPI_SLAVE_CONFIG : 0x0 (x4xx_gpio_spi.sv)
// SPI_TRANSACTION_CONFIG : 0x10 (x4xx_gpio_spi.sv)
// SPI_TRANSACTION_LSB : 0x14 (x4xx_gpio_spi.sv)
// SPI_TRANSACTION_GO : 0x18 (x4xx_gpio_spi.sv)
// SPI_STATUS : 0x1C (x4xx_gpio_spi.sv)
// SPI_FULL_RESPONSE_MSB : 0x20 (x4xx_gpio_spi.sv)
// CONTROLLER_INFO : 0x24 (x4xx_gpio_spi.sv)
//===============================================================================
// Register Group SPI_OVER_GPIO_REGS
//===============================================================================
// SPI_SLAVE_CONFIG Register (from x4xx_gpio_spi.sv)
localparam kSPI_SLAVE_CONFIGCount = 4; // Number of elements in array
// SPI_TRANSACTION_CONFIG Register (from x4xx_gpio_spi.sv)
localparam kSPI_TRANSACTION_CONFIG = 'h10; // Register Offset
localparam kSPI_TRANSACTION_CONFIGSize = 32; // register width in bits
localparam kSPI_TRANSACTION_CONFIGMask = 32'h3FFFF;
localparam kSPI_CLK_DIVSize = 16; //SPI_TRANSACTION_CONFIG:SPI_CLK_DIV
localparam kSPI_CLK_DIVMsb = 15; //SPI_TRANSACTION_CONFIG:SPI_CLK_DIV
localparam kSPI_CLK_DIV = 0; //SPI_TRANSACTION_CONFIG:SPI_CLK_DIV
localparam kSPI_SLAVE_SELECTSize = 2; //SPI_TRANSACTION_CONFIG:SPI_SLAVE_SELECT
localparam kSPI_SLAVE_SELECTMsb = 17; //SPI_TRANSACTION_CONFIG:SPI_SLAVE_SELECT
localparam kSPI_SLAVE_SELECT = 16; //SPI_TRANSACTION_CONFIG:SPI_SLAVE_SELECT
typedef struct packed {
logic [13:0] Rsvd31_18; // [31:18] 14 bit spacer
logic [1:0] SPI_SLAVE_SELECT; // [17:16] 2 bit bitfield
logic [15:0] SPI_CLK_DIV; // [15: 0] 16 bit bitfield
} SPI_TRANSACTION_CONFIG;
// SPI_TRANSACTION_LSB Register (from x4xx_gpio_spi.sv)
localparam kSPI_TRANSACTION_LSB = 'h14; // Register Offset
localparam kSPI_TRANSACTION_LSBSize = 32; // register width in bits
localparam kSPI_TRANSACTION_LSBMask = 32'hFFFFFFFF;
localparam kSPI_DATA_LSBSize = 32; //SPI_TRANSACTION_LSB:SPI_DATA_LSB
localparam kSPI_DATA_LSBMsb = 31; //SPI_TRANSACTION_LSB:SPI_DATA_LSB
localparam kSPI_DATA_LSB = 0; //SPI_TRANSACTION_LSB:SPI_DATA_LSB
typedef struct packed {
logic [31:0] SPI_DATA_LSB; // [31: 0] 32 bit bitfield
} SPI_TRANSACTION_LSB;
// SPI_TRANSACTION_GO Register (from x4xx_gpio_spi.sv)
localparam kSPI_TRANSACTION_GO = 'h18; // Register Offset
localparam kSPI_TRANSACTION_GOSize = 32; // register width in bits
localparam kSPI_TRANSACTION_GOMask = 32'hFFFFFFFF;
localparam kSPI_DATASize = 32; //SPI_TRANSACTION_GO:SPI_DATA
localparam kSPI_DATAMsb = 31; //SPI_TRANSACTION_GO:SPI_DATA
localparam kSPI_DATA = 0; //SPI_TRANSACTION_GO:SPI_DATA
typedef struct packed {
logic [31:0] SPI_DATA; // [31: 0] 32 bit bitfield
} SPI_TRANSACTION_GO;
// SPI_STATUS Register (from x4xx_gpio_spi.sv)
localparam kSPI_STATUS = 'h1C; // Register Offset
localparam kSPI_STATUSSize = 32; // register width in bits
localparam kSPI_STATUSMask = 32'hFFFFFFFF;
localparam kSPI_RESPONSESize = 31; //SPI_STATUS:SPI_RESPONSE
localparam kSPI_RESPONSEMsb = 30; //SPI_STATUS:SPI_RESPONSE
localparam kSPI_RESPONSE = 0; //SPI_STATUS:SPI_RESPONSE
localparam kSPI_READYSize = 1; //SPI_STATUS:SPI_READY
localparam kSPI_READYMsb = 31; //SPI_STATUS:SPI_READY
localparam kSPI_READY = 31; //SPI_STATUS:SPI_READY
typedef struct packed {
logic SPI_READY; // [31:31] 1 bit bitfield
logic [30:0] SPI_RESPONSE; // [30: 0] 31 bit bitfield
} SPI_STATUS;
// SPI_FULL_RESPONSE_MSB Register (from x4xx_gpio_spi.sv)
localparam kSPI_FULL_RESPONSE_MSB = 'h20; // Register Offset
localparam kSPI_FULL_RESPONSE_MSBSize = 32; // register width in bits
localparam kSPI_FULL_RESPONSE_MSBMask = 32'hFFFFFFFF;
localparam kSPI_FULL_RESPONSE_MSB_DATASize = 32; //SPI_FULL_RESPONSE_MSB:SPI_FULL_RESPONSE_MSB_DATA
localparam kSPI_FULL_RESPONSE_MSB_DATAMsb = 31; //SPI_FULL_RESPONSE_MSB:SPI_FULL_RESPONSE_MSB_DATA
localparam kSPI_FULL_RESPONSE_MSB_DATA = 0; //SPI_FULL_RESPONSE_MSB:SPI_FULL_RESPONSE_MSB_DATA
typedef struct packed {
logic [31:0] SPI_FULL_RESPONSE_MSB_DATA; // [31: 0] 32 bit bitfield
} SPI_FULL_RESPONSE_MSB;
// CONTROLLER_INFO Register (from x4xx_gpio_spi.sv)
localparam kCONTROLLER_INFO = 'h24; // Register Offset
localparam kCONTROLLER_INFOSize = 32; // register width in bits
localparam kCONTROLLER_INFOMask = 32'hF;
localparam kSLAVE_COUNTSize = 4; //CONTROLLER_INFO:SLAVE_COUNT
localparam kSLAVE_COUNTMsb = 3; //CONTROLLER_INFO:SLAVE_COUNT
localparam kSLAVE_COUNT = 0; //CONTROLLER_INFO:SLAVE_COUNT
typedef struct packed {
logic [27:0] Rsvd31_4; // [31: 4] 28 bit spacer
logic [3:0] SLAVE_COUNT; // [ 3: 0] 4 bit bitfield
} CONTROLLER_INFO;
//===============================================================================
// RegTypes
//===============================================================================
// SPI_SETUP Type (from x4xx_gpio_spi.sv)
localparam kSPI_SETUPSize = 32;
localparam kSPI_SETUPMask = 32'h1FFFFFFF;
localparam kSLAVE_CLKSize = 5; //SPI_SETUP:SLAVE_CLK
localparam kSLAVE_CLKMsb = 4; //SPI_SETUP:SLAVE_CLK
localparam kSLAVE_CLK = 0; //SPI_SETUP:SLAVE_CLK
localparam kSLAVE_MOSISize = 5; //SPI_SETUP:SLAVE_MOSI
localparam kSLAVE_MOSIMsb = 9; //SPI_SETUP:SLAVE_MOSI
localparam kSLAVE_MOSI = 5; //SPI_SETUP:SLAVE_MOSI
localparam kSLAVE_MISOSize = 5; //SPI_SETUP:SLAVE_MISO
localparam kSLAVE_MISOMsb = 14; //SPI_SETUP:SLAVE_MISO
localparam kSLAVE_MISO = 10; //SPI_SETUP:SLAVE_MISO
localparam kSLAVE_CSSize = 5; //SPI_SETUP:SLAVE_CS
localparam kSLAVE_CSMsb = 19; //SPI_SETUP:SLAVE_CS
localparam kSLAVE_CS = 15; //SPI_SETUP:SLAVE_CS
localparam kSPI_LENGTHSize = 7; //SPI_SETUP:SPI_LENGTH
localparam kSPI_LENGTHMsb = 26; //SPI_SETUP:SPI_LENGTH
localparam kSPI_LENGTH = 20; //SPI_SETUP:SPI_LENGTH
localparam kMISO_EDGESize = 1; //SPI_SETUP:MISO_EDGE
localparam kMISO_EDGEMsb = 27; //SPI_SETUP:MISO_EDGE
localparam kMISO_EDGE = 27; //SPI_SETUP:MISO_EDGE
localparam kMOSI_EDGESize = 1; //SPI_SETUP:MOSI_EDGE
localparam kMOSI_EDGEMsb = 28; //SPI_SETUP:MOSI_EDGE
localparam kMOSI_EDGE = 28; //SPI_SETUP:MOSI_EDGE
typedef struct packed {
logic [2:0] Rsvd31_29; // [31:29] 3 bit spacer
logic MOSI_EDGE; // [28:28] 1 bit bitfield
logic MISO_EDGE; // [27:27] 1 bit bitfield
logic [6:0] SPI_LENGTH; // [26:20] 7 bit bitfield
logic [4:0] SLAVE_CS; // [19:15] 5 bit bitfield
logic [4:0] SLAVE_MISO; // [14:10] 5 bit bitfield
logic [4:0] SLAVE_MOSI; // [ 9: 5] 5 bit bitfield
logic [4:0] SLAVE_CLK; // [ 4: 0] 5 bit bitfield
} SPI_SETUP;
// Return the offset of an element of register array kSPI_SLAVE_CONFIG
function automatic integer kSPI_SLAVE_CONFIG (input integer i);
begin
kSPI_SLAVE_CONFIG = (i * 'h4) + 'h0;
end
endfunction
endpackage : XmlSvPkgDIG_IFC_REGMAP