Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 91 additions & 33 deletions library/vip/amd/axis/m_axis_sequencer.sv
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,11 @@ package m_axis_sequencer_pkg;
import logger_pkg::*;

typedef enum {
DATA_GEN_MODE_TEST_DATA, // get data from test
DATA_GEN_MODE_AUTO_INCR, // autogenerate incrementing data until aborted
DATA_GEN_MODE_AUTO_RAND // autogenerate randomized data until aborted
DATA_GEN_MODE_TEST_DATA, // get data from test
DATA_GEN_MODE_TEST_DATA_TKEEP, // get data from test, with user-defined tkeep
DATA_GEN_MODE_AUTO_INCR, // autogenerate incrementing data until aborted
DATA_GEN_MODE_AUTO_INCR_TKEEP, // autogenerate incrementing data until aborted, with user-defined tkeep
DATA_GEN_MODE_AUTO_RAND // autogenerate randomized data until aborted
} data_gen_mode_t;

typedef enum bit [1:0] {
Expand Down Expand Up @@ -81,10 +83,12 @@ package m_axis_sequencer_pkg;
protected event packet_done;
protected event queue_empty;
protected event byte_stream_ev;
protected event tkeep_stream_ev;
protected event queue_ev;

protected axi4stream_transaction trans;
protected xil_axi4stream_data_byte byte_stream [$];
protected xil_axi4stream_strb tkeep_stream [$];

typedef struct{
int num_bytes;
Expand All @@ -94,7 +98,6 @@ package m_axis_sequencer_pkg;

protected descriptor_t descriptor_q [$];


// new
function new(
input string name,
Expand All @@ -115,7 +118,6 @@ package m_axis_sequencer_pkg;
this.keep_all = 1;
endfunction: new


// set vif proxy to drive outputs with 0 when inactive
virtual task set_inactive_drive_output_0();
this.fatal($sformatf("Base class was instantiated instead of the parameterized class!"));
Expand Down Expand Up @@ -159,7 +161,6 @@ package m_axis_sequencer_pkg;
this.fatal($sformatf("Base class was instantiated instead of the parameterized class!"));
endtask: packet_sent


// set disable policy
function void set_stop_policy(input stop_policy_t stop_policy);
if (enabled)
Expand Down Expand Up @@ -268,8 +269,9 @@ package m_axis_sequencer_pkg;
if (enabled || (!enabled && stop_policy == STOP_POLICY_DESCRIPTOR_QUEUE)) begin
packetize();
descriptor_delay_subroutine();
end else
end else begin
@enable_ev;
end
end else begin
this.queue_empty_sig = 1;
->> queue_empty;
Expand All @@ -288,6 +290,11 @@ package m_axis_sequencer_pkg;
->>byte_stream_ev;
endfunction: push_byte_for_stream

function void push_tkeep_for_stream(xil_axi4stream_strb tkeep_stream);
this.tkeep_stream.push_back(tkeep_stream);
->>tkeep_stream_ev;
endfunction: push_tkeep_for_stream

// descriptor delay subroutine
// - can be overridden in inherited classes for more specific delay generation
protected task data_beat_delay_subroutine();
Expand Down Expand Up @@ -322,7 +329,6 @@ package m_axis_sequencer_pkg;

protected axi4stream_mst_driver #(`AXIS_VIP_IF_PARAMS(AXIS)) driver;


function new(
input string name,
input axi4stream_mst_driver #(`AXIS_VIP_IF_PARAMS(AXIS)) driver,
Expand All @@ -335,7 +341,6 @@ package m_axis_sequencer_pkg;
this.driver.vif_proxy.set_no_insert_x_when_keep_low(1);
endfunction: new


// wait until data beat is sent
virtual task beat_sent();
if (this.driver.is_driver_idle()) begin
Expand Down Expand Up @@ -403,41 +408,94 @@ package m_axis_sequencer_pkg;

for (int tc=0; tc<packet_length; tc++) begin : packet_loop
data = new[byte_per_beat];
for (int i=0; i<byte_per_beat; i++)
data[i] = 'd0;
keep = new[byte_per_beat];
for (int i=0; i<byte_per_beat; i++) begin
data[i] = 'd0;
keep[i] = 1'b0;
end

for (int i=0; i<byte_per_beat && (keep_all || tc*byte_per_beat+i<descriptor.num_bytes); i++) begin
case (data_gen_mode)
DATA_GEN_MODE_TEST_DATA:
DATA_GEN_MODE_TEST_DATA: begin
// block transfer until we get data from byte stream queue
if (byte_stream.size() == 0) begin
fork begin
fork
@byte_stream_ev;
begin
@disable_ev;
if (tc==0 && i==0) begin
case (stop_policy)
STOP_POLICY_PACKET: ->> packet_done;
STOP_POLICY_DATA_BEAT: ->> beat_done;
default: ;
endcase
end
end
join_any
disable fork;
end join
end
data[i] = byte_stream.pop_front();
keep[i] = 1'b1;
end
DATA_GEN_MODE_TEST_DATA_TKEEP: begin
// block transfer until we get data from byte stream queue
forever begin
if (byte_stream.size() > 0) begin
data[i] = byte_stream.pop_front();
keep[i] = 1'b1;
break;
end else
fork begin
fork
@byte_stream_ev;
begin
@disable_ev;
if (tc==0 && i==0) begin
case (stop_policy)
STOP_POLICY_PACKET: ->> packet_done;
STOP_POLICY_DATA_BEAT: ->> beat_done;
default: ;
endcase
end
if (byte_stream.size() == 0 || tkeep_stream.size() == 0) begin
fork begin
fork
begin
if (byte_stream.size() == 0) begin
@byte_stream_ev;
end
if (tkeep_stream.size() == 0) begin
@tkeep_stream_ev;
end
join_any
disable fork;
end join
end
begin
@disable_ev;
if (tc==0 && i==0) begin
case (stop_policy)
STOP_POLICY_PACKET: ->> packet_done;
STOP_POLICY_DATA_BEAT: ->> beat_done;
default: ;
endcase
end
end
join_any
disable fork;
end join
end
data[i] = byte_stream.pop_front();
keep[i] = tkeep_stream.pop_front();
end
DATA_GEN_MODE_AUTO_INCR: begin
data[i] = byte_count++;
keep[i] = 1'b1;
end
DATA_GEN_MODE_AUTO_INCR_TKEEP: begin
// block transfer until we get data from tkeep stream queue
if (tkeep_stream.size() == 0) begin
fork begin
fork
@tkeep_stream_ev;
begin
@disable_ev;
if (tc==0 && i==0) begin
case (stop_policy)
STOP_POLICY_PACKET: ->> packet_done;
STOP_POLICY_DATA_BEAT: ->> beat_done;
default: ;
endcase
end
end
join_any
disable fork;
end join
end
data[i] = byte_count++;;
keep[i] = tkeep_stream.pop_front();
end
DATA_GEN_MODE_AUTO_RAND: begin
data[i] = $random;
keep[i] = 1'b1;
Expand Down
4 changes: 2 additions & 2 deletions testbenches/ip/util_axis_fifo_asym/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ LIB_DEPS += util_axis_fifo
LIB_DEPS += util_axis_fifo_asym

# default test program
TP := test_program
TP := $(notdir $(basename $(wildcard tests/*.sv)))

# config files should have the following format
# cfg_<param1>_<param2>.tcl
Expand All @@ -27,7 +27,7 @@ CFG_FILES := $(notdir $(wildcard cfgs/cfg*.tcl))

# List of tests and configuration combinations that has to be run
# Format is: <configuration>:<test name>
TESTS := $(foreach cfg, $(basename $(CFG_FILES)), $(cfg):$(TP))
TESTS := $(foreach cfg, $(basename $(CFG_FILES)), $(addprefix $(cfg):, $(TP)))

include ../../../scripts/project-sim.mk

Expand Down
44 changes: 44 additions & 0 deletions testbenches/ip/util_axis_fifo_asym/cfgs/cfg_tkeep.tcl
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
global ad_project_params

set async_clk [expr int(rand()*2)]
set ad_project_params(ASYNC_CLK) $async_clk

set tkeep_en 1
set ad_project_params(TKEEP_EN) $tkeep_en

set tlast_en [expr int(rand()*2)]
set ad_project_params(TLAST_EN) $tlast_en

set random_width [expr int(8*pow(2, int(7.0*rand()+1)))]
set INPUT_WIDTH $random_width
set ad_project_params(INPUT_WIDTH) $INPUT_WIDTH

set random_width [expr int(8*pow(2, int(7.0*rand()+1)))]
set OUTPUT_WIDTH $random_width
set ad_project_params(OUTPUT_WIDTH) $OUTPUT_WIDTH

set reduced_fifo [expr int(rand()*2)]
set ad_project_params(REDUCED_FIFO) $reduced_fifo

if {$reduced_fifo} {
if {$INPUT_WIDTH > $OUTPUT_WIDTH} {
set RATIO $INPUT_WIDTH/$OUTPUT_WIDTH
} else {
set RATIO $OUTPUT_WIDTH/$INPUT_WIDTH
}
} else {
set RATIO 1
}

set random_width [expr int(int(log($RATIO)/log(2))+4.0*rand()+1)]
set ad_project_params(ADDRESS_WIDTH) $random_width

set input_clk [expr int(rand()*9)+1]
set ad_project_params(INPUT_CLK) $input_clk

if {$async_clk} {
set output_clk [expr int(rand()*9)+1]
set ad_project_params(OUTPUT_CLK) $output_clk
} else {
set ad_project_params(OUTPUT_CLK) $input_clk
}
1 change: 1 addition & 0 deletions testbenches/ip/util_axis_fifo_asym/system_project.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ source $ad_tb_dir/library/includes/sp_include_scoreboard.tcl
adi_sim_project_files [list \
"environment.sv" \
"tests/test_program.sv" \
"tests/test_tkeep.sv" \
]

#set a default test program
Expand Down
Loading