From 2a74e8cd67cfdf573680f2def99809e0ab166691 Mon Sep 17 00:00:00 2001 From: Wade Fife Date: Wed, 25 May 2022 22:25:46 -0500 Subject: [PATCH] fpga: lib: Add RegPort SystemVerilog interface Original-commit: d628c136a0cca7dddc47711f86f52f2c9e2ca089 --- lib/control/Makefile.srcs | 1 + lib/control/regport_if.sv | 96 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 lib/control/regport_if.sv diff --git a/lib/control/Makefile.srcs b/lib/control/Makefile.srcs index 47ea3a5..99d2544 100644 --- a/lib/control/Makefile.srcs +++ b/lib/control/Makefile.srcs @@ -63,4 +63,5 @@ axil_ctrlport_master.v\ handshake.v\ ctrlport_to_regport.v \ glitch_free_mux.v \ +regport_if.sv \ )) diff --git a/lib/control/regport_if.sv b/lib/control/regport_if.sv new file mode 100644 index 0000000..ab51685 --- /dev/null +++ b/lib/control/regport_if.sv @@ -0,0 +1,96 @@ +// +// Copyright 2022 Ettus Research, a National Instruments Brand +// +// SPDX-License-Identifier: LGPL-3.0-or-later +// +// Interface: regport_if +// +// Description: RegPort interface for SystemVerilog. +// + +interface regport_if #( + int AWIDTH = 14, + int DWIDTH = 32 +) ( + input logic clk, + input logic rst = 1'b0 +); + + logic wr_req; + logic [AWIDTH-1:0] wr_addr; + logic [DWIDTH-1:0] wr_data; + + logic rd_req; + logic [AWIDTH-1:0] rd_addr; + logic rd_resp; + logic [DWIDTH-1:0] rd_data; + + // View from the master side + modport master ( + input clk, + input rst, + output wr_req, + output wr_addr, + output wr_data, + output rd_req, + output rd_addr, + input rd_resp, + input rd_data + ); + + // View from the slave side + modport slave ( + input clk, + input rst, + input wr_req, + input wr_addr, + input wr_data, + input rd_req, + input rd_addr, + output rd_resp, + output rd_data + ); + + //--------------------------------------------------------------------------- + // Simulation Tasks + //--------------------------------------------------------------------------- + + //synthesis translate_off + + function automatic void init(); + wr_req <= 1'b0; + wr_addr <= 'X; + wr_data <= 'X; + rd_req <= 1'b0; + rd_addr <= 'X; + endfunction : init + + task automatic write(bit [AWIDTH-1:0] addr, bit [DWIDTH-1:0] data); + @(posedge clk); + wr_req <= 1'b1; + wr_addr <= addr; + wr_data <= data; + @(posedge clk); + init(); + endtask : write + + task automatic read(bit [AWIDTH-1:0] addr, output bit [DWIDTH-1:0] data); + @(posedge clk); + rd_req <= 1'b1; + rd_addr <= addr; + forever begin + @(posedge clk); + rd_req <= 1'b0; + rd_addr <= 'X; + if (rd_resp) begin + data = rd_data; + break; + end + end + init(); + endtask : read + + //synthesis translate_on + +endinterface : regport_if +