mirror of
https://github.com/EttusResearch/uhd.git
synced 2026-10-25 17:36:10 +00:00
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.
164 lines
7.6 KiB
Systemverilog
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
|