2017-12-14 40 views
1

私はUART検証環境を構築しています。 DUT UARTのRxにフレームを駆動するためvr_ad_sequence Specman e:シーケンスがそのBFMを駆動し、そのMAINがテストで定義されていない

  • - - uart_sequence
  • 両方の配列、それらのドライバとのBFMは正常に動作DUTのUARTの設定を駆動するため

    1. : 私は2 sequencesesを持っています。 しかし、構成シーケンスのみを使用する簡単なテストを作成した場合、DUT UART Rxは検証環境によって駆動されます(また、MAIN uart_sequenceの拡張はありません)!

      // The test that drives ALSO uart_sequence 
      extend MAIN vr_ad_sequence { // Configuration sequence 
          body()@driver.clock is only { 
           // Configuration logic 
          }; 
      }; 
      

      私はRxが駆動されるように停止することに成功した唯一の方法はMAIN uart_sequence body()を「上書き」することです:テストはこのようになります。ここ

      // The test that does not drives UART Rx 
      extend MAIN uart_sequence { // Rx sequence 
          body() @driver.clock is only { 
          }; 
      }; 
      
      extend MAIN vr_ad_sequence { // Configuration sequence 
          body()@driver.clock is only { 
           // Configuration logic 
          }; 
      }; 
      

      はどのようにUART Rxの配列であり、ドライバとBFMは、検証環境で定義されています。

      sequence uart_sequence using 
          item   = uart_frame_s, 
          created_driver = uart_driver_u; 
      
      
      extend uart_driver_u { 
          event clock is only rise(port_clk$) @sim; 
      }; 
      
      
      extend uart_rx_agent_u { 
          driver: uart_driver_u is instance; 
      }; 
      
      
      extend uart_rx_agent_u { 
          uart_monitor : uart_rx_monitor_u is instance; // like uvm_monitor 
          uart_bfm  : uart_rx_bfm_u is instance; // like uvm_bfm 
      }; 
      
      
      extend uart_rx_bfm_u { 
          !cur_frame: uart_frame_s; 
      
          run() is also { 
           start execute_items(); 
          }; 
      
          execute_items() @rx_clk is { 
           while (TRUE) do{ 
           cur_frame = p_agent.driver.get_next_item(); 
           drive_frame(cur_frame); 
           }; 
          }; 
      
          drive_frame(cur_frame : uart_frame_s) @rx_clk is { 
           // Drive frame logic 
          }; 
      }; 
      

      あなたがuart_sequenceはそのMAINが延長されなかった場合でも、そのBFMを駆動する理由を任意のアイデアを持っていますか?例示及び説明の状態があるSpecmanのドキュメントであなたの助け

    答えて

    2

    をありがとう:

    MAINシーケンスがランダムに現在ロードされているATMの配列から選択 、あらゆる種類のシーケンスを作成します。

    MAIN配列はまた、独自のセクションに記載されています

    MAINシーケンスサブタイプがシーケンス ドライバの直下に定義され、デフォルトで起動されます。これは、 シーケンスツリー全体のルートです。

    そのためのコードは次のとおりです。

    extend MAIN sequence_name { 
        count: uint; 
        !sequence: sequence_name; 
    
        keep soft count > 0; 
        keep soft count <= MAX_RANDOM_COUNT; 
        keep sequence.kind not in [RANDOM, MAIN]; 
    
        body() @driver.clock is only { 
         for i from 1 to count do { 
          do sequence; 
         }; 
        }; 
    }; 
    

    あなたはランダムな配列を開始し、自動的に生成されたコードを無効にしている、それを拡張し、そのbody()を上書きすることによって。

    MAINシーケンスを無効にするには、UARTシーケンスドライバのgen_and_start_mainを制限します。

    関連する問題