+ Microarchitecture optimizations + 64-bit support + Xilinx FPGA support + LLVM-16 support + Refactoring and quality control fixes minor update minor update minor update minor update minor update minor update cleanup cleanup cache bindings and memory perf refactory minor update minor update hw unit tests fixes minor update minor update minor update minor update minor update minor udpate minor update minor update minor update minor update minor update minor update minor update minor updates minor updates minor update minor update minor update minor update minor update minor update minor updates minor updates minor updates minor updates minor update minor update
245 lines
8.3 KiB
Systemverilog
245 lines
8.3 KiB
Systemverilog
// Date: 02/2/2016
|
|
// Compliant with CCI-P spec v0.71
|
|
package ccip_if_pkg;
|
|
|
|
//=====================================================================
|
|
// CCI-P interface defines
|
|
//=====================================================================
|
|
parameter CCIP_VERSION_NUMBER = 12'h071;
|
|
|
|
parameter CCIP_CLADDR_WIDTH = 42;
|
|
parameter CCIP_CLDATA_WIDTH = 512;
|
|
|
|
parameter CCIP_MMIOADDR_WIDTH = 16;
|
|
parameter CCIP_MMIODATA_WIDTH = 64;
|
|
parameter CCIP_TID_WIDTH = 9;
|
|
|
|
parameter CCIP_MDATA_WIDTH = 16;
|
|
|
|
|
|
// Number of requests that can be accepted after almost full is asserted.
|
|
parameter CCIP_TX_ALMOST_FULL_THRESHOLD = 8;
|
|
|
|
parameter CCIP_MMIO_RD_TIMEOUT = 512;
|
|
|
|
parameter CCIP_SYNC_RESET_POLARITY=1; // Active High Reset
|
|
|
|
// Base types
|
|
//----------------------------------------------------------------------
|
|
typedef logic [CCIP_CLADDR_WIDTH-1:0] t_ccip_clAddr;
|
|
typedef logic [CCIP_CLDATA_WIDTH-1:0] t_ccip_clData;
|
|
|
|
|
|
typedef logic [CCIP_MMIOADDR_WIDTH-1:0] t_ccip_mmioAddr;
|
|
typedef logic [CCIP_MMIODATA_WIDTH-1:0] t_ccip_mmioData;
|
|
typedef logic [CCIP_TID_WIDTH-1:0] t_ccip_tid;
|
|
|
|
|
|
typedef logic [CCIP_MDATA_WIDTH-1:0] t_ccip_mdata;
|
|
typedef logic [1:0] t_ccip_clNum;
|
|
typedef logic [2:0] t_ccip_qwIdx;
|
|
|
|
|
|
// Request Type Encodings
|
|
//----------------------------------------------------------------------
|
|
// Channel 0
|
|
typedef enum logic [3:0] {
|
|
eREQ_RDLINE_I = 4'h0, // Memory Read with FPGA Cache Hint=Invalid
|
|
eREQ_RDLINE_S = 4'h1 // Memory Read with FPGA Cache Hint=Shared
|
|
} t_ccip_c0_req;
|
|
|
|
// Channel 1
|
|
typedef enum logic [3:0] {
|
|
eREQ_WRLINE_I = 4'h0, // Memory Write with FPGA Cache Hint=Invalid
|
|
eREQ_WRLINE_M = 4'h1, // Memory Write with FPGA Cache Hint=Modified
|
|
eREQ_WRPUSH_I = 4'h2, // Memory Write with DDIO Hint ** NOT SUPPORTED CURRENTLY **
|
|
eREQ_WRFENCE = 4'h4, // Memory Write Fence
|
|
// eREQ_ATOMIC = 4'h5, // Atomic operation: Compare-Exchange for Memory Addr ** NOT SUPPORTED CURRENTELY **
|
|
eREQ_INTR = 4'h6 // Interrupt the CPU ** NOT SUPPORTED CURRENTLY **
|
|
} t_ccip_c1_req;
|
|
|
|
// Response Type Encodings
|
|
//----------------------------------------------------------------------
|
|
// Channel 0
|
|
typedef enum logic [3:0] {
|
|
eRSP_RDLINE = 4'h0, // Memory Read
|
|
eRSP_UMSG = 4'h4 // UMsg received
|
|
// eRSP_ATOMIC = 4'h5 // Atomic Operation: Compare-Exchange for Memory Addr
|
|
} t_ccip_c0_rsp;
|
|
|
|
// Channel 1
|
|
typedef enum logic [3:0] {
|
|
eRSP_WRLINE = 4'h0, // Memory Write
|
|
eRSP_WRFENCE = 4'h4, // Memory Write Fence
|
|
eRSP_INTR = 4'h6 // Interrupt delivered to the CPU ** NOT SUPPORTED CURRENTLY **
|
|
} t_ccip_c1_rsp;
|
|
|
|
//
|
|
// Virtual Channel Select
|
|
//----------------------------------------------------------------------
|
|
typedef enum logic [1:0] {
|
|
eVC_VA = 2'b00,
|
|
eVC_VL0 = 2'b01,
|
|
eVC_VH0 = 2'b10,
|
|
eVC_VH1 = 2'b11
|
|
} t_ccip_vc;
|
|
|
|
// Multi-CL Memory Request
|
|
//----------------------------------------------------------------------
|
|
typedef enum logic [1:0] {
|
|
eCL_LEN_1 = 2'b00,
|
|
eCL_LEN_2 = 2'b01,
|
|
eCL_LEN_4 = 2'b11
|
|
} t_ccip_clLen;
|
|
|
|
//
|
|
// Structures for Request and Response headers
|
|
//----------------------------------------------------------------------
|
|
typedef struct packed {
|
|
t_ccip_vc vc_sel;
|
|
logic [1:0] rsvd1; // reserved, drive 0
|
|
t_ccip_clLen cl_len;
|
|
t_ccip_c0_req req_type;
|
|
logic [5:0] rsvd0; // reserved, drive 0
|
|
t_ccip_clAddr address;
|
|
t_ccip_mdata mdata;
|
|
} t_ccip_c0_ReqMemHdr;
|
|
parameter CCIP_C0TX_HDR_WIDTH = $bits(t_ccip_c0_ReqMemHdr);
|
|
|
|
typedef struct packed {
|
|
logic [5:0] rsvd2;
|
|
t_ccip_vc vc_sel;
|
|
logic sop;
|
|
logic rsvd1; // reserved, drive 0
|
|
t_ccip_clLen cl_len;
|
|
t_ccip_c1_req req_type;
|
|
logic [5:0] rsvd0; // reserved, drive 0
|
|
t_ccip_clAddr address;
|
|
t_ccip_mdata mdata;
|
|
} t_ccip_c1_ReqMemHdr;
|
|
parameter CCIP_C1TX_HDR_WIDTH = $bits(t_ccip_c1_ReqMemHdr);
|
|
|
|
typedef struct packed {
|
|
logic [5:0] rsvd2; // reserved, drive 0
|
|
t_ccip_vc vc_sel;
|
|
logic [3:0] rsvd1; // reserved, drive 0
|
|
t_ccip_c1_req req_type;
|
|
logic [47:0] rsvd0; // reserved, drive 0
|
|
t_ccip_mdata mdata;
|
|
}t_ccip_c1_ReqFenceHdr;
|
|
|
|
typedef struct packed {
|
|
t_ccip_vc vc_used;
|
|
logic rsvd1; // reserved, don't care
|
|
logic hit_miss;
|
|
logic [1:0] rsvd0; // reserved, don't care
|
|
t_ccip_clNum cl_num;
|
|
t_ccip_c0_rsp resp_type;
|
|
t_ccip_mdata mdata;
|
|
} t_ccip_c0_RspMemHdr;
|
|
parameter CCIP_C0RX_HDR_WIDTH = $bits(t_ccip_c0_RspMemHdr);
|
|
|
|
typedef struct packed {
|
|
t_ccip_vc vc_used;
|
|
logic rsvd1; // reserved, don't care
|
|
logic hit_miss;
|
|
logic format;
|
|
logic rsvd0; // reserved, don't care
|
|
t_ccip_clNum cl_num;
|
|
t_ccip_c1_rsp resp_type;
|
|
t_ccip_mdata mdata;
|
|
} t_ccip_c1_RspMemHdr;
|
|
parameter CCIP_C1RX_HDR_WIDTH = $bits(t_ccip_c1_RspMemHdr);
|
|
|
|
typedef struct packed {
|
|
logic [7:0] rsvd0; // reserved, don't care
|
|
t_ccip_c1_rsp resp_type;
|
|
t_ccip_mdata mdata;
|
|
} t_ccip_c1_RspFenceHdr;
|
|
|
|
// Alternate Channel 0 MMIO request from host :
|
|
// MMIO requests arrive on the same channel as read responses, sharing
|
|
// t_if_ccip_c0_Rx below. When either mmioRdValid or mmioWrValid is set
|
|
// the message is an MMIO request and should be processed by casting
|
|
// t_if_ccip_c0_Rx.hdr to t_ccip_c0_ReqMmioHdr.
|
|
typedef struct packed {
|
|
t_ccip_mmioAddr address; // 4B aligned Mmio address
|
|
logic [1:0] length; // 2'b00- 4B, 2'b01- 8B, 2'b10- 64B
|
|
logic rsvd; // reserved, don't care
|
|
t_ccip_tid tid;
|
|
} t_ccip_c0_ReqMmioHdr;
|
|
|
|
typedef struct packed {
|
|
t_ccip_tid tid; // Returned back from ReqMmioHdr
|
|
} t_ccip_c2_RspMmioHdr;
|
|
parameter CCIP_C2TX_HDR_WIDTH = $bits(t_ccip_c2_RspMmioHdr);
|
|
|
|
//------------------------------------------------------------------------
|
|
// CCI-P Input & Output bus structures
|
|
//
|
|
// Users are encouraged to use these for AFU development
|
|
//------------------------------------------------------------------------
|
|
// Channel 0 : Memory Reads
|
|
typedef struct packed {
|
|
t_ccip_c0_ReqMemHdr hdr; // Request Header
|
|
logic valid; // Request Valid
|
|
} t_if_ccip_c0_Tx;
|
|
|
|
|
|
// Channel 1 : Memory Writes, Interrupts, CmpXchg
|
|
typedef struct packed {
|
|
t_ccip_c1_ReqMemHdr hdr; // Request Header
|
|
t_ccip_clData data; // Request Data
|
|
logic valid; // Request Wr Valid
|
|
} t_if_ccip_c1_Tx;
|
|
|
|
// Channel 2 : MMIO Read response
|
|
typedef struct packed {
|
|
t_ccip_c2_RspMmioHdr hdr; // Response Header
|
|
logic mmioRdValid; // Response Read Valid
|
|
t_ccip_mmioData data; // Response Data
|
|
} t_if_ccip_c2_Tx;
|
|
|
|
// Wrap all Tx channels
|
|
typedef struct packed {
|
|
t_if_ccip_c0_Tx c0;
|
|
t_if_ccip_c1_Tx c1;
|
|
t_if_ccip_c2_Tx c2;
|
|
} t_if_ccip_Tx;
|
|
|
|
// Channel 0: Memory Read response, MMIO Request
|
|
typedef struct packed {
|
|
t_ccip_c0_RspMemHdr hdr; // Rd Response/ MMIO req Header
|
|
t_ccip_clData data; // Rd Data / MMIO req Data
|
|
// Only one of valid, mmioRdValid and mmioWrValid may be set
|
|
// in a cycle. When either mmioRdValid or mmioWrValid are true
|
|
// the hdr must be processed specially. See t_ccip_c0_ReqMmioHdr
|
|
// above.
|
|
logic rspValid; // Rd Response Valid
|
|
logic mmioRdValid; // MMIO Read Valid
|
|
logic mmioWrValid; // MMIO Write Valid
|
|
} t_if_ccip_c0_Rx;
|
|
|
|
// Channel 1: Memory Writes
|
|
typedef struct packed {
|
|
t_ccip_c1_RspMemHdr hdr; // Response Header
|
|
logic rspValid; // Response Valid
|
|
} t_if_ccip_c1_Rx;
|
|
|
|
// Wrap all channels
|
|
typedef struct packed {
|
|
logic c0TxAlmFull; // C0 Request Channel Almost Full
|
|
logic c1TxAlmFull; // C1 Request Channel Almost Full
|
|
|
|
t_if_ccip_c0_Rx c0;
|
|
t_if_ccip_c1_Rx c1;
|
|
} t_if_ccip_Rx;
|
|
|
|
|
|
typedef union packed {
|
|
t_ccip_c0_RspMemHdr rspMemHdr;
|
|
t_ccip_c0_ReqMmioHdr reqMmioHdr;
|
|
} t_if_ccip_c0_RxHdr;
|
|
|
|
endpackage
|