Analysis Components & Techniques(從MonitorComponent開始)

上一篇 / 下一篇  2018-12-26 17:08:45

   MonitorComponent

  Overview    

      測試平臺的analysis部分的第一項任務是監視DUT上的活動。Monitor,如Driver一樣,是agent的組成部分。monitor組件類似于driver組件,因為它們都在實際信號活動和該活動的抽象表示之間執行轉換。Monitor和Driver之間的關鍵區別在于Monitor始終是被動的。它不會驅動接口上的任何信號。當agent處于被動模式時,Monitor將繼續執行。
       Monitor通過虛擬接口與DUT信號通信,并包含識別信號活動中的協議模式的代碼。一旦識別出協議模式,Monitor就會構建一個表示該活動的抽象事務模型,并將事務傳輸到任何感興趣的組件。

   Construction

       Monitor應該擴展于uvm_monitor。它們應該有一個analysis端口和一個指向DUT接口的虛擬接口句柄。

       class wb_bus_monitor extends uvm_monitor;
          `uvm_component_utils(wb_bus_monitor)

          uvm_analysis_port #(wb_txn) wb_mon_ap;
          virtual wishbone_bus_syscon_if m_v_wb_bus_if;
          wb_config m_config;

          // Standard component constructor
          function new(string name, uvm_component parent);
             super.new(name,parent);
          endfunction

          function void build_phase( uvm_phase phase );
             super.build_phase( phase );
             wb_mon_ap = new("wb_mon_ap", this);
             m_config = wb_config::get_config(this); // get config object
          endfunction

          function void connect_phase( uvm_phase phase );
             super.connect_phase( phase );
             m_v_wb_bus_if = m_config.v_wb_bus_if; // set local virtual if property
          endfunction

          // run_phase not shown...

       endclass

  Passive Monitoring

       就像在科學實驗中,觀察行為不應影響觀察到的活動,monitor組件應該是被動的。它們不應將任何活動注入DUT信號。實際上,這意味著monitor代碼在與DUT信號交互時應該是完全只讀的。

  Recognizing Protocols

       監視器必須具有協議代碼,以便檢測信號活動中的可識別模式。可以通過在monitor的run()任務中編寫特定于協議的狀態機代碼來完成檢測。此代碼通過虛擬接口句柄觀察等待關鍵信號活動的模式。

  Building Transaction Objects

       一旦識別出模式,monitors就會構建一個或多個抽象地表示信號活動的事務。這可以通過調用函數并將特定于事務的屬性(例如數據值和地址值)作為函數的參數傳遞,或者通過在檢測到現有事務時設置事務屬性來完成。

  Copy-on-Write Policy

       由于SystemVerilog中的對象是基于句柄的,因此當Monitor將事務句柄寫入其analysis端口時,只會將句柄復制并傳輸給subscribers。每次Monitor在run()任務中運行其正在進行的協議識別循環時,都會執行此寫操作。為防止在循環的下一次迭代中覆蓋相同的對象內存,傳輸的句柄應指向Monitor創建的事務對象的單獨副本。
       這可以通過兩種方式實現:

  • 在循環的每次迭代中(即在內部)創建新的事務對象;
  • 在循環的每次迭代中重用相同的事務對象,但在調用write()之前立即復制對象并傳輸復制的句柄;

  Broadcasting the Transaction

        一旦建立了新的或克隆的事務,就應該通過寫入analysis端口向所有感興趣的觀察者傳輸。

  Example Monitor

       task run_phase( uvm_phase phase );
          wb_txn txn, txn_clone;
          txn = wb_txn::type_id::create("txn"); // Create once and reuse
          forever @ (posedge m_v_wb_bus_if.clk)
             if(m_v_wb_bus_if.s_cyc) begin // Is there a valid wb cycle?
                 txn.adr = m_v_wb_bus_if.s_addr; // get address
                 txn.count = 1; // set count to one read or write
                 if(m_v_wb_bus_if.s_we) begin // is it a write?
                     txn.data[0] = m_v_wb_bus_if.s_wdata; // get data
                     txn.txn_type = WRITE; // set op type
                     while (!(m_v_wb_bus_if.s_ack[0] | m_v_wb_bus_if.s_ack[1]|m_v_wb_bus_if.s_ack[2]))
                         @ (posedge m_v_wb_bus_if.clk); // wait for cycle to end
                 end
                 else begin
                      txn.txn_type = READ; // set op type
                      case (1) //Nope its a read, get data from correct slave
                            m_v_wb_bus_if.s_stb[0]: begin
                                  while (!(m_v_wb_bus_if.s_ack[0])) @ (posedge m_v_wb_bus_if.clk); // wait for ack
                                  txn.data[0] = m_v_wb_bus_if.s_rdata[0]; // get data
                            end
                            m_v_wb_bus_if.s_stb[1]: begin
                                  while (!(m_v_wb_bus_if.s_ack[1])) @ (posedge m_v_wb_bus_if.clk); // wait for ack
                                  txn.data[0] = m_v_wb_bus_if.s_rdata[1]; // get data
                            end
                        endcase        
                  end    
                  $cast(txn_clone, txn.clone()); // Clone txn to protect from next loop iteration overwriting
                  wb_mon_ap.write(txn_clone); // broadcast the cloned txn
             end
         endtask

        (在上在線下載源代碼示例)。

      


TAG:

 

評分:0

我來說兩句

顯示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日歷

« 2019-02-13  
     12
3456789
10111213141516
17181920212223
2425262728  

數據統計

  • 訪問量: 22500
  • 日志數: 75
  • 建立時間: 2018-09-03
  • 更新時間: 2018-12-29

RSS訂閱

Open Toolbar
传世私服 热血江湖私服 幸运飞艇官网 热血江湖私服 传世私服 幸运飞艇官网 天龙八部私服 魔域私服 传世私服 传世私服