This fixes a bug on wrstb in AxiLiteIf and adds a new AxiLiteIf_v that can be used to stitch onto Verilog port_maps. Original-commit: 6ef642e3ac44c52b98b124f30dc84b1683859989
283 lines
6.4 KiB
Systemverilog
283 lines
6.4 KiB
Systemverilog
//
|
|
// Copyright 2020 Ettus Research, A National Instruments Brand
|
|
//
|
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
|
//
|
|
// Interface: AxiLiteIf
|
|
// Description:
|
|
// AXI4-LITE is an ARM standard for lighter weight registers
|
|
// axis based on the AXI4 protocol. 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-Lite bus
|
|
// - ADDR_WIDTH - Width of the address on AXI4-Lite bus
|
|
//
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// AXI4-Lite interface
|
|
//-----------------------------------------------------------------------------
|
|
|
|
interface AxiLiteIf #(
|
|
int DATA_WIDTH = 64,
|
|
int ADDR_WIDTH = 1
|
|
) (
|
|
input logic clk,
|
|
input logic rst = 1'b0
|
|
);
|
|
|
|
import PkgAxiLite::*;
|
|
|
|
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;
|
|
|
|
// Signals that make up an AxiLite interface
|
|
// Write Address Channel
|
|
addr_t awaddr;
|
|
logic awvalid;
|
|
logic awready;
|
|
|
|
// Write Data Channel
|
|
data_t wdata;
|
|
strb_t wstrb = '1;
|
|
logic wvalid;
|
|
logic wready;
|
|
|
|
// Write Response Channel
|
|
resp_t bresp;
|
|
logic bvalid;
|
|
logic bready;
|
|
|
|
// Read Address Channel
|
|
addr_t araddr;
|
|
logic arvalid;
|
|
logic arready;
|
|
|
|
// Read Data Channel
|
|
data_t rdata;
|
|
resp_t rresp;
|
|
logic rvalid;
|
|
logic rready;
|
|
|
|
// Master Functions
|
|
task automatic drive_aw(input addr_t addr);
|
|
awaddr = addr;
|
|
awvalid = 1;
|
|
endtask
|
|
|
|
task automatic drive_w(input data_t data,
|
|
input strb_t strb = '1);
|
|
wdata = data;
|
|
wstrb = strb;
|
|
wvalid = 1;
|
|
endtask
|
|
|
|
task automatic drive_aw_idle();
|
|
awaddr = 'X;
|
|
awvalid = 0;
|
|
endtask
|
|
|
|
task automatic drive_w_idle();
|
|
wdata = 'X;
|
|
wstrb = 'X;
|
|
wvalid = 0;
|
|
endtask
|
|
task automatic drive_read(input addr_t addr);
|
|
araddr = addr;
|
|
arvalid = 1;
|
|
endtask
|
|
|
|
task automatic drive_read_idle();
|
|
araddr = 'X;
|
|
arvalid = 0;
|
|
endtask
|
|
|
|
// Slave Functions
|
|
task automatic drive_write_resp(input 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 resp_t resp=OKAY);
|
|
rdata = data;
|
|
rresp = resp;
|
|
rvalid = 1;
|
|
endtask
|
|
|
|
task automatic drive_read_resp_idle();
|
|
rdata = 'X;
|
|
rresp = OKAY;
|
|
rvalid = 0;
|
|
endtask
|
|
|
|
// Drive Functions (These are not particularly useful
|
|
// but they guarantee the modules using the package don't
|
|
// drive the interface with a continuous assignment)
|
|
task automatic drive_awaddr(input addr_t addr);
|
|
awaddr = addr;
|
|
endtask
|
|
task automatic drive_awvalid(input logic valid);
|
|
awvalid = valid;
|
|
endtask
|
|
task automatic drive_awready(input logic ready);
|
|
awready = ready;
|
|
endtask
|
|
task automatic drive_wdata(input data_t data);
|
|
wdata = data;
|
|
endtask
|
|
task automatic drive_wstrb(input strb_t strb);
|
|
wstrb = strb;
|
|
endtask
|
|
task automatic drive_wvalid(input logic valid);
|
|
wvalid = valid;
|
|
endtask
|
|
task automatic drive_wready(input logic ready);
|
|
wready = ready;
|
|
endtask
|
|
|
|
task automatic drive_bresp(input resp_t resp);
|
|
bresp = resp;
|
|
endtask
|
|
task automatic drive_bvalid(input logic valid);
|
|
bvalid = valid;
|
|
endtask
|
|
task automatic drive_bready(input logic ready);
|
|
bready = ready;
|
|
endtask
|
|
|
|
task automatic drive_araddr(input addr_t addr);
|
|
araddr = addr;
|
|
endtask
|
|
task automatic drive_arvalid(input logic valid);
|
|
arvalid = valid;
|
|
endtask
|
|
task automatic drive_arready(input logic ready);
|
|
arready = ready;
|
|
endtask
|
|
|
|
task automatic drive_rdata(input data_t data);
|
|
rdata = data;
|
|
endtask
|
|
task automatic drive_rresp(input resp_t resp);
|
|
rresp = resp;
|
|
endtask
|
|
task automatic drive_rvalid(input logic valid);
|
|
rvalid = valid;
|
|
endtask
|
|
task automatic drive_rready(input logic ready);
|
|
rready = ready;
|
|
endtask
|
|
|
|
// View from the master side
|
|
modport master (
|
|
input clk, rst,
|
|
output awaddr,awvalid,wdata,wstrb,wvalid,bready,araddr,arvalid,rready,
|
|
input awready,wready,bresp,bvalid,arready,rdata,rresp,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,awvalid,wdata,wstrb,wvalid,bready,araddr,arvalid,rready,
|
|
output awready,wready,bresp,bvalid,arready,rdata,rresp,rvalid,
|
|
import drive_write_resp,
|
|
import drive_write_resp_idle,
|
|
import drive_read_resp,
|
|
import drive_read_resp_idle
|
|
);
|
|
|
|
endinterface : AxiLiteIf
|
|
|
|
interface AxiLiteIf_v #(
|
|
int DATA_WIDTH = 64,
|
|
int ADDR_WIDTH = 1
|
|
) (
|
|
input logic clk,
|
|
input logic rst = 1'b0
|
|
);
|
|
|
|
import PkgAxiLite::*;
|
|
|
|
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;
|
|
|
|
// Signals that make up an AxiLite interface
|
|
// AXI-Lite
|
|
// Write Address Channel
|
|
addr_t awaddr;
|
|
logic awvalid;
|
|
logic awready;
|
|
|
|
// Write Data Channel
|
|
data_t wdata;
|
|
strb_t wstrb;
|
|
logic wvalid;
|
|
logic wready;
|
|
|
|
// Write Response Channel
|
|
resp_t bresp;
|
|
logic bvalid;
|
|
logic bready;
|
|
|
|
// Read Address Channel
|
|
addr_t araddr;
|
|
logic arvalid;
|
|
logic arready;
|
|
|
|
// Read Data Channel
|
|
data_t rdata;
|
|
resp_t rresp;
|
|
logic rvalid;
|
|
logic rready;
|
|
|
|
// View from the master side
|
|
modport master (
|
|
input clk, rst,
|
|
output awaddr,awvalid,wdata,wstrb,wvalid,bready,araddr,arvalid,rready,
|
|
input awready,wready,bresp,bvalid,arready,rdata,rresp,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,awvalid,wdata,wstrb,wvalid,bready,araddr,arvalid,rready,
|
|
output awready,wready,bresp,bvalid,arready,rdata,rresp,rvalid,
|
|
import drive_write_resp,
|
|
import drive_write_resp_idle,
|
|
import drive_read_resp,
|
|
import drive_read_resp_idle
|
|
|
|
);
|
|
|
|
endinterface : AxiLiteIf_v
|