55 new (
string name=
"axi_pipelined_reads_seq");
84 id=item.get_transaction_id();
90 uvm_info(
"LLLLLLLLLLLLLLL",
91 $sformatf(
"SEQ_response_handler id:%0d uaddr=0x%0x laddr=0x%0x",
92 id, lower_addr, upper_addr),
96 .lower_addr (lower_addr),
97 .upper_addr (upper_addr))) {
98 uvm_info(
"MISCOMPARE",
"Miscompare error", UVM_INFO)
102 uvm_info(
"axi_seq::response_handler::sending event ",
103 $sformatf(
"xfers_done:%0d xfers_to_send: %0d sending event",
110 uvm_info(this.get_type_name(),
111 $sformatf(
"SEQ_response_handler xfers_done=%0d/%0d. Item: %s",
163 use_response_handler(1);
165 if (!uvm_config_db <memory> ::get(null,
"",
"m_memory",
m_memory)) {
166 uvm_fatal(this.get_type_name,
"Unable to fetch m_memory from config db.")
181 if (clearmemory==1) {
187 read_item[xfer_cnt] = axi_seq_item::type_id::create(
"read_item");
194 addr_hi=addr_lo+0x100;
202 assert( read_item[xfer_cnt].randomize() with {
204 burst_size <= local::max_burst_size;
206 addr >= local::addr_lo;
207 addr < local::addr_hi;
215 case (read_item[xfer_cnt].burst_type) {
218 Lower_Wrap_Boundary = read_item[xfer_cnt].addr;
219 Upper_Wrap_Boundary = Lower_Wrap_Boundary + (2**read_item[xfer_cnt].burst_size);
223 Lower_Wrap_Boundary = read_item[xfer_cnt].addr;
224 Upper_Wrap_Boundary = Lower_Wrap_Boundary + read_item[xfer_cnt].len;
229 .burst_size(read_item[xfer_cnt].burst_size),
230 .burst_length(read_item[xfer_cnt].len)) + 1;
232 dtsize = (2**read_item[xfer_cnt].burst_size) * max_beat_cnt;
234 Lower_Wrap_Boundary = (int(read_item[xfer_cnt].addr/dtsize) * dtsize);
235 Upper_Wrap_Boundary = Lower_Wrap_Boundary + dtsize;
240 write_addr = read_item[xfer_cnt].addr;
241 for (
int i=0;i <read_item[xfer_cnt].len;i++) {
244 if (write_addr >= Upper_Wrap_Boundary) {
245 write_addr = Lower_Wrap_Boundary;
249 start_item(read_item[xfer_cnt]);
251 uvm_info(
"YOYOYOYOYOYO",
252 $sformatf(
"Transactionid: %0d", read_item[xfer_cnt].get_transaction_id()),
255 uvm_info(this.get_type_name(),
256 $sformatf(
"item %0d id:0x%0x addr_lo: 0x%0x addr_hi: 0x%0x",
257 xfer_cnt, xid, addr_lo,addr_hi),
263 if (
valid.size() > 0) {
264 read_item[xfer_cnt].valid =
new[
valid.size()](
valid);
267 uvm_info(
"DATA", $sformatf(
"\n\n\nItem %0d: %s", xfer_cnt, read_item[xfer_cnt].convert2string()), UVM_INFO)
268 finish_item(read_item[xfer_cnt]);
273 uvm_info(
"READBACK",
"writes done. waiting for event trigger", UVM_INFO)
275 uvm_info(
"READBACK",
"event trigger detected1111", UVM_INFO)
277 uvm_info(this.get_type_name(),
"SEQ ALL DONE", UVM_INFO)
bit< ADDR_WIDTH-1:0 > laddr
bit< C_AXI_LEN_WIDTH-1:0 > calculate_axlen(input bit< C_AXI_ADDR_WIDTH-1:0 > addr, input bit< 2:0 > burst_size, input shortint burst_length)
calculate awlen or arlen
bit< ADDR_WIDTH-1:0 > uaddr
string convert2string()
Convert item's variable into one printable string.
rand bit< ID_WIDTH-1:0 > id
Backdoor memory writes, then reads from memory over AXI.
bit seq_item_check(ref axi_seq_item item, input bit< ADDR_WIDTH-1:0 > lower_addr, input bit< ADDR_WIDTH-1:0 > upper_addr)
Compares an axi_seq_item's data and burst_type against expected matching memory contents.
uvm_object_utils(axi_pipelined_reads_seq) axi_seq_item read_item[]
virtual void write(input bit< ADDR_WIDTH-1:0 > addr, input bit< 7:0 > data)
Writes into memory.
mem_chk_s mem_chk_array[*]
new(string name="axi_pipelined_reads_seq")
Constructor.
task body()
Does all the work.
void response_handler(uvm_sequence_item response)
Handles write responses, including verifying memory via backdoor reads.
Writes to memory over AXI, backdoor readback, then AXI readback.
contains all data and functions related to axi and usage