152 lines
4.8 KiB
Plaintext
152 lines
4.8 KiB
Plaintext
// Copyright (c) 2019 Bluespec, Inc. All Rights Reserved
|
|
|
|
package AXI4_AXI4_Lite_Adapters;
|
|
|
|
// ================================================================
|
|
// Adapters for interconnecting AXI4 and AXI4_Lite.
|
|
|
|
// Ref: ARM document:
|
|
// AMBA AXI and ACE Protocol Specification
|
|
// AXI3, AXI4, and AXI4-Lite
|
|
// ACE and ACE-Lite
|
|
// ARM IHI 0022E (ID022613)
|
|
// Issue E, 22 Feb 2013
|
|
|
|
// See export list below
|
|
|
|
// ================================================================
|
|
// Exports
|
|
|
|
export
|
|
|
|
fn_AXI4_Lite_Master_IFC_to_AXI4_Master_IFC;
|
|
|
|
// ================================================================
|
|
// BSV library imports
|
|
|
|
import FIFOF :: *;
|
|
import Connectable :: *;
|
|
|
|
// ----------------
|
|
// BSV additional libs
|
|
|
|
import Semi_FIFOF :: *;
|
|
import EdgeFIFOFs :: *;
|
|
|
|
// ================================================================
|
|
// Project imports
|
|
|
|
import AXI4_Lite_Types :: *;
|
|
import AXI4_Types :: *;
|
|
|
|
// ================================================================
|
|
// Compute the encoding of AWSIZE/ARSIZE
|
|
|
|
function Bit #(3) wd_data_to_axsize (Integer wd_data_i);
|
|
Bit #(3) axsize = ( (wd_data_i == 32)
|
|
? 3'b_010
|
|
: ( (wd_data_i == 64)
|
|
? 3'b_011
|
|
: 3'b_000));
|
|
return axsize;
|
|
endfunction
|
|
|
|
// ================================================================
|
|
|
|
function AXI4_Master_IFC #(wd_id, wd_addr, wd_data, wd_user)
|
|
fn_AXI4_Lite_Master_IFC_to_AXI4_Master_IFC
|
|
(AXI4_Lite_Master_IFC #(wd_addr, wd_data, wd_user) axi4_lite);
|
|
|
|
return
|
|
interface AXI4_Master_IFC;
|
|
|
|
// ----------------
|
|
// Wr Addr channel
|
|
// output buses
|
|
method Bool m_awvalid = axi4_lite.m_awvalid;
|
|
|
|
method Bit #(wd_id) m_awid = 0;
|
|
method Bit #(wd_addr) m_awaddr = axi4_lite.m_awaddr;
|
|
method Bit #(8) m_awlen = 0; // burst length = awlen+1
|
|
method Bit #(3) m_awsize = wd_data_to_axsize (valueOf (wd_data));
|
|
method Bit #(2) m_awburst = 2'b_00; // FIXED
|
|
method Bit #(1) m_awlock = 0; // NORMAL
|
|
method Bit #(4) m_awcache = 4'b_0000; // Device Non-Bufferable
|
|
method Bit #(3) m_awprot = axi4_lite.m_awprot;
|
|
method Bit #(4) m_awqos = 4'b_0000;
|
|
method Bit #(4) m_awregion = 4'b_0000;
|
|
method Bit #(wd_user) m_awuser = 0;
|
|
|
|
// input buses
|
|
method Action m_awready (Bool awready) = axi4_lite.m_awready (awready);
|
|
|
|
// ----------------
|
|
// Wr Data channel
|
|
// output buses
|
|
method Bool m_wvalid = axi4_lite.m_wvalid;
|
|
|
|
method Bit #(wd_id) m_wid = 0;
|
|
method Bit #(wd_data) m_wdata = axi4_lite.m_wdata;
|
|
method Bit #(TDiv #(wd_data, 8)) m_wstrb = axi4_lite.m_wstrb;
|
|
method Bool m_wlast = True;
|
|
method Bit #(wd_user) m_wuser = 0;
|
|
|
|
// input buses
|
|
method Action m_wready (Bool wready) = axi4_lite.m_wready (wready);
|
|
|
|
// ----------------
|
|
// Wr Response channel
|
|
// input buses
|
|
method Action m_bvalid (Bool bvalid,
|
|
Bit #(wd_id) bid,
|
|
Bit #(2) bresp,
|
|
Bit #(wd_user) buser) = axi4_lite.m_bvalid (bvalid,
|
|
bresp,
|
|
0);
|
|
|
|
// output buses
|
|
method Bool m_bready = axi4_lite.m_bready;
|
|
|
|
// ----------------
|
|
// Rd Addr channel
|
|
// output buses
|
|
method Bool m_arvalid = axi4_lite.m_arvalid;
|
|
|
|
method Bit #(wd_id) m_arid = 0;
|
|
method Bit #(wd_addr) m_araddr = axi4_lite.m_araddr;
|
|
method Bit #(8) m_arlen = 0; // burst length = awlen+1
|
|
method Bit #(3) m_arsize = wd_data_to_axsize (valueOf (wd_data));
|
|
method Bit #(2) m_arburst = 2'b_00; // FIXED
|
|
method Bit #(1) m_arlock = 0; // NORMAL
|
|
method Bit #(4) m_arcache = 4'b_0000; // Device Non-Bufferable
|
|
method Bit #(3) m_arprot = axi4_lite.m_arprot;
|
|
method Bit #(4) m_arqos = 4'b_0000;
|
|
method Bit #(4) m_arregion = 4'b_0000;
|
|
method Bit #(wd_user) m_aruser = axi4_lite.m_aruser;
|
|
|
|
// input buses
|
|
method Action m_arready (Bool arready) = axi4_lite.m_arready (arready);
|
|
|
|
// ----------------
|
|
// Rd Data channel
|
|
// input buses
|
|
method Action m_rvalid (Bool rvalid,
|
|
Bit #(wd_id) rid,
|
|
Bit #(wd_data) rdata,
|
|
Bit #(2) rresp,
|
|
Bool rlast,
|
|
Bit #(wd_user) ruser) = axi4_lite.m_rvalid (rvalid,
|
|
rresp,
|
|
rdata,
|
|
0);
|
|
|
|
// output buses
|
|
method Bool m_rready = axi4_lite.m_rready;
|
|
|
|
endinterface;
|
|
endfunction
|
|
|
|
// ================================================================
|
|
|
|
endpackage
|