141 lines
4.1 KiB
Systemverilog
141 lines
4.1 KiB
Systemverilog
package axi_pkg;
|
|
|
|
typedef enum logic [1:0] {
|
|
AXI_BURST_FIXED = 2'b00,
|
|
AXI_BURST_INCR = 2'b01,
|
|
AXI_BURST_WRAP = 2'b10
|
|
} axi_burst_t;
|
|
|
|
typedef enum logic [1:0] {
|
|
AXI_RESP_OKAY = 2'b00,
|
|
AXI_RESP_EXOKAY = 2'b01,
|
|
AXI_RESP_SLVERR = 2'b10,
|
|
AXI_RESP_DECERR = 2'b11
|
|
} axi_resp_t;
|
|
|
|
function automatic logic [2:0] axi_size_from_bytes(input int unsigned nbytes);
|
|
case (nbytes)
|
|
1 : return 3'd0;
|
|
2 : return 3'd1;
|
|
4 : return 3'd2;
|
|
8 : return 3'd3;
|
|
16 : return 3'd4;
|
|
32 : return 3'd5;
|
|
64 : return 3'd6;
|
|
128 : return 3'd7;
|
|
default: return 3'd0;
|
|
endcase
|
|
endfunction
|
|
|
|
endpackage : axi_pkg
|
|
|
|
`define AXI4_TYPEDEF_ALL(__name, __addr_t, __data_t, __strb_t, __id_t, __user_t) \
|
|
typedef struct packed { \
|
|
__id_t id; \
|
|
__addr_t addr; \
|
|
logic [7:0] len; \
|
|
logic [2:0] size; \
|
|
axi_pkg::axi_burst_t burst; \
|
|
logic lock; \
|
|
logic [3:0] cache; \
|
|
logic [2:0] prot; \
|
|
logic [3:0] qos; \
|
|
logic [3:0] region; \
|
|
__user_t user; \
|
|
logic valid; \
|
|
} __name``_aw_chan_t; \
|
|
typedef struct packed { \
|
|
__data_t data; \
|
|
__strb_t strb; \
|
|
logic last; \
|
|
__user_t user; \
|
|
logic valid; \
|
|
} __name``_w_chan_t; \
|
|
typedef struct packed { \
|
|
__id_t id; \
|
|
axi_pkg::axi_resp_t resp; \
|
|
__user_t user; \
|
|
logic valid; \
|
|
} __name``_b_chan_t; \
|
|
typedef struct packed { \
|
|
__id_t id; \
|
|
__addr_t addr; \
|
|
logic [7:0] len; \
|
|
logic [2:0] size; \
|
|
axi_pkg::axi_burst_t burst; \
|
|
logic lock; \
|
|
logic [3:0] cache; \
|
|
logic [2:0] prot; \
|
|
logic [3:0] qos; \
|
|
logic [3:0] region; \
|
|
__user_t user; \
|
|
logic valid; \
|
|
} __name``_ar_chan_t; \
|
|
typedef struct packed { \
|
|
__id_t id; \
|
|
__data_t data; \
|
|
axi_pkg::axi_resp_t resp; \
|
|
logic last; \
|
|
__user_t user; \
|
|
logic valid; \
|
|
} __name``_r_chan_t; \
|
|
typedef struct packed { \
|
|
__name``_aw_chan_t aw; \
|
|
__name``_w_chan_t w; \
|
|
logic b_ready; \
|
|
__name``_ar_chan_t ar; \
|
|
logic r_ready; \
|
|
} __name``_req_t; \
|
|
typedef struct packed { \
|
|
logic aw_ready; \
|
|
logic w_ready; \
|
|
__name``_b_chan_t b; \
|
|
logic ar_ready; \
|
|
__name``_r_chan_t r; \
|
|
} __name``_resp_t
|
|
|
|
`define AXI4L_TYPEDEF_ALL(__name, __addr_t, __data_t, __strb_t, __user_t) \
|
|
typedef struct packed { \
|
|
__addr_t addr; \
|
|
logic [2:0] prot; \
|
|
__user_t user; \
|
|
logic valid; \
|
|
} __name``_aw_chan_t; \
|
|
typedef struct packed { \
|
|
__data_t data; \
|
|
__strb_t strb; \
|
|
__user_t user; \
|
|
logic valid; \
|
|
} __name``_w_chan_t; \
|
|
typedef struct packed { \
|
|
axi_pkg::axi_resp_t resp; \
|
|
__user_t user; \
|
|
logic valid; \
|
|
} __name``_b_chan_t; \
|
|
typedef struct packed { \
|
|
__addr_t addr; \
|
|
logic [2:0] prot; \
|
|
__user_t user; \
|
|
logic valid; \
|
|
} __name``_ar_chan_t; \
|
|
typedef struct packed { \
|
|
__data_t data; \
|
|
axi_pkg::axi_resp_t resp; \
|
|
__user_t user; \
|
|
logic valid; \
|
|
} __name``_r_chan_t; \
|
|
typedef struct packed { \
|
|
__name``_aw_chan_t aw; \
|
|
__name``_w_chan_t w; \
|
|
logic b_ready; \
|
|
__name``_ar_chan_t ar; \
|
|
logic r_ready; \
|
|
} __name``_req_t; \
|
|
typedef struct packed { \
|
|
logic aw_ready; \
|
|
logic w_ready; \
|
|
__name``_b_chan_t b; \
|
|
logic ar_ready; \
|
|
__name``_r_chan_t r; \
|
|
} __name``_resp_t
|