diff options
author | Andrew Moch <Andrew.Moch@ni.com> | 2021-01-29 17:58:12 +0000 |
---|---|---|
committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2021-06-03 11:26:54 -0500 |
commit | 04d29e85b0c0698e3de96b54fd3f6e04eb439f74 (patch) | |
tree | 52b8f5e6ec0ef83e8e1515754740e4e2d631d8fc /fpga | |
parent | d099fc3b032250bcc70e4c24f78d5eb6508850e1 (diff) | |
download | uhd-04d29e85b0c0698e3de96b54fd3f6e04eb439f74.tar.gz uhd-04d29e85b0c0698e3de96b54fd3f6e04eb439f74.tar.bz2 uhd-04d29e85b0c0698e3de96b54fd3f6e04eb439f74.zip |
fpga: lib: Add AXI4 (full) interface
Add a SystemVerilog interface for connecting AXI4 ports, and an
associated header file with helper macros.
Diffstat (limited to 'fpga')
-rw-r--r-- | fpga/usrp3/lib/axi4_sv/AxiIf.sv | 329 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi4_sv/Makefile.srcs | 13 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi4_sv/PkgAxi.sv | 30 | ||||
-rw-r--r-- | fpga/usrp3/lib/axi4_sv/axi.vh | 247 |
4 files changed, 619 insertions, 0 deletions
diff --git a/fpga/usrp3/lib/axi4_sv/AxiIf.sv b/fpga/usrp3/lib/axi4_sv/AxiIf.sv new file mode 100644 index 000000000..311387b5c --- /dev/null +++ b/fpga/usrp3/lib/axi4_sv/AxiIf.sv @@ -0,0 +1,329 @@ +// +// Copyright 2021 Ettus Research, A National Instruments Brand +// +// SPDX-License-Identifier: LGPL-3.0-or-later +// +// Interface: AxiIf +// Description: +// AXI4 is an ARM standard for bursting memory mapped transfers +// For more information on the spec see +// - https://developer.arm.com/docs/ihi0022/d +// +// The interface contains methods for +// (1) Writing an address +// (2) Reading an address +// +// Parameters: +// - DATA_WIDTH - Width of the data on AXI4 bus +// - ADDR_WIDTH - Width of the address on AXI4 bus +// + +//----------------------------------------------------------------------------- +// AXI4 interface +//----------------------------------------------------------------------------- + +interface AxiIf #( + int DATA_WIDTH = 64, + int ADDR_WIDTH = 1 +) ( + input logic clk, + input logic rst = 1'b0 +); + + import PkgAxi::*; + + localparam BYTES_PER_WORD = DATA_WIDTH/8; + + // local type defs + typedef logic [DATA_WIDTH-1:0] data_t; + typedef logic [ADDR_WIDTH-1:0] addr_t; + typedef logic [BYTES_PER_WORD-1:0] strb_t; + typedef logic [7:0] len_t; + typedef logic [2:0] size_t; + typedef logic [1:0] burst_t; + typedef logic [0:0] lock_t; + typedef logic [3:0] cache_t; + typedef logic [2:0] prot_t; + typedef logic [3:0] qos_t; + + // Signals that make up an Axi interface + // Write Address Channel + addr_t awaddr; + len_t awlen; + size_t awsize; + burst_t awburst; + lock_t awlock; + cache_t awcache; + prot_t awprot; + qos_t awqos; + logic awvalid; + logic awready; + + // Write Data Channel + data_t wdata; + strb_t wstrb = '1; + logic wlast; + logic wvalid; + logic wready; + + // Write Response Channel + axi_resp_t bresp; + logic bvalid; + logic bready; + + // Read Address Channel + addr_t araddr; + len_t arlen; + size_t arsize; + burst_t arburst; + lock_t arlock; + cache_t arcache; + prot_t arprot; + qos_t arqos; + logic arvalid; + logic arready; + + // Read Data Channel + data_t rdata; + axi_resp_t rresp; + logic rlast; + logic rvalid; + logic rready; + + // Master Functions + task automatic drive_aw(input addr_t addr, + input len_t len, + input size_t size, + input burst_t burst, + input lock_t lock, + input cache_t cache, + input prot_t prot, + input qos_t qos); + awaddr = addr; + awlen = len; + awsize = size; + awburst = burst; + awlock = lock; + awcache = cache; + awprot = prot; + awqos = qos; + awvalid = 1; + endtask + + task automatic drive_w(input data_t data, + input logic last, + input strb_t strb = '1); + wdata = data; + wstrb = strb; + wlast = last; + wvalid = 1; + endtask + + task automatic drive_aw_idle(); + awaddr = 'X; + awlen = 'X; + awsize = 'X; + awburst = 'X; + awlock = 'X; + awcache = 'X; + awprot = 'X; + awqos = 'X; + awvalid = 0; + endtask + + task automatic drive_w_idle(); + wdata = 'X; + wstrb = 'X; + wlast = 1'bX; + wvalid = 0; + endtask + + task automatic drive_read(input addr_t addr, + input len_t len, + input size_t size, + input burst_t burst, + input lock_t lock, + input cache_t cache, + input prot_t prot, + input qos_t qos); + araddr = addr; + arlen = len; + arsize = size; + arburst = burst; + arlock = lock; + arcache = cache; + arprot = prot; + arqos = qos; + arvalid = 1; + endtask + + task automatic drive_read_idle(); + araddr = 'X; + araddr = 'X; + arlen = 'X; + arsize = 'X; + arburst = 'X; + arlock = 'X; + arcache = 'X; + arprot = 'X; + arqos = 'X; + arvalid = 0; + endtask + + // Slave Functions + task automatic drive_write_resp(input axi_resp_t resp=OKAY); + bresp = resp; + bvalid = 1; + endtask + + task automatic drive_write_resp_idle(); + bresp = OKAY; + bvalid = 0; + endtask + + task automatic drive_read_resp(input data_t data, + input logic last, + input axi_resp_t resp=OKAY); + rdata = data; + rresp = resp; + rlast = last; + rvalid = 1; + endtask + + task automatic drive_read_resp_idle(); + rdata = 'X; + rresp = OKAY; + rlast = 1'bX; + rvalid = 0; + endtask + + // View from the master side + modport master ( + input clk, rst, + output awaddr,awlen,awsize,awburst,awlock,awcache,awprot,awqos,awvalid, + wdata,wstrb,wlast,wvalid, + bready, + araddr,arlen,arsize,arburst,arlock,arcache,arprot,arqos,arvalid, + rready, + input awready,wready,bresp,bvalid,arready,rdata,rresp,rlast,rvalid, + import drive_aw, + import drive_w, + import drive_w_idle, + import drive_aw_idle, + import drive_read, + import drive_read_idle + ); + + // View from the slave side + modport slave ( + input clk, rst, + input awaddr,awlen,awsize,awburst,awlock,awcache,awprot,awqos,awvalid, + wdata,wstrb,wlast,wvalid, + bready, + araddr,arlen,arsize,arburst,arlock,arcache,arprot,arqos,arvalid, + rready, + output awready,wready,bresp,bvalid,arready,rdata,rresp,rlast,rvalid, + import drive_write_resp, + import drive_write_resp_idle, + import drive_read_resp, + import drive_read_resp_idle + ); + +endinterface : AxiIf + +// The _v version of the interface does not assign any signals so it may be used +// in a continuous context. The most common example is when associating members +// to a regular verilog output port. +interface AxiIf_v #( + int DATA_WIDTH = 64, + int ADDR_WIDTH = 1 +) ( + input logic clk, + input logic rst = 1'b0 +); + + import PkgAxi::*; + + localparam BYTES_PER_WORD = DATA_WIDTH/8; + + // local type defs + typedef logic [DATA_WIDTH-1:0] data_t; + typedef logic [ADDR_WIDTH-1:0] addr_t; + typedef logic [BYTES_PER_WORD-1:0] strb_t; + typedef logic [7:0] len_t; + typedef logic [2:0] size_t; + typedef logic [1:0] burst_t; + typedef logic [0:0] lock_t; + typedef logic [3:0] cache_t; + typedef logic [2:0] prot_t; + typedef logic [3:0] qos_t; + + // Signals that make up an Axi interface + // Write Address Channel + addr_t awaddr; + len_t awlen; + size_t awsize; + burst_t awburst; + lock_t awlock; + cache_t awcache; + prot_t awprot; + qos_t awqos; + logic awvalid; + logic awready; + + // Write Data Channel + data_t wdata; + strb_t wstrb; + logic wlast; + logic wvalid; + logic wready; + + // Write Response Channel + axi_resp_t bresp; + logic bvalid; + logic bready; + + // Read Address Channel + addr_t araddr; + len_t arlen; + size_t arsize; + burst_t arburst; + lock_t arlock; + cache_t arcache; + prot_t arprot; + qos_t arqos; + logic arvalid; + logic arready; + + // Read Data Channel + data_t rdata; + axi_resp_t rresp; + logic rlast; + logic rvalid; + logic rready; + + // View from the master side + modport master ( + input clk, rst, + output awaddr,awlen,awsize,awburst,awlock,awcache,awprot,awqos,awvalid, + wdata,wstrb,wlast,wvalid, + bready, + araddr,arlen,arsize,arburst,arlock,arcache,arprot,arqos,arvalid, + rready, + input awready,wready,bresp,bvalid,arready,rdata,rresp,rlast,rvalid + + ); + + // View from the slave side + modport slave ( + input clk, rst, + input awaddr,awlen,awsize,awburst,awlock,awcache,awprot,awqos,awvalid, + wdata,wstrb,wlast,wvalid, + bready, + araddr,arlen,arsize,arburst,arlock,arcache,arprot,arqos,arvalid, + rready, + output awready,wready,bresp,bvalid,arready,rdata,rresp,rlast,rvalid + + ); + +endinterface : AxiIf_v diff --git a/fpga/usrp3/lib/axi4_sv/Makefile.srcs b/fpga/usrp3/lib/axi4_sv/Makefile.srcs new file mode 100644 index 000000000..5f4f05d08 --- /dev/null +++ b/fpga/usrp3/lib/axi4_sv/Makefile.srcs @@ -0,0 +1,13 @@ +# +# Copyright 2021 Ettus Research, A National Instruments Brand +# +# SPDX-License-Identifier: LGPL-3.0-or-later +# + +################################################## +# RFNoC Utility Sources +################################################## +AXI4_SV_SRCS = $(abspath $(addprefix $(BASE_DIR)/../lib/axi4_sv/, \ +PkgAxi.sv \ +AxiIf.sv \ +)) diff --git a/fpga/usrp3/lib/axi4_sv/PkgAxi.sv b/fpga/usrp3/lib/axi4_sv/PkgAxi.sv new file mode 100644 index 000000000..ac77e8a53 --- /dev/null +++ b/fpga/usrp3/lib/axi4_sv/PkgAxi.sv @@ -0,0 +1,30 @@ +// +// Copyright 2021 Ettus Research, A National Instruments Brand +// +// SPDX-License-Identifier: LGPL-3.0-or-later +// +// Package: PkgAxi +// Description: +// AXI4 is an ARM standard for memory mapped burst transfers +// For more information on the spec see +// - https://developer.arm.com/docs/ihi0022/d +// +// This package contains types used for AxiIf. +// + +//----------------------------------------------------------------------------- +// AXI4 Package +//----------------------------------------------------------------------------- + +package PkgAxi; + typedef enum logic [1:0] {OKAY=0,SLVERR=2,DECERR=3} axi_resp_t; + // Len - Burst Length = LEN+1 + // Size - Bytes in transfer = 2**SIZE + typedef enum logic [1:0] {FIXED=0,INCR=1,WRAP=2} axi_burst_t; + // Cache - just see the docs. (too tangled!) + // Prot[0] - Privleged + // Prot[1] - Secure + // Prot[2] - 0=Data / 1=Instruction + // QOS - 0 = no protocol - Others not specified in spec + +endpackage : PkgAxi diff --git a/fpga/usrp3/lib/axi4_sv/axi.vh b/fpga/usrp3/lib/axi4_sv/axi.vh new file mode 100644 index 000000000..c2b0c5fd0 --- /dev/null +++ b/fpga/usrp3/lib/axi4_sv/axi.vh @@ -0,0 +1,247 @@ +// +// Copyright 2021 Ettus Research, A National Instruments Brand +// +// SPDX-License-Identifier: LGPL-3.0-or-later +// +// Header File: AxiIf.vh +// Description: Macros for use with AXI4(FULL) +// + +//----------------------------------------------------------------------------- +// AXI4 (FULL) +//----------------------------------------------------------------------------- +// +// Difference between AXILITE and AXI(FULL) +// Address channels contain +// LEN, SIZE, BURST, LOCK, CACHE, PROT, QOS +// Data Channels contain +// LAST + +// Macro that drives o from i for all fields. Of course ready runs in the +// counter direction. +`define AXI4_ASSIGN(O,I) \ + /* write address channel */\ + ``O.awaddr = ``I.awaddr;\ + ``O.awlen = ``I.awlen;\ + ``O.awsize = ``I.awsize;\ + ``O.awburst = ``I.awburst;\ + ``O.awlock = ``I.awlock;\ + ``O.awcache = ``I.awcache;\ + ``O.awprot = ``I.awprot;\ + ``O.awqos = ``I.awqos;\ + ``O.awvalid = ``I.awvalid;\ + ``I.awready = ``O.awready;\ + /* write data channel */\ + ``O.wdata = ``I.wdata;\ + ``O.wstrb = ``I.wstrb;\ + ``O.wlast = ``I.wlast;\ + ``O.wvalid = ``I.wvalid;\ + ``I.wready = ``O.wready;\ + /* write resp channel */\ + ``I.bresp = ``O.bresp;\ + ``I.bvalid = ``O.bvalid;\ + ``O.bready = ``I.bready;\ + /* read address channel */\ + ``O.araddr = ``I.araddr;\ + ``O.arlen = ``I.arlen;\ + ``O.arsize = ``I.arsize;\ + ``O.arburst = ``I.arburst;\ + ``O.arlock = ``I.arlock;\ + ``O.arcache = ``I.arcache;\ + ``O.arprot = ``I.arprot;\ + ``O.arqos = ``I.arqos;\ + ``O.arvalid = ``I.arvalid;\ + ``I.arready = ``O.arready;\ + /* read resp channel */\ + ``I.rdata = ``O.rdata;\ + ``I.rresp = ``O.rresp;\ + ``I.rlast = ``O.rlast;\ + ``I.rvalid = ``O.rvalid;\ + ``O.rready = ``I.rready; + +`define AXI4_PORT_ASSIGN(FORMAL,ACTUAL) \ + .``FORMAL``_aclk(``ACTUAL``.clk),\ + .``FORMAL``_sreset(``ACTUAL``.rst),\ + .``FORMAL``_araddr(``ACTUAL``.araddr),\ + .``FORMAL``_arlen(``ACTUAL``.arlen),\ + .``FORMAL``_arsize(``ACTUAL``.arsize),\ + .``FORMAL``_arburst(``ACTUAL``.arburst),\ + .``FORMAL``_arlock(``ACTUAL``.arlock),\ + .``FORMAL``_arcache(``ACTUAL``.arcache),\ + .``FORMAL``_arprot(``ACTUAL``.arprot),\ + .``FORMAL``_arqos(``ACTUAL``.arqos),\ + .``FORMAL``_arready(``ACTUAL``.arready),\ + .``FORMAL``_arvalid(``ACTUAL``.arvalid),\ + .``FORMAL``_awaddr(``ACTUAL``.awaddr),\ + .``FORMAL``_awlen(``ACTUAL``.awlen),\ + .``FORMAL``_awsize(``ACTUAL``.awsize),\ + .``FORMAL``_awburst(``ACTUAL``.awburst),\ + .``FORMAL``_awlock(``ACTUAL``.awlock),\ + .``FORMAL``_awcache(``ACTUAL``.awcache),\ + .``FORMAL``_awprot(``ACTUAL``.awprot),\ + .``FORMAL``_awqos(``ACTUAL``.awqos),\ + .``FORMAL``_awready(``ACTUAL``.awready),\ + .``FORMAL``_awvalid(``ACTUAL``.awvalid),\ + .``FORMAL``_bready(``ACTUAL``.bready),\ + .``FORMAL``_bresp(``ACTUAL``.bresp[1:0]),\ + .``FORMAL``_bvalid(``ACTUAL``.bvalid),\ + .``FORMAL``_rdata(``ACTUAL``.rdata),\ + .``FORMAL``_rready(``ACTUAL``.rready),\ + .``FORMAL``_rresp(``ACTUAL``.rresp[1:0]),\ + .``FORMAL``_rlast(``ACTUAL``.rlast),\ + .``FORMAL``_rvalid(``ACTUAL``.rvalid),\ + .``FORMAL``_wdata(``ACTUAL``.wdata),\ + .``FORMAL``_wready(``ACTUAL``.wready),\ + .``FORMAL``_wstrb(``ACTUAL``.wstrb),\ + .``FORMAL``_wlast(``ACTUAL``.wlast),\ + .``FORMAL``_wvalid(``ACTUAL``.wvalid), + +`define AXI4_PORT_ASSIGN_NR(FORMAL,ACTUAL) \ + .``FORMAL``_araddr(``ACTUAL``.araddr),\ + .``FORMAL``_arlen(``ACTUAL``.arlen),\ + .``FORMAL``_arsize(``ACTUAL``.arsize),\ + .``FORMAL``_arburst(``ACTUAL``.arburst),\ + .``FORMAL``_arlock(``ACTUAL``.arlock),\ + .``FORMAL``_arcache(``ACTUAL``.arcache),\ + .``FORMAL``_arprot(``ACTUAL``.arprot),\ + .``FORMAL``_arqos(``ACTUAL``.arqos),\ + .``FORMAL``_arready(``ACTUAL``.arready),\ + .``FORMAL``_arvalid(``ACTUAL``.arvalid),\ + .``FORMAL``_awaddr(``ACTUAL``.awaddr),\ + .``FORMAL``_awlen(``ACTUAL``.awlen),\ + .``FORMAL``_awsize(``ACTUAL``.awsize),\ + .``FORMAL``_awburst(``ACTUAL``.awburst),\ + .``FORMAL``_awlock(``ACTUAL``.awlock),\ + .``FORMAL``_awcache(``ACTUAL``.awcache),\ + .``FORMAL``_awprot(``ACTUAL``.awprot),\ + .``FORMAL``_awqos(``ACTUAL``.awqos),\ + .``FORMAL``_awready(``ACTUAL``.awready),\ + .``FORMAL``_awvalid(``ACTUAL``.awvalid),\ + .``FORMAL``_bready(``ACTUAL``.bready),\ + .``FORMAL``_bresp(``ACTUAL``.bresp[1:0]),\ + .``FORMAL``_bvalid(``ACTUAL``.bvalid),\ + .``FORMAL``_rdata(``ACTUAL``.rdata),\ + .``FORMAL``_rready(``ACTUAL``.rready),\ + .``FORMAL``_rresp(``ACTUAL``.rresp[1:0]),\ + .``FORMAL``_rlast(``ACTUAL``.rlast),\ + .``FORMAL``_rvalid(``ACTUAL``.rvalid),\ + .``FORMAL``_wdata(``ACTUAL``.wdata),\ + .``FORMAL``_wready(``ACTUAL``.wready),\ + .``FORMAL``_wstrb(``ACTUAL``.wstrb),\ + .``FORMAL``_wlast(``ACTUAL``.wlast),\ + .``FORMAL``_wvalid(``ACTUAL``.wvalid), + +`define AXI4_DEBUG_ASSIGN(O,I) \ + (* mark_debug = "true" *) logic [``I.ADDR_WIDTH-1:0] ``I``_debug_awaddr;\ + (* mark_debug = "true" *) logic [7:0] ``I``_debug_awlen;\ + (* mark_debug = "true" *) logic [2:0] ``I``_debug_awsize;\ + (* mark_debug = "true" *) logic [1:0] ``I``_debug_awburst;\ + (* mark_debug = "true" *) logic [0:0] ``I``_debug_awlock;\ + (* mark_debug = "true" *) logic [3:0] ``I``_debug_awcache;\ + (* mark_debug = "true" *) logic [2:0] ``I``_debug_awprot;\ + (* mark_debug = "true" *) logic [3:0] ``I``_debug_awqos;\ + (* mark_debug = "true" *) logic ``I``_debug_awvalid;\ + (* mark_debug = "true" *) logic ``I``_debug_awready;\ + (* mark_debug = "true" *) logic [``I.DATA_WIDTH-1:0] ``I``_debug_wdata;\ + (* mark_debug = "true" *) logic [``I.BYTES_PER_WORD-1:0] ``I``_debug_wstrb;\ + (* mark_debug = "true" *) logic ``I``_debug_wlast;\ + (* mark_debug = "true" *) logic ``I``_debug_wvalid;\ + (* mark_debug = "true" *) logic ``I``_debug_wready;\ + (* mark_debug = "true" *) logic [1:0] ``I``_debug_bresp;\ + (* mark_debug = "true" *) logic ``I``_debug_bvalid;\ + (* mark_debug = "true" *) logic ``I``_debug_bready;\ + (* mark_debug = "true" *) logic [``I.ADDR_WIDTH-1:0] ``I``_debug_araddr;\ + (* mark_debug = "true" *) logic [7:0] ``I``_debug_arlen;\ + (* mark_debug = "true" *) logic [2:0] ``I``_debug_arsize;\ + (* mark_debug = "true" *) logic [1:0] ``I``_debug_arburst;\ + (* mark_debug = "true" *) logic [0:0] ``I``_debug_arlock;\ + (* mark_debug = "true" *) logic [3:0] ``I``_debug_arcache;\ + (* mark_debug = "true" *) logic [2:0] ``I``_debug_arprot;\ + (* mark_debug = "true" *) logic [3:0] ``I``_debug_arqos;\ + (* mark_debug = "true" *) logic ``I``_debug_arvalid;\ + (* mark_debug = "true" *) logic ``I``_debug_arready;\ + (* mark_debug = "true" *) logic [``I.DATA_WIDTH-1:0] ``I``_debug_rdata;\ + (* mark_debug = "true" *) logic [1:0] ``I``_debug_rresp;\ + (* mark_debug = "true" *) logic ``I``_debug_rlast;\ + (* mark_debug = "true" *) logic ``I``_debug_rvalid;\ + (* mark_debug = "true" *) logic ``I``_debug_rready;\ + always_comb begin\ + /* write address channel */\ + ``I``_debug_awaddr = ``I.awaddr;\ + ``I``_debug_awlen = ``I.awlen;\ + ``I``_debug_awsize = ``I.awsize;\ + ``I``_debug_awburst = ``I.awburst;\ + ``I``_debug_awlock = ``I.awlock;\ + ``I``_debug_awcache = ``I.awcache;\ + ``I``_debug_awprot = ``I.awprot;\ + ``I``_debug_awqos = ``I.awqos;\ + ``I``_debug_awvalid = ``I.awvalid;\ + ``I.awready = ``I``_debug_awready;\ + /* write data channel */\ + ``I``_debug_wdata = ``I.wdata;\ + ``I``_debug_wstrb = ``I.wstrb;\ + ``I``_debug_wlast = ``I.wlast;\ + ``I``_debug_wvalid = ``I.wvalid;\ + ``I.wready = ``I``_debug_wready;\ + /* write resp channel */\ + ``I.bresp = ``I``_debug_bresp;\ + ``I.bvalid = ``I``_debug_bvalid;\ + ``I``_debug_bready = ``I.bready;\ + /* read address channel */\ + ``I``_debug_araddr = ``I.araddr;\ + ``I``_debug_arlen = ``I.arlen;\ + ``I``_debug_arsize = ``I.arsize;\ + ``I``_debug_arburst = ``I.arburst;\ + ``I``_debug_arlock = ``I.arlock;\ + ``I``_debug_arcache = ``I.arcache;\ + ``I``_debug_arprot = ``I.arprot;\ + ``I``_debug_arqos = ``I.arqos;\ + ``I``_debug_arvalid = ``I.arvalid;\ + ``I.arready = ``I``_debug_arready;\ + /* read resp channel */\ + ``I.rdata = ``I``_debug_rdata;\ + ``I.rresp = ``I``_debug_rresp;\ + ``I.rlast = ``I``_debug_rlast;\ + ``I.rvalid = ``I``_debug_rvalid;\ + ``I``_debug_rready = ``I.rready;\ + end\ + always_comb begin\ + /* write address channel */\ + ``O.awaddr = ``I``_debug_awaddr;\ + ``O.awlen = ``I``_debug_awlen;\ + ``O.awsize = ``I``_debug_awsize;\ + ``O.awburst = ``I``_debug_awburst;\ + ``O.awlock = ``I``_debug_awlock;\ + ``O.awcache = ``I``_debug_awcache;\ + ``O.awprot = ``I``_debug_awprot;\ + ``O.awqos = ``I``_debug_awqos;\ + ``O.awvalid = ``I``_debug_awvalid;\ + ``I``_debug_awready = ``O.awready;\ + /* write data channel */\ + ``O.wdata = ``I``_debug_wdata;\ + ``O.wstrb = ``I``_debug_wstrb;\ + ``O.wlast = ``I``_debug_wlast;\ + ``O.wvalid = ``I``_debug_wvalid;\ + ``I``_debug_wready = ``O.wready;\ + /* write resp channel */\ + ``I``_debug_bresp = ``O.bresp;\ + ``I``_debug_bvalid = ``O.bvalid;\ + ``O.bready = ``I``_debug_bready;\ + /* read address channel */\ + ``O.araddr = ``I``_debug_araddr;\ + ``O.arlen = ``I``_debug_arlen;\ + ``O.arsize = ``I``_debug_arsize;\ + ``O.arburst = ``I``_debug_arburst;\ + ``O.arlock = ``I``_debug_arlock;\ + ``O.arcache = ``I``_debug_arcache;\ + ``O.arprot = ``I``_debug_arprot;\ + ``O.arqos = ``I``_debug_arqos;\ + ``O.arvalid = ``I``_debug_arvalid;\ + ``I``_debug_arready = ``O.arready;\ + /* read resp channel */\ + ``I``_debug_rdata = ``O.rdata;\ + ``I``_debug_rresp = ``O.rresp;\ + ``I``_debug_rvlast = ``O.rlast;\ + ``I``_debug_rvalid = ``O.rvalid;\ + ``O.rready = ``I``_debug_rready;\ + end |