Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

OVM : ovm_scenario_base::startタスク

Verification Engineerの戯言

OVM 1.1版

ovm_scenario_controllerクラスおよびovm_scenario_driverクラスは、共にovm_threaded_componentクラスを継承します。
そのため、runタスクをvirtualで定義しています。

ovm_scenario_controllerクラスrunタスクは、次のように定義されています。
    task run();
      stimulus_scenario.start(this, null);
    endtask // run
stimulus_scenarioは、ovm_stimulus_scenarioクラスインスタンスで、
startタスクovm_scenario_baseクラスで定義されています。

前回、見ましたよね!
    virtual task start(ovm_scenario_controller_base scenario_controller, 
                     ovm_scenario_base parent_seq = null,
                       int weighted_priority = 100);

        m_scenario_controller = scenario_controller;
        m_parent    = parent_seq;
        set_weighted_priority(weighted_priority);
        pre_body();
        body();
        post_body();
    endtask // start

startタスクで実行される3つのタスク(pre_body, body, post_body)は、
どれもovm_scenario_baseクラスvirtual taskとして定義されています。
    virtual task pre_body();
      return;
    endtask // pre_body

    virtual task body();
      return;
    endtask

    virtual task post_body();
      return;
    endtask // post_body
startタスクでは、ovm_scenario_baseクラスを継承するクラスで定義された各タスク(pre_body, body, post_body)を呼び出すことになります。

そして、ovm_stimulus_scenarioクラスbodyタスクを次のように定義していますので、このbodyタスクが呼ばれることになります。
(pre_bodyタスクおよびpost_bodyタスクは定義されていませんので、ovm_scenario_baseクラスのものが呼ばれます)
    task body();
      REQ req;

      forever begin
        m_req_fifo.get(req);
        apply_send(req);
      end
   endtask // body
m_req_fifoからgetタスクreqを獲得し、apply_sendタスクでドライバにreqを送信します。

次回、ovm_scenario::apply_send/applyタスクでは、bodyタスクで使っているapply_sendタスクについて説明します。
また、apply_sendタスクapplyタスクについても説明します。

検証、Verification、SystemVerilog、OVM、Open Verification Methodology