@@ -65,6 +65,8 @@ package m_axis_sequencer_pkg;
6565
6666 protected bit descriptor_gen_mode; // 0 - get descriptor from test;
6767 // 1 - autogenerate descriptor based on the first descriptor from test until aborted
68+ protected bit keep_all; // 0 - bytes can be set to be invalid
69+ // 1 - all bytes are always valid, data is generated only for the set part
6870
6971 protected int byte_count;
7072
@@ -102,6 +104,7 @@ package m_axis_sequencer_pkg;
102104 this .descriptor_delay = 0 ;
103105 this .stop_policy = STOP_POLICY_DATA_BEAT ;
104106 this .queue_empty_sig = 1 ;
107+ this .keep_all = 0 ;
105108 endfunction : new
106109
107110
@@ -168,6 +171,20 @@ package m_axis_sequencer_pkg;
168171 `INFOV ((" Descriptor delay configured" ), 55 );
169172 endfunction : set_descriptor_delay
170173
174+ // set all bytes valid in a sample, sets keep to 1
175+ function void set_keep_all ();
176+ if (enabled)
177+ `ERROR ((" Sequencer must be disabled before configuring keep all parameter" ));
178+ this .keep_all = 1 ;
179+ endfunction : set_keep_all
180+
181+ // bytes in a sample may not be valid, sets some bits of keep to 0
182+ function void set_keep_some ();
183+ if (enabled)
184+ `ERROR ((" Sequencer must be disabled before configuring keep all parameter" ));
185+ this .keep_all = 0 ;
186+ endfunction : set_keep_some
187+
171188 // create transfer descriptor
172189 function void add_xfer_descriptor (
173190 input int bytes_to_generate,
@@ -297,6 +314,7 @@ package m_axis_sequencer_pkg;
297314 super .new ();
298315
299316 this .agent = agent;
317+ this .agent.vif_proxy.set_no_insert_x_when_keep_low (1 );
300318 endfunction : new
301319
302320
@@ -336,19 +354,26 @@ package m_axis_sequencer_pkg;
336354
337355 `INFOV ((" packetize start" ), 55 );
338356 byte_per_beat = AXIS_VIP_DATA_WIDTH / 8 ;
339- data = new [byte_per_beat];
340- keep = new [byte_per_beat];
341357 descriptor = descriptor_q.pop_front ();
342358
343359 // put a copy of the descriptor back into the queue and continue processing
344360 if (this .descriptor_gen_mode == 1 && enabled)
345361 descriptor_q.push_back (descriptor);
346362
347363 packet_length = descriptor.num_bytes / byte_per_beat;
364+ if (packet_length* byte_per_beat < descriptor.num_bytes)
365+ packet_length++ ;
366+
367+ if (keep_all)
368+ descriptor.num_bytes = packet_length* byte_per_beat;
348369
349370 for (int tc= 0 ; tc< packet_length; tc++ ) begin : packet_loop
371+ data = new [byte_per_beat];
372+ for (int i= 0 ; i< byte_per_beat; i++ )
373+ data[i] = 'd0 ;
374+ keep = new [byte_per_beat];
350375
351- for (int i= 0 ; i< byte_per_beat; i++ ) begin
376+ for (int i= 0 ; i< byte_per_beat && (keep_all || tc * byte_per_beat + i < descriptor.num_bytes) ; i++ ) begin
352377 case (data_gen_mode)
353378 DATA_GEN_MODE_TEST_DATA :
354379 // block transfer until we get data from byte stream queue
0 commit comments