Datastream scoreboard iterators are objects that know how to traverse and navigate the
implementation of the scoreboard. They provide high level methods for moving through the
scoreboard and modifying its content at the location of the iterator.
The actual data structure used to implement the datastream scoreboard is entirely private
to the implementation of the foundation classes. However, for implementing user-defined
functionality, the entire content of the scoreboard should be made available to the user,
so that it can be searched and modified. You can do this using iterators without exposing
the underlying implementation.
Logical streams:
Datastream applications involve transmission, multiplexing, prioritization, or transformation of
data items. A stream in general is a sequence of data elements. In VMM, a stream is composed of
transaction descriptors based on the vmm_data class. A stream of data elements flowing between two
transactors through a vmm_channel instance or to the DUT through a physical interface is a structural
stream. Through multiplexing, it maybe composed of data elements from different inputs or destined to
different outputs. If there is a way to identify the original input a data element came from or the
destination a data element is going to, a structural stream can be said to be composed of mutiple
logical substreams. It is up to you to define the logical streams based on the nature of the
application you are trying to verify.
For example, if you are verifying a router with 16 input and 16 output ports, all data packet going
from 0th input port to 0th output port can be viewed as belonging to the same logical stream giving
rise to a total of 256 logical streams.
Kinds of iterators:
1. Scoreboard iterators (vmm_sb_ds_iter class) - These move from one logic stream of expected data to
another. An instance is created using vmm_sb_ds::new_sb_iter() method.
2. Stream iterators (vmm_sb_ds_stream_iter class) - These move from one data element to another on a
single logical data stream. An instance is created using vmm_sb_ds_iter::new_stream_iter() method.
The figure above shows 'm' logical streams, each stream consisting of 'n' data elements. As previously
mentioned, logical streams are user-defined based on the application and within the scoreboard they
correspond to data queues into which data elements are stored. Once the queues are populated, if the
user wishes to modify a data element or delete a few of them, he can do so by the use of iterators.
A set of high level methods have been implemented within the iterator classes, which aid in navigating
through the data queued up in the scoreboard and modify it, if necessary. The methods first(), next(),
last(), prev(), length() are some of the methods that have been implemented within both the iterator
classes.
Note : Logical streams only exist if they contain(or have contained in the past) expected data and the
iterator will only iterate over logical streams that exist.
Sample code:
class my_scoreboard extends vmm_sb_ds;
/* creates a scoreboard iterator that iterates over different streams of data */
vmm_sb_ds_iter iter_over_streams = this.new_sb_iter();
for(iter_over_streams.first(); iter_over_streams.is_ok(); iter_over_streams.next()) begin
/* a stream iterator that scans the data within a stream */
vmm_sb_sb_stream_iter scan_stream = iter_over_streams.new_stream_iter();
if(scan_stream.find(pkt)) begin
repeat(scan_stream.pos()) begin
scan_stream.prev();
scan_stream.delete();
end
end
end
endclass
The sample code shows a very simple scoreboard. Here, a scoreboard iterator "iter_over_streams" is
instantiated and set to iterate over all the streams using the for loop.
The method first() sets the scoreboard iterator on the first stream in the scoreboard.
The method is_ok() returns TRUE if the iterator is currently positioned on a valid stream, returns
FALSE if the iterator has moved beyond the valid streams.
The method next() moves the iterator to the next applicable stream. A stream iterator "scan_stream"
is then created to iterate over the stream on which "iter_over_streams" is positioned.
The find() method used in the if-statement is used to locate the next packet in the stream matching
the specified packet "pkt". The repeat loop is used to delete all the packets before the found packet.
The method pos() returns the current position of the iterator, prev() moves the iterator to the
previous packet and delete() deletes the packet at the position where the iterator is positioned.
Hence, you can see that you can easily traverse across the different streams easily to find/alter any
specific packets that you need to. Hope you find this useful and use these iterators to make your
verification tasks simpler.
For more information about the complete list of methods, see the VMM Datastream Scoreboard User Guide.
implementation of the scoreboard. They provide high level methods for moving through the
scoreboard and modifying its content at the location of the iterator.
The actual data structure used to implement the datastream scoreboard is entirely private
to the implementation of the foundation classes. However, for implementing user-defined
functionality, the entire content of the scoreboard should be made available to the user,
so that it can be searched and modified. You can do this using iterators without exposing
the underlying implementation.
Logical streams:
Datastream applications involve transmission, multiplexing, prioritization, or transformation of
data items. A stream in general is a sequence of data elements. In VMM, a stream is composed of
transaction descriptors based on the vmm_data class. A stream of data elements flowing between two
transactors through a vmm_channel instance or to the DUT through a physical interface is a structural
stream. Through multiplexing, it maybe composed of data elements from different inputs or destined to
different outputs. If there is a way to identify the original input a data element came from or the
destination a data element is going to, a structural stream can be said to be composed of mutiple
logical substreams. It is up to you to define the logical streams based on the nature of the
application you are trying to verify.
For example, if you are verifying a router with 16 input and 16 output ports, all data packet going
from 0th input port to 0th output port can be viewed as belonging to the same logical stream giving
rise to a total of 256 logical streams.
Kinds of iterators:
1. Scoreboard iterators (vmm_sb_ds_iter class) - These move from one logic stream of expected data to
another. An instance is created using vmm_sb_ds::new_sb_iter() method.
2. Stream iterators (vmm_sb_ds_stream_iter class) - These move from one data element to another on a
single logical data stream. An instance is created using vmm_sb_ds_iter::new_stream_iter() method.
![](http://hi.csdn.net/attachment/201202/16/0_1329396797N95y.gif)
The figure above shows 'm' logical streams, each stream consisting of 'n' data elements. As previously
mentioned, logical streams are user-defined based on the application and within the scoreboard they
correspond to data queues into which data elements are stored. Once the queues are populated, if the
user wishes to modify a data element or delete a few of them, he can do so by the use of iterators.
A set of high level methods have been implemented within the iterator classes, which aid in navigating
through the data queued up in the scoreboard and modify it, if necessary. The methods first(), next(),
last(), prev(), length() are some of the methods that have been implemented within both the iterator
classes.
Note : Logical streams only exist if they contain(or have contained in the past) expected data and the
iterator will only iterate over logical streams that exist.
Sample code:
class my_scoreboard extends vmm_sb_ds;
/* creates a scoreboard iterator that iterates over different streams of data */
vmm_sb_ds_iter iter_over_streams = this.new_sb_iter();
for(iter_over_streams.first(); iter_over_streams.is_ok(); iter_over_streams.next()) begin
/* a stream iterator that scans the data within a stream */
vmm_sb_sb_stream_iter scan_stream = iter_over_streams.new_stream_iter();
if(scan_stream.find(pkt)) begin
repeat(scan_stream.pos()) begin
scan_stream.prev();
scan_stream.delete();
end
end
end
endclass
The sample code shows a very simple scoreboard. Here, a scoreboard iterator "iter_over_streams" is
instantiated and set to iterate over all the streams using the for loop.
The method first() sets the scoreboard iterator on the first stream in the scoreboard.
The method is_ok() returns TRUE if the iterator is currently positioned on a valid stream, returns
FALSE if the iterator has moved beyond the valid streams.
The method next() moves the iterator to the next applicable stream. A stream iterator "scan_stream"
is then created to iterate over the stream on which "iter_over_streams" is positioned.
The find() method used in the if-statement is used to locate the next packet in the stream matching
the specified packet "pkt". The repeat loop is used to delete all the packets before the found packet.
The method pos() returns the current position of the iterator, prev() moves the iterator to the
previous packet and delete() deletes the packet at the position where the iterator is positioned.
Hence, you can see that you can easily traverse across the different streams easily to find/alter any
specific packets that you need to. Hope you find this useful and use these iterators to make your
verification tasks simpler.
For more information about the complete list of methods, see the VMM Datastream Scoreboard User Guide.