Jump to content
kaggala

assigning queue values from sequence

Recommended Posts

Hi All,

 

I have a scenario where i need to send n random bytes and out of n bytes i should able to corrupt few selected bytes.

I have used Queue for selecting error bytes list.

 

 

 

Transaction :

 

rand bit [7:0]  tx_data_byte[`MAX_DATA:0] ;  // data byte array

 

rand int unsigned tx_no_of_bytes_to_send  ; // number of data bytes to send

 

rand byte tx_err_bytes[$] ;           //queue contains byte positions to be corrupted

 

 

Example :

consider i am sending 5  data bytes and I have to corrupt  2,4,5 bytes (corrupting data bytes is handled in driver)

 

 

Sequence :

 

`uvm_do_with( req, {    tx_data_byte[0]=='h00;

                                     tx_data_byte[1]=='h11;
                                     tx_data_byte[2]=='h00;
                                     tx_data_byte[3]=='h99;
                                     tx_data_byte[4]=='h55;
                                     ///-----------------

                                     tx_no_of_bytes_to_send ==20;  

                                     tx_err_bytes == {4,5,7};

 

                           })

 

I am seeing below error from the cadence simulator.

Can somebody help me out in resolving this error .

 

 

Error:

Randomization constraint has error, which will cause the randomize function to return 0 and no new rand values will be set:

This feature is currently not supported for queues, dynamic arrays, strings and associative arrays.
 
 
Thank you
 

 

Share this post


Link to post
Share on other sites

Hi Tudor,

 

Thanks for the reply.

Exactly, I would like to know what is the limitation of Queue usage in sequences.

With Dynamic Array I need to have additional parameter to configure the size and also assigning bytes is not straight forward

 

Following is the sample code with dyamaic array

 

rand byte tx_err_bytes[ ] ;  // Dynamic array contains byte positions to be corrupted

rand int error_byte_count ; // size of the dynamic array

 

`uvm_do_with( req, {    tx_data_byte[0]=='h00;

                                     tx_data_byte[1]=='h11;
                                     tx_data_byte[2]=='h00;
                                     tx_data_byte[3]=='h99;
                                     tx_data_byte[4]=='h55;
                                     ///-----------------

                                     tx_no_of_bytes_to_send ==20;  

                                     tx_err_bytes [0] == 4;

                                     tx_err_bytes [1] == 5;

                                     tx_err_bytes [2] == 7;

                                    error_byte_count == 3;

                           })

 

Thank you

Share this post


Link to post
Share on other sites

This has nothing to do with sequences or anything else. The Cadence simulator doesn't support using queues inside constraints. You'll have to use dynamic arrays. You don't need an additional field for the array size as you can just use tx_err_bytes.size() == 3. You do have to pass in the size of the array which is annoying, but there's no way around it.

Share this post


Link to post
Share on other sites

There certainly is a way around it.  Don't use `uvm_do_* and instead do

 

start_item(req);

req. tx_err_bytes.rand_mode(0);

req. tx_err_bytes = {4,5,7};

req.randomize() with   { tx_data_byte[0]=='h00;

                                     tx_data_byte[1]=='h11;
                                     tx_data_byte[2]=='h00;
                                     tx_data_byte[3]=='h99;
                                     tx_data_byte[4]=='h55;
                                     ///-----------------

                                     tx_no_of_bytes_to_send ==20;

}

finish_item(req);

Share this post


Link to post
Share on other sites

You could also replace the uvm_do_with() call with:

 

`uvm_create(req) assert(req.randomize());

req.tx_data_byte[0]='h00;

req.tx_data_byte[1]='h11;

req.tx_data_byte[2]='h00;

req.tx_data_byte[3]='h99;

req.tx_data_byte[4]='h55;

req.tx_no_of_bytes_to_send =20;

req.tx_err_bytes = {4,5,7};

`uvm_send(req)

Share this post


Link to post
Share on other sites

Isn't this code from this thread just illegal according to LRM

 tx_err_bytes == {4,5,7};

unpacked array concatenation may be used only in assignment like context.

There is also rule saying that in constraint only integral variables can be used.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×