fpga: lib: Add RegPort SystemVerilog interface
Original-commit: d628c136a0cca7dddc47711f86f52f2c9e2ca089
This commit is contained in:
@@ -63,4 +63,5 @@ axil_ctrlport_master.v\
|
|||||||
handshake.v\
|
handshake.v\
|
||||||
ctrlport_to_regport.v \
|
ctrlport_to_regport.v \
|
||||||
glitch_free_mux.v \
|
glitch_free_mux.v \
|
||||||
|
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
|
||||||
|
|
||||||
Reference in New Issue
Block a user