-------------------------------------------------------------------------------- CPU Bus interface layer -------------------------------------------------------------------------------- Provides an abstraction layer between the outside SoC's bus interface, and the internal register block's implementation. Converts a user-selectable bus protocol to generic register file signals. Upstream Signals: Signal names are defined in the bus interface class and shall be malleable to the user. User can choose a flat signal interface, or a SV interface. SV interface shall be easy to tweak since various orgs will use different naming conventions in their library of interface definitions Downstream Signals: - cpuif_req - Single-cycle pulse - Qualifies the following child signals: - cpuif_req_is_wr 1 denotes this is a write transfer - cpuif_addr Byte address - cpuif_wr_data - cpuif_wr_biten per-bit strobes some protocols may opt to tie this to all 1's - cpuif_rd_ack - Single-cycle pulse - Qualifies the following child signals: - cpuif_rd_data - cpuif_rd_err - cpuif_wr_ack - Single-cycle pulse - Qualifies the following child signals: - cpuif_wr_err Misc thoughts - Internal cpuif_* signals use a strobe-based protocol: - Unknown, but fixed latency - Makes for easy pipelining if needed - Decided to keep cpuif_req signals common for read write: This will allow address decode logic to be shared for read/write Downside is split protocols like axi-lite can't have totally separate rd/wr access lanes, but who cares? - separate response strobes Not necessary to use, but this lets me independently pipeline read/write paths. read path will need more time if readback mux is large - On multiple outstanding transactions Currently, cpuif doesnt really support this. Goal was to make it easily pipelineable without having to backfeed stall logic. Could still be possible to do a "fly-by" pipeline with a more intelligent cpuif layer Not worrying about this now. Implementation: Implement this mainly as a Jinja template. Upstream bus intf signals are fetched via busif class properties. Ex: {{busif.signal('pready')}} <= '1; This allows the actual SV or flattened signal to be emitted What protocols do I care about? - AXI4 Lite - Ignore AxPROT? - APB3 - APB4 - Ignore pprot? - AHB? - Wishbone - Generic breakout the above signals as-is (reassign with a prefix or something)