Verification Engineerの戯言
OVM 1.0/1.01と1.1では、apply/apply_sendおよびapply_requestタスクの引数が違います。
OVM 1.1では、input bit randomize = 1という引数が追加されました。
OVM 1.1では、input bit randomize = 1という引数が追加されました。
以下は、OVM 1.1版です。
「Layered Stimulus」では、apply_sendタスクとapplyタスクが重要なタスクになります。
まずは、applyタスクです。applyタスクは、ovm_scenarioクラスで次のように定義されています。
virtual task apply(input REQ data_req, output RSP data_rsp, input bit randomize = 1); apply_request(data_req, randomize); if ($cast(p_drv, m_driver_ptr) == 0) begin ovm_report_fatal("ovm_scenario", "Error casting pdrv from driver_ptr"); end p_drv.put_req.put(data_req); p_drv.get_rsp.get(data_rsp); post_apply(); endtaskapply_requestタスク後、ドライバ(m_driver_ptr)に対して、data_reqを送り(put)、data_rspを待ちます(get)。最後に、post_applyタスクを実行します。
apply_requestタスクでは、シナリオコントローラに対してリクエストし、グラントが来るまで待ちます。
その後に、pre_applyタスク、data_reqをランダマイズ(data_req.randomize())し、mid_applyタスクを実行します。
これら3つのXXX_applyタスクは、ユーザが作成するシナリオ(ovm_scenarioクラスを継承する)で必要なら定義します。
その後に、pre_applyタスク、data_reqをランダマイズ(data_req.randomize())し、mid_applyタスクを実行します。
virtual task apply_request(input REQ data_req, input bit randomize = 1); grant_flag = 0; if (m_scenario_controller == null) ovm_report_fatal("seqA", "null m_scenario_controller"); m_scenario_controller.request(this); wait(grant_flag == 1); pre_apply(); if (m_driver_ptr == null) ovm_report_fatal(get_full_name(), "null m_driver_ptr"); grant_flag = 0; if (randomize == 1) begin assert(data_req.randomize()); end mid_apply(); endtaskpre_apply、mid_apply、post_applyは、すべてovm_scenario_baseクラスでvirtual taskで定義されていますが、実体は何もやりません。
これら3つのXXX_applyタスクは、ユーザが作成するシナリオ(ovm_scenarioクラスを継承する)で必要なら定義します。
apply_sendタスクでは、ドライバからの応答(p_drv.get_rsp.get(data_rsp))が無いだけで、後はapplyタスクと同じです。
virtual task apply_send(input REQ data_req, input bit randomize = 1); apply_request(data_req, randomize); if ($cast(p_drv, m_driver_ptr) == 0) begin ovm_report_fatal("ovm_scenario", "Error casting pdrv from driver_ptr"); end p_drv.put_req.put(data_req); post_apply(); endtask
検証、Verification、SystemVerilog、OVM、Open Verification Methodology