33 class axi_seq :
public uvm_sequence <axi_seq_item> {
public:
38 const int clearmemory = 0;
50 new (
string name=
"axi_seq");
71 uvm_info(this.get_type_name(),
72 "Looking for AXI_DATA_WIDTH in uvm_config_db",
75 if (!uvm_config_db <int> ::get(null,
"",
"AXI_DATA_WIDTH", dwidth)) {
76 uvm_fatal(this.get_type_name(),
77 "Unable to fetch AXI_DATA_WIDTH from config db.")
94 uvm_info(this.get_type_name(),
95 $sformatf(
"set_transaction_count(%0d)",count),
119 bit <7:0> localbuffer [];
121 bit <7:0> expected_data;
126 string expected_data_s;
128 string localbuffer_s;
131 bit <7:0> expected_data_array [];
134 if (write_item.burst_type==
e_FIXED) {
136 idatacntr=2**write_item.burst_size;
144 expected_data_array=
new[read_item.data.size()];
151 localbuffer=
new[2**write_item.burst_size];
152 for (
int y=0;y <localbuffer.size();y++) {
155 for (
int y=0;y <write_item.len;y++) {
156 localbuffer[yy++]=write_item.data[y];
157 if (yy >= 2**write_item.burst_size) {
163 for (
int y=0; y <expected_data_array.size(); y++) {
164 expected_data_array[y]=localbuffer[yy++];
165 if (yy >= localbuffer.size()) {
170 for (
int y=0;y <read_item.data.size();y++) {
171 expected_data = expected_data_array[y];
172 read_data = read_item.data[y];
173 if (expected_data!=read_data) {
178 assert (miscompare_cntr==0)
else {
184 for (
int z=0;z <write_item.data.size();z++) {
185 $sformat(write_item_s,
"%s 0x%2x", write_item_s, write_item.data[z]);
188 for (
int z=0;z <read_item.data.size();z++) {
189 $sformat(read_item_s,
"%s 0x%2x", read_item_s, read_item.data[z]);
192 for (
int z=0;z <expected_data_array.size();z++) {
193 $sformat(expected_data_s,
"%s 0x%2x", expected_data_s, expected_data_array[z]);
196 for (
int z=0;z <localbuffer.size();z++) {
197 $sformat(localbuffer_s,
"%s 0x%2x", localbuffer_s, localbuffer[z]);
201 uvm_error(
"AXI READBACK e_FIXED miscompare",
202 $sformatf(
"%0d miscompares between expected and actual data items. \nExpected: %s \n Actual: %s; \nWritten: %s \nLocalbuffer: %s", miscompare_cntr, expected_data_s, read_item_s, write_item_s, localbuffer_s ));
207 }
else if (write_item.burst_type==
e_INCR || write_item.burst_type==
e_WRAP) {
208 for (
int z=0;z <write_item.len;z++) {
209 read_data=read_item.data[z];
210 expected_data=write_item.data[z];
211 assert(expected_data==read_data)
else {
213 uvm_error(
"AXI READBACK e_INCR miscompare",
214 $sformatf(
"expected: 0x%0x actual:0x%0x",
221 uvm_error(this.get_type_name(),
222 $sformatf(
"Unsupported burst type %0d", write_item.burst_type))
226 return (miscompare_cntr == 0);
void set_transaction_count(int count)
How many transactions?
Extremely simple memory model with just write() and read() methods.
bit< 2:0 > max_burst_size
new(string name="axi_seq")
Constructor.
uvm_object_utils(axi_seq) const int clearmemory=0
Writes to memory over AXI, backdoor readback, then AXI readback.
bit compare_items(ref axi_seq_item write_item, ref axi_seq_item read_item)
Compares the write-item with the corresponding read_item.
contains all data and functions related to axi and usage