Analysis Components & Techniques(從AnalysisConnectionst_Two styles...開始)

上一篇 / 下一篇  2018-12-26 16:03:55

   Two styles of implementation 

       你可以采用兩種方法來實現具有多個輸入流的analysis component的行為。這些方法基本上是等同的,因為使用一種方法的任何實現都可以使用另一種方法等效地實現。大多數時候,它只是歸結為個人偏好。
       在一種方法中,您直接實現所有write()函數,并在包含組件中聲明imp連接。因為write()函數必須是非阻塞的,所以不能直接與其他流執行任何同步。如果需要同步,則必須將事務存儲在某種存儲元素(例如fifo或關聯數組)中,并提供單獨的進程(通常在run()任務中)以執行同步。
        在另一種方法中,為每個輸入流提供嵌入式analysis fifo,并聲明分層analysis export以在外部向別的組件公開顯示fifo即可。在這種情況下,write()函數由fifos提供,它們將事務存入fifo數據結構。然后,您可以通過run()任務實現analysis組件的功能。使用此方法需要額外的步驟將analysis fifos連接到analysis exports。

  Multiple Transaction Streams Without Synchronization

       當analysis組件需要對多個事務流進行采樣時,會增加編寫組件行為的復雜性。
       將uvm_analysis_imps與多個流一起使用時的一個復雜因素是每個uvm_analysis_imp都希望綁定到write()函數。由于組件中只能有一個名為write()的函數,因此需要一種解決方法。UVM通過定義`uvm_analysis_imp_decl宏來提供解決方法。此宏允許您聲明一個專門的“imp”樣式分析導出,該導出調用名為write_SUFFIX的函數,您可以在其中指定_SUFFIX。

       【此處需一副圖】

       // Declare the suffixes that will be appended to the imps and functions
       `uvm_analysis_imp_decl(_BEFORE)
       `uvm_analysis_imp_decl(_AFTER)

       class delay_analyzer extends uvm_component;
          `uvm_component_utils(delay_analyzer)

          // Declare the imps using the suffixes declared above.
          // The first parameter is the transaction type.
          // The second parameter is the type of component that implements the interface
          // Usually, the second parameter is the same as the containing component type 

          uvm_analysis_imp_BEFORE #(alu_txn, delay_analyzer) before_export;
          uvm_analysis_imp_AFTER #(alu_txn, delay_analyzer) after_export;

          real m_before[$];
          real m_after[$];
          real last_b_time, last_a_time;
          real longest_b_delay, longest_a_delay;

           function new( string name , uvm_component parent) ;
              super.new( name , parent );
              last_b_time = 0.0;
              last_a_time = 0.0;
          endfunction

         // Implement the interface function by appending the function name with
         // the suffix declared in the macro above.
         function void write_BEFORE(alu_txn t);
            real delay;
            delay = $realtime - last_b_time;
            last_b_time = $realtime;
            m_before.push_back(delay);
         endfunction

         function void build_phase( uvm_phase phase );
         // The second argument to the imp constructor is a handle to the object
         // that implements the interface functions. It should be of the type
         // specified in the declaration of the imp. Usually, it is "this".
            before_export = new("before_export", this);
            after_export = new("after_export", this);
         endfunction

          function void extract_phase( uvm_phase phase );
             foreach (m_before[i])
                if (m_before[i] > longest_b_delay) longest_b_delay = m_before[i];
             foreach (m_after[i])
                if (m_after[i] > longest_a_delay) longest_a_delay = m_after[i];
          endfunction

           function void check_phase( uvm_phase phase );
              string s;
              if (longest_a_delay > 100.0) begin
                 $sformat(s, "Transaction delay too long: %5.2f",longest_a_delay);
                 uvm_report_warning("Delay Analyzer",s);
              end
              if (longest_b_delay > 100.0) begin
                 $sformat(s, "Transaction delay too long: %5.2f",longest_a_delay);
                 uvm_report_warning("Delay Analyzer",s);
              end
           endfunction

           function void report_phase( uvm_phase phase );
              uvm_report_info("Delay Analyzer", $sformatf("Longest BEFORE delay: %5.2f", longest_b_delay));
              uvm_report_info("Delay Analyzer", $sformatf("Longest AFTER delay: %5.2f", longest_a_delay));            endfunction

       endclass

       
  Multiple Transaction Streams With Synchronization

       當analysis組件的所需行為允許每個流的處理獨立完成時,直接實現write()函數會更容易。但是,許多情況需要事務流之間的同步,以便數據不會丟失。例如,有序比較器有兩個流,一個來自Predictor,另一個來自Monitor。它必須等到它有一對匹配的事務(每個流中有一個),此時才能進行比較。
       在這種情況下,您可以在兩個write()函數中手動執行所有同步工作,而不是實例化兩個analysis_fifos并在Comparator上放置兩個分層exports。由于您沒有在write()函數中實現Comparator的行為,因此需要采用不同的方法。在這種情況下,您可以在組件的run()任務中實現Comparator行為,并使用analysis fifos上的阻塞操作來執行必要的同步。

       【此處需插一幅圖】

        class comparator_inorder extends uvm_component;
           `uvm_component_utils(comparator_inorder)

           uvm_analysis_export #(alu_txn) before_export;
           uvm_analysis_export #(alu_txn) after_export;

           uvm_tlm_analysis_fifo #(alu_txn) before_fifo, after_fifo;
           int m_matches, m_mismatches;

           function new( string name , uvm_component parent) ;
              super.new( name , parent );
              m_matches = 0;
              m_mismatches = 0;
          endfunction

          function void build_phase( uvm_phase phase );
             before_fifo = new("before_fifo", this);
             after_fifo = new("after_fifo", this);
             before_export = new("before_export", this);
             after_export = new("after_export", this);
          endfunction

          function void connect_phase( uvm_phase phase );
             before_export.connect(before_fifo.analysis_export);
             after_export.connect(after_fifo.analysis_export);
          endfunction

          task run_phase( uvm_phase phase );
             string s;
             alu_txn before_txn, after_txn;
             forever begin
                before_fifo.get(before_txn);
                after_fifo.get(after_txn);
                if (!before_txn.compare(after_txn)) begin
                   $sformat(s, "%s does not match %s", before_txn.convert2string(), after_txn.convert2string());                    uvm_report_error("Comparator Mismatch",s);
                   m_mismatches++;
                end else begin
                   m_matches++;
                end
             end
          endtask

           function void report_phase( uvm_phase phase );
              uvm_report_info("Inorder Comparator", $sformatf("Matches: %0d", m_matches));     
              uvm_report_info("Inorder Comparator", $sformatf("Mismatches: %0d", m_mismatches));
           endfunction

        endclass

        對于更復雜的同步需求,您將使用多個write_SUFFIX()函數的組合,這些函數將事務數據放入某種共享數據結構,以及run()任務中的代碼以執行協調和控制。

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


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  

數據統計

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

RSS訂閱

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