Quantcast
Channel: UVM SystemVerilog Discussions Forum RSS Feed
Viewing all articles
Browse latest Browse all 410

how to Constraint dynamic array

$
0
0

hi,

   I will be ready to build one layer protocol testbench,  top level sequence item is transmit to lower level sequencer with large payload of data packet. assuption that

        1)  trans_item  is toper level sequence item(transaction layer item);

       

        2)  link_item  is lower level sequence item(ie,link layer item);

 

      patial  code as follows:

   

      class  trans_item  extends uvm_sequence_item;

          rand  bit [31:0]  mess_data[];

          rand  bit [15:0]  mess_len;

          constraint  C_mess{

            soft  mess_data.size()==mess_len;

            solve  mess_len before  mess_data;

         } 

             ................

    

      class  link_item  extends uvm_sequence_item;

          rand  bit [31:0]  mess_data[];

          rand  bit [15:0]  mess_len;

          constraint  C_mess{

             soft  mess_data.size()==mess_len;

            solve  mess_len before  mess_data;

         } 

             ................

 

     class  top_sequence  extends uvm_sequence #(trans_item);

 

              rand  bit [31:0]  trans_data[];

              rand  bit [15:0]  trans_len ;

                 constraint C_len{

                      trans_len==40;

                      trans_data.size()==trans_len;

                      solve  trans_len before  trans_data;

                 }

                      ....

              virtual  task  body()

                    `uvm_do_with(req,{req.mess_len==local::trans_len;

                                                    ........................

                                                  foreach(local::trans_data[i])

                                                       req.mess_data[i]==local::trans_data[i];})

                     req.print();

              endtask

 

    endclass

 

    class  trans_to_link_seq  extends uvm_sequence  #(link_item);

             

                uvm_sequencer   trans_sequencer;

                trans_item   trans_req;

                link_item     link_req;

                        ......

                virtual  task body();

                     

                        trans_sequencer.get_next_item(trans_req);

 

                         trans_req.print()

                        //  why can't  print mess_data

                         ........

                        `uvm_do_with(link_req,{link_req.mess_len==trans_req.mess_len;

                                                               ..................

                                                              foreach(trans_req.mess_data[i])                                                                                                                                                     link_req.mess_data[i]==trans_req.mess_len;})

               .............

   endclass

 

                    

  next, supposing that   trans_sequencer  has connected to link_sequencer by uvm_seq_item_pull_port ,seq_item_export

 

   then , In test start  top_sequence and trans_to_link_seq in fork jion statement;

   

     class  trans_test  extends  uvm_test;

     

              virtual  task  main_phase (uvm_phase phase);

 

                    phase.raise_objection(this,"");

                    fork

                           top_sequence.start(env.agent.trans_sequencer);

                           trans_to_link_seq.start(env.agent.link_sequencer);

                    join_any

 

     During the  simulation,printing mess_len is not 40, questasim10.2c simulator has not  reported assertion failed,in practual constraint is failed,

 

     why can't  print mess_data?

 

     how  dynamic array and  x_len is constrainted?

 

     how to send large payload of data packet to lower sequence or lower driver?


Viewing all articles
Browse latest Browse all 410

Latest Images

Trending Articles



Latest Images