sim: Split PkgRfnocBlockCtrlBfm into separate packages
Original-commit: 369594ef16d7b2d519940269d2af035cfe648f50
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
//
|
||||
// Copyright 2020 Ettus Research, A National Instruments Company
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
//
|
||||
// Module: PkgCtrlIfaceBfm
|
||||
//
|
||||
// Description: This package includes high-level bus functional models (BFM)
|
||||
// for the AXIS-Ctrl interface of a Stream Endpoint.
|
||||
//
|
||||
|
||||
|
||||
package PkgCtrlIfaceBfm;
|
||||
|
||||
import PkgChdrUtils::*;
|
||||
import PkgAxisCtrlBfm::*;
|
||||
|
||||
|
||||
class CtrlIfaceBfm extends AxisCtrlBfm;
|
||||
ctrl_port_t dst_port;
|
||||
ctrl_port_t src_port;
|
||||
ctrl_seq_num_t seq_num;
|
||||
|
||||
// Class constructor to create a new BFM instance.
|
||||
//
|
||||
// m_chdr: Interface for the master connection (BFM's AXIS output)
|
||||
// s_chdr: Interface for the slave connection (BFM's AXIS input)
|
||||
// src_port: Source port to use in generated control packets
|
||||
//
|
||||
function new(
|
||||
virtual AxiStreamIf #(32).master m_chdr,
|
||||
virtual AxiStreamIf #(32).slave s_chdr,
|
||||
ctrl_port_t dst_port,
|
||||
ctrl_port_t src_port
|
||||
);
|
||||
super.new(m_chdr, s_chdr);
|
||||
this.dst_port = dst_port;
|
||||
this.src_port = src_port;
|
||||
this.seq_num = '0;
|
||||
endfunction : new
|
||||
|
||||
|
||||
// Send an AXIS-Ctrl read request packet and get the response.
|
||||
//
|
||||
// addr: Address for the read request
|
||||
// word: Data word that was returned in response to the read
|
||||
//
|
||||
task reg_read (
|
||||
input ctrl_address_t addr,
|
||||
output ctrl_word_t word
|
||||
);
|
||||
AxisCtrlPacket ctrl_packet;
|
||||
|
||||
// Create the AXIS-Ctrl packet
|
||||
ctrl_packet = new();
|
||||
ctrl_packet.header = '{
|
||||
seq_num : seq_num++,
|
||||
num_data : 1,
|
||||
src_port : src_port,
|
||||
dst_port : dst_port,
|
||||
default : 0
|
||||
};
|
||||
ctrl_packet.op_word = '{
|
||||
op_code : CTRL_OP_READ,
|
||||
byte_enable : ~0,
|
||||
address : addr,
|
||||
default : 0
|
||||
};
|
||||
ctrl_packet.data = { 0 };
|
||||
|
||||
// Send the control packet and get the response
|
||||
put_ctrl(ctrl_packet);
|
||||
get_ctrl(ctrl_packet);
|
||||
word = ctrl_packet.data[0];
|
||||
|
||||
assert(ctrl_packet.header.is_ack == 1 &&
|
||||
ctrl_packet.op_word.status == CTRL_STS_OKAY) else begin
|
||||
$fatal(1, "CtrlIfaceBfm::reg_read: Did not receive CTRL_STS_OKAY status");
|
||||
end
|
||||
endtask : reg_read
|
||||
|
||||
|
||||
// Send an AXIS-Ctrl write request packet and get the response.
|
||||
//
|
||||
// addr: Address for the write request
|
||||
// word: Data word to write
|
||||
//
|
||||
task reg_write (
|
||||
ctrl_address_t addr,
|
||||
ctrl_word_t word
|
||||
);
|
||||
AxisCtrlPacket ctrl_packet;
|
||||
|
||||
// Create the AXIS-Ctrl packet
|
||||
ctrl_packet = new();
|
||||
ctrl_packet.header = '{
|
||||
seq_num : seq_num++,
|
||||
num_data : 1,
|
||||
src_port : src_port,
|
||||
dst_port : dst_port,
|
||||
default : 0
|
||||
};
|
||||
ctrl_packet.op_word = '{
|
||||
op_code : CTRL_OP_WRITE,
|
||||
byte_enable : ~0,
|
||||
address : addr,
|
||||
default : 0
|
||||
};
|
||||
|
||||
// Send the packet and get the response
|
||||
ctrl_packet.data = { word };
|
||||
put_ctrl(ctrl_packet);
|
||||
get_ctrl(ctrl_packet);
|
||||
word = ctrl_packet.data[0];
|
||||
|
||||
assert(ctrl_packet.header.is_ack == 1 &&
|
||||
ctrl_packet.op_word.status == CTRL_STS_OKAY) else begin
|
||||
$fatal(1, "CtrlIfaceBfm::reg_write: Did not receive CTRL_STS_OKAY status");
|
||||
end
|
||||
endtask : reg_write
|
||||
|
||||
endclass : CtrlIfaceBfm
|
||||
|
||||
|
||||
endpackage : PkgCtrlIfaceBfm
|
||||
Reference in New Issue
Block a user