44 new (
string name=
"axi_responder", uvm_component parent=null);
62 super.new(name, parent);
67 super.build_phase(phase);
69 vif = axi_if_abstract::type_id::create(
"vif",
this);
77 super.connect_phase(phase);
104 seq_item_port.get(item);
106 uvm_info(this.get_type_name(),
172 uvm_info(this.get_type_name(),
173 $sformatf(
"axi_responder::write_data - Waiting for data for %s",
177 while (wlast != 0b1) {
178 vif.wait_for_write_data(.s(s));
208 int wait_clks_before_next_b;
215 uvm_info(this.get_type_name(),
216 $sformatf(
"axi_responder::write_response - Waiting for data for %s",
221 vif.wait_for_clks(.cnt(1));
224 if (vif.get_bready_bvalid == 0b1) {
230 wait_clks_before_next_b=$urandom_range(maxval,minval);
233 if (wait_clks_before_next_b==0) {
250 vif.write_b(.s(s), .valid(0b1));
251 if (wait_clks_before_next_b > 0) {
252 vif.wait_for_clks(.cnt(wait_clks_before_next_b-1));
261 vif.write_b(.s(s), .valid(0b0));
262 vif.wait_for_clks(.cnt(1));
299 int wait_clks_before_next_r;
307 int valid_assert_bit;
308 int clks_without_rvalid_or_rready;
318 .burst_length(item.
len)) + 1;
320 validcntr_max=item.
valid.size();
321 clks_without_rvalid_or_rready=0;
326 vif.wait_for_clks(.cnt(1));
330 s.
rdata = 0xfeed_beef;
336 if (vif.get_rready()==0b1 && vif.get_rvalid() == 10b1) {
347 if (beat_cntr >= beat_cntr_max) {
354 wait_clks_before_next_r=$urandom_range(maxval,minval);
357 if (wait_clks_before_next_r==0) {
364 .burst_length(item.
len)) + 1;
366 validcntr_max=item.
valid.size();
367 clks_without_rvalid_or_rready=0;
383 if (vif.get_rready()==0b0 && vif.get_rvalid() == 10b0) {
384 clks_without_rvalid_or_rready++;
388 valid_assert_bit=$urandom_range(j-1,0);
389 item.
valid[valid_assert_bit] = 0b1;
390 uvm_info(
"axi_driver::write_data",
391 $sformatf(
"%0d clocks without ready/valid overlap. Setting another valid[], bit %0d, to 1", clks_without_rvalid_or_rready, valid_assert_bit),
393 clks_without_rvalid_or_rready=0;
401 uvm_info(this.get_type_name(),
402 $sformatf(
"Calling get_beat_N_data: %s",
407 .data_bus_bytes(vif.get_data_bus_width()/8),
412 for (
int x=0;x <vif.get_data_bus_width()/8;x++) {
413 s.
rdata[x*8+:8] = rdata[x];
426 if (vif.get_rready()==0b1 && vif.get_rvalid() == 10b1) {
428 uvm_info(this.get_type_name(),
429 $sformatf(
"debuga validcntr=%0d",validcntr),
433 uvm_info(this.get_type_name(),
434 $sformatf(
"debugb validcntr=%0d",validcntr),
436 }
else if (vif.get_rvalid() == 0b0) {
438 uvm_info(this.get_type_name(),
439 $sformatf(
"debugc validcntr=%0d",validcntr),
443 if (validcntr >= validcntr_max) {
461 if (wait_clks_before_next_r > 0) {
462 vif.wait_for_clks(.cnt(wait_clks_before_next_r-1));
Logic to act as an AXI slave (responder) for all 5 channels.
task run_phase(uvm_phase phase)
Launches channel responder threads and then acts as a dispatcher.
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
mailbox< axi_seq_item > writedata_mbx
rand bit< 31:0 > arready_toggle_pattern
string convert2string()
Convert item's variable into one printable string.
byte clks_without_rvalid_or_rready_max
Extremely simple memory model with just write() and read() methods.
logic< C_AXI_ID_WIDTH-1:0 > bid
task write_address()
Write Address channel thread.
This packed struct is used to send read data channel information between the DUT and TB...
mailbox< axi_seq_item > writeresponse_mbx
rand bit< 31:0 > awready_toggle_pattern
This packed struct is used to send write address channel information between the DUT and TB...
mailbox< axi_seq_item > readdata_mbx
logic< C_AXI_DATA_WIDTH-1:0 > rdata
mailbox< axi_seq_item > writeaddress_mbx
rand bit< ADDR_WIDTH-1:0 > addr
void build_phase(uvm_phase phase)
Creates the virtual interface.
void connect_phase(uvm_phase phase)
Nothing to connect so doesn't actually do anything except call parent connect phase.
rand byte max_clks_between_r_transfers
abstract base class for polymorphic interface class (axi_if_concrete) for AXI UVM environment ...
rand byte max_clks_between_b_transfers
task read_address()
Read Address channel thread.
bit axi_incompatible_rvalid_toggling_mode
rand logic< 2:0 > burst_size
void get_beat_N_data(input int beat_cnt, input int data_bus_bytes, ref bit< 7:0 > data[], ref bit wstrb[], output bit wlast)
return beat values for write data and read data channels
task write_response()
Write Response channel thread.
logic< C_AXI_ID_WIDTH-1:0 > rid
mailbox< axi_seq_item > readaddress_mbx
rand byte min_clks_between_r_transfers
This packed struct is used to send write data channel information between the DUT and TB...
uvm_component_utils(axi_responder) axi_if_abstract vif
task write_data()
Write Data channel thread.
axi_agent_config m_config
This packed struct is used to send write response channel information between the DUT and TB...
Configuration object for an axi_agent.
rand bit< 31:0 > wready_toggle_pattern
new(string name="axi_responder", uvm_component parent=null)
Constructor.
rand byte min_clks_between_b_transfers
contains all data and functions related to axi and usage
task read_data()
Read Data channel thread.