uvm中利用sequence產生transaction的各種方法


每一個sequence都應該派生自uvm_sequence,並且在定義時指定要產生的transaction。
每一個sequence都有一個body任務,當一個sequence啟動之后,會自動執行body中的代碼。

第一種:使用宏uvm_do:

class case0_sequence extends uvm_sequence #(my_transaction);
   `uvm_object_utils(case0_sequence)
   my_transaction m_trans;
   function  new(string name= "case0_sequence");
      super.new(name);
   endfunction 
   virtual task body();
      if(starting_phase != null) 
         starting_phase.raise_objection(this);
      repeat (10) begin
         `uvm_do(m_trans)    //`uvm_do_pri `uvm_do_with   `uvm_do_pri_with
                             //`uvm_do_on  `uvm_do_on_pri `uvm_do_on_with   `uvm_do_on_pri_with
      end
      if(starting_phase != null) 
         starting_phase.drop_objection(this);
   endtask
endclass

在上面中,用到了一個uvm_do宏。它的主要作用是:
1.創建一個my_transaction的實例m_trans;
2.將其隨機化;
3.最終將其送給sequencer.

第二種:使用宏uvm_create和宏uvm_send

   virtual task body();
      my_transaction     m_tr;
      byte unsigned      data_q[];
      int  data_size;
      repeat (10) begin
         data_size = ip_tr.pack_bytes(data_q) / 8; 
         m_tr = new("m_tr");                                            //或者`uvm_create(m_tr)
         assert(m_tr.randomize with{m_tr.pload.size() == data_size;});  //隨機化
         for(int i = 0; i < data_size; i++) begin
            m_tr.pload[i] = data_q[i];                                  //添加約束
         end
         `uvm_send(m_tr)                                                //發送給sequencer //`uvm_send_pri(m_tr, 100)
      end
   endtask

1)宏uvm_creat的作用是實例化transaction;
2)利用randomize進行隨機化;當一個transaction被實例化后,可以對其做更多的處理,這種使用方式比uvm_do宏更加靈活。
3)利用uvm_send或uvm_send_pri發送出去。

第三種:利用uvm_rand_send系列宏

m_trans = new("m_trans");  //實例化
`uvm_rand_send(m_trans)    //隨機化+發送
                           //`uvm_rand_send_pri  `uvm_rand_send_with  `uvm_rand_send_pri_with

uvm_rand_send與uvm_send宏類似,唯一的區別是它會對transaction進行隨機化。
這個宏使用的前提是transaction已經被分配了空間,換言之,即已經實例化。

第四種:使用start_item和finish_item,不使用宏

virtual task body();
  repeat(10) begin
    tr = new("tr");                                                //實例化
    assert(m_tr.randomize with{m_tr.pload.size() == data_size;});  //隨機化
    start_item(tr);                                                //此任務可以和上一句更換順序
    finish_item(tr);                                               //
  end
endtask

1)不適用宏產生transaction的方式要依賴於兩個任務:start_item和finish_item;
2)在使用這兩個任務前,必須要先實例化transaction后才能調用這兩個任務;
3)可以在transactin實例化后,finish_item調用前對其進行隨機化;
4)uvm_do系列宏其實是將上面四個步驟封裝在這個宏中。
5)start_item(tr, 100)和finish_item(tr, 100)可以指定transaction的優先級,默認的優先級是-1。

第五種:使用pre_do/mid_do/post_do
uvm_do宏封裝了從transaction實例化到發送的一系列操作。封裝的越多,則其靈活性就越差。為了增加uvm_do系列宏的功能,UVM提供了三個接口:pre_do、mid_do、post_do。
因為這個操作用的比較少,不再做詳細介紹。具體內容可以參考張強編著的<<UVM實戰>>卷I,位於Page 180。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM