Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
195 changes: 115 additions & 80 deletions include/obi/typedef.svh
Original file line number Diff line number Diff line change
Expand Up @@ -3,115 +3,150 @@
// SPDX-License-Identifier: SHL-0.51

// Michael Rogenmoser <michaero@iis.ee.ethz.ch>
// Riccardo Tedeschi <riccardo.tedeschi6@unibo.it>

`ifndef OBI_TYPEDEF_SVH
`define OBI_TYPEDEF_SVH

`define OBI_TYPEDEF_MIN_WIDTH(WIDTH) ((WIDTH) > 0 ? (WIDTH) : 1)

// Each `OBI_TYPEDEF_*` macro is defined in terms of an `OBI_DECL_*` macro expanding to the bare
// (anonymous) struct. The `OBI_DECL_*` form can be used wherever a type expression is expected,
// most notably in a parameter port list:
//
// #(
// localparam type a_optional_t = `OBI_DECL_ALL_A_OPTIONAL(1, 1, 1, 1),
// localparam type a_chan_t = `OBI_DECL_A_CHAN_T(32, 32, 4, a_optional_t)
// )
`define OBI_DECL_A_CHAN_T(ADDR_WIDTH, DATA_WIDTH, ID_WIDTH, a_optional_t) \
struct packed { \
logic [ ADDR_WIDTH-1:0] addr; \
logic we; \
logic [ DATA_WIDTH/8-1:0] be; \
logic [ DATA_WIDTH-1:0] wdata; \
logic [`OBI_TYPEDEF_MIN_WIDTH(ID_WIDTH)-1:0] aid; \
a_optional_t a_optional; \
}
`define OBI_TYPEDEF_A_CHAN_T(a_chan_t, ADDR_WIDTH, DATA_WIDTH, ID_WIDTH, a_optional_t) \
typedef struct packed { \
logic [ ADDR_WIDTH-1:0] addr; \
logic we; \
logic [ DATA_WIDTH/8-1:0] be; \
logic [ DATA_WIDTH-1:0] wdata; \
logic [`OBI_TYPEDEF_MIN_WIDTH(ID_WIDTH)-1:0] aid; \
a_optional_t a_optional; \
} a_chan_t;

typedef `OBI_DECL_A_CHAN_T(ADDR_WIDTH, DATA_WIDTH, ID_WIDTH, a_optional_t) a_chan_t;

`define OBI_DECL_TYPE_A_CHAN_T(addr_t, data_t, strb_t, id_t, a_optional_t) \
struct packed { \
addr_t addr; \
logic we; \
strb_t be; \
data_t wdata; \
id_t aid; \
a_optional_t a_optional; \
}
`define OBI_TYPEDEF_TYPE_A_CHAN_T(a_chan_t, addr_t, data_t, strb_t, id_t, a_optional_t) \
typedef struct packed { \
addr_t addr; \
logic we; \
strb_t be; \
data_t wdata; \
id_t aid; \
a_optional_t a_optional; \
} a_chan_t;
typedef `OBI_DECL_TYPE_A_CHAN_T(addr_t, data_t, strb_t, id_t, a_optional_t) a_chan_t;

`define OBI_DECL_MINIMAL_A_OPTIONAL logic
`define OBI_TYPEDEF_MINIMAL_A_OPTIONAL(a_optional_t) \
typedef logic a_optional_t;
typedef `OBI_DECL_MINIMAL_A_OPTIONAL a_optional_t;

`define OBI_DECL_ATOP_A_OPTIONAL \
struct packed { \
obi_pkg::atop_t atop; \
}
`define OBI_TYPEDEF_ATOP_A_OPTIONAL(a_optional_t) \
typedef struct packed { \
obi_pkg::atop_t atop; \
} a_optional_t;

typedef `OBI_DECL_ATOP_A_OPTIONAL a_optional_t;

`define OBI_DECL_ALL_A_OPTIONAL(AUSER_WIDTH, WUSER_WIDTH, MID_WIDTH, ACHK_WIDTH) \
struct packed { \
logic [`OBI_TYPEDEF_MIN_WIDTH(AUSER_WIDTH)-1:0] auser; \
logic [`OBI_TYPEDEF_MIN_WIDTH(WUSER_WIDTH)-1:0] wuser; \
obi_pkg::atop_t atop; \
obi_pkg::memtype_t memtype; \
logic [ `OBI_TYPEDEF_MIN_WIDTH(MID_WIDTH)-1:0] mid; \
obi_pkg::prot_t prot; \
logic dbg; \
logic [ `OBI_TYPEDEF_MIN_WIDTH(ACHK_WIDTH)-1:0] achk; \
}
`define OBI_TYPEDEF_ALL_A_OPTIONAL(a_optional_t, AUSER_WIDTH, WUSER_WIDTH, MID_WIDTH, ACHK_WIDTH) \
typedef struct packed { \
logic [`OBI_TYPEDEF_MIN_WIDTH(AUSER_WIDTH)-1:0] auser; \
logic [`OBI_TYPEDEF_MIN_WIDTH(WUSER_WIDTH)-1:0] wuser; \
obi_pkg::atop_t atop; \
obi_pkg::memtype_t memtype; \
logic [ `OBI_TYPEDEF_MIN_WIDTH(MID_WIDTH)-1:0] mid; \
obi_pkg::prot_t prot; \
logic dbg; \
logic [ `OBI_TYPEDEF_MIN_WIDTH(ACHK_WIDTH)-1:0] achk; \
} a_optional_t;

typedef `OBI_DECL_ALL_A_OPTIONAL(AUSER_WIDTH, WUSER_WIDTH, MID_WIDTH, ACHK_WIDTH) a_optional_t;

`define OBI_DECL_R_CHAN_T(RDATA_WIDTH, ID_WIDTH, r_optional_t) \
struct packed { \
logic [ RDATA_WIDTH-1:0] rdata; \
logic [`OBI_TYPEDEF_MIN_WIDTH(ID_WIDTH)-1:0] rid; \
logic err; \
r_optional_t r_optional; \
}
`define OBI_TYPEDEF_R_CHAN_T(r_chan_t, RDATA_WIDTH, ID_WIDTH, r_optional_t) \
typedef struct packed { \
logic [ RDATA_WIDTH-1:0] rdata; \
logic [`OBI_TYPEDEF_MIN_WIDTH(ID_WIDTH)-1:0] rid; \
logic err; \
r_optional_t r_optional; \
} r_chan_t;

typedef `OBI_DECL_R_CHAN_T(RDATA_WIDTH, ID_WIDTH, r_optional_t) r_chan_t;

`define OBI_DECL_TYPE_R_CHAN_T(data_t, id_t, r_optional_t) \
struct packed { \
data_t rdata; \
id_t rid; \
logic err; \
r_optional_t r_optional; \
}
`define OBI_TYPEDEF_TYPE_R_CHAN_T(r_chan_t, data_t, id_t, r_optional_t) \
typedef struct packed { \
data_t rdata; \
id_t rid; \
logic err; \
r_optional_t r_optional; \
} r_chan_t;
typedef `OBI_DECL_TYPE_R_CHAN_T(data_t, id_t, r_optional_t) r_chan_t;

`define OBI_DECL_MINIMAL_R_OPTIONAL logic
`define OBI_TYPEDEF_MINIMAL_R_OPTIONAL(r_optional_t) \
typedef logic r_optional_t;

typedef `OBI_DECL_MINIMAL_R_OPTIONAL r_optional_t;

`define OBI_DECL_ALL_R_OPTIONAL(RUSER_WIDTH, RCHK_WIDTH) \
struct packed { \
logic [`OBI_TYPEDEF_MIN_WIDTH(RUSER_WIDTH)-1:0] ruser; \
logic exokay;\
logic [ `OBI_TYPEDEF_MIN_WIDTH(RCHK_WIDTH)-1:0] rchk; \
}
`define OBI_TYPEDEF_ALL_R_OPTIONAL(r_optional_t, RUSER_WIDTH, RCHK_WIDTH) \
typedef struct packed { \
logic [`OBI_TYPEDEF_MIN_WIDTH(RUSER_WIDTH)-1:0] ruser; \
logic exokay; \
logic [ `OBI_TYPEDEF_MIN_WIDTH(RCHK_WIDTH)-1:0] rchk; \
} r_optional_t;
typedef `OBI_DECL_ALL_R_OPTIONAL(RUSER_WIDTH, RCHK_WIDTH) r_optional_t;

`define OBI_DECL_DEFAULT_REQ_T(a_chan_t) \
struct packed { \
a_chan_t a; \
logic req; \
}
`define OBI_TYPEDEF_DEFAULT_REQ_T(req_t, a_chan_t) \
typedef struct packed { \
a_chan_t a; \
logic req; \
} req_t;

typedef `OBI_DECL_DEFAULT_REQ_T(a_chan_t) req_t;

`define OBI_DECL_REQ_T(a_chan_t) \
struct packed { \
a_chan_t a; \
logic req; \
logic rready; \
}
`define OBI_TYPEDEF_REQ_T(req_t, a_chan_t) \
typedef struct packed { \
typedef `OBI_DECL_REQ_T(a_chan_t) req_t;

`define OBI_DECL_RSP_T(r_chan_t) \
struct packed { \
r_chan_t r; \
logic gnt; \
logic rvalid; \
}
`define OBI_TYPEDEF_RSP_T(rsp_t, r_chan_t) \
typedef `OBI_DECL_RSP_T(r_chan_t) rsp_t;

`define OBI_DECL_INTEGRITY_REQ_T(a_chan_t) \
struct packed { \
a_chan_t a; \
logic req; \
logic rready; \
} req_t;
logic reqpar; \
logic rreadypar; \
}
`define OBI_TYPEDEF_INTEGRITY_REQ_T(req_t, a_chan_t) \
typedef `OBI_DECL_INTEGRITY_REQ_T(a_chan_t) req_t;

`define OBI_TYPEDEF_RSP_T(rsp_t, r_chan_t) \
typedef struct packed { \
`define OBI_DECL_INTEGRITY_RSP_T(r_chan_t) \
struct packed { \
r_chan_t r; \
logic gnt; \
logic gntpar; \
logic rvalid; \
} rsp_t;

`define OBI_TYPEDEF_INTEGRITY_REQ_T(req_t, a_chan_t) \
typedef struct packed { \
a_chan_t a; \
logic req; \
logic rready; \
logic reqpar; \
logic rreadypar; \
} req_t;

logic rvalidpar; \
}
`define OBI_TYPEDEF_INTEGRITY_RSP_T(rsp_t, r_chan_t) \
typedef struct packed { \
r_chan_t r; \
logic gnt; \
logic gntpar; \
logic rvalid; \
logic rvalidpar; \
} rsp_t;
typedef `OBI_DECL_INTEGRITY_RSP_T(r_chan_t) rsp_t;

`define OBI_TYPEDEF_ALL(obi_t, cfg) \
`OBI_TYPEDEF_ALL_A_OPTIONAL(obi_t``_a_optional_t, cfg.OptionalCfg.AUserWidth, cfg.OptionalCfg.WUserWidth, cfg.OptionalCfg.MidWidth, cfg.OptionalCfg.AChkWidth) \
Expand Down
Loading