1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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
|