00a. uvm-1.2を試す
uvm-1.2がリリースされましたので、早速家の環境で試してみることにしました。
uvm-1.2はこちらから
動作確認環境は、「01. 10日で身に付けるUVMの基礎」の10日目環境です。
- とりあえずtar.gzを展開しますと、uvm-1.2/.nfsxxxxというゴミファイルが見つかります。放置してもいいですが、気持ち悪い方は消してしまいましょう
- 家の環境では、まずuvm packageをコンパイルするところから始まります
- → これは通りました。
- テストモデルをコンパイルで落ちました。
- +define+UVM_NO_DEPRECATEDをつけているから。
- 外すとコンパイルが通って動いて見えるのですが、やはりobjection処理が適切にされないために、Simulation時間が0psで終わってしまいました。本当なら700psまで動く環境なのです(下記 ログ参照ください)
- +define+UVM_DEPRECATED_STARTING_PHASEにしても、やはりコンパイルは通るけれども、実行時にobjection処理の問題で0psで終わりました。
- 結論:sequenceのobjection処理は、変換ツールで変換するか、下記のset_automatic_phase_objectionを使いましょう。
- uvm_sequenceを継承したsequence定義ファイルの、pre_body, post_bodyに書いたobjection処理内、starting_phaseがそのまま参照できなくなりました。
- uvm-1.2/bin/uvm11-to-uvm12.plで変換してみて、とリリースノートにはありますが、家のcygwin環境にはなぜかdiffがなくて落ちました…職場の方は使えると思います。このツールは、変更 したいソースコードの置いてあるディレクトリに移動して、実行するのが良さそうです。ツールは、別ディレクトリを作成して、変換結果を出力するもよう
- 手修正するのは難しいかも。starting_phase自体はprivateになったもようで、uvm_phase _phase; などの変数を定義して、_phase = get_starting_phase(); と書けるのですが、この_phaseに raise_objectionとかdrop_objectionができるわけでもなく(試してませんが)、そもそもテストベンチ全体でobjection管理をしなければならないため、ローカル変数 _phaseで何かできるわけ でもありません。なので、既存のobjection記述を頑張って置き換えるのはたいへん…かもしれません
- 下記4番の修正方法が簡単だと思います
- +define+UVM_NO_DEPRECATEDをつけているから。
- 修正
- uvm_sequence記述の、pre_bodyやpost_bodyなどに記述している、starting_phase系の処理ブロックはそっくりコメントアウトなどします
- function newの中に、以下の記述を追加します
- set_automatic_phase_objection(1);
- 4番の修正により、家のなんちゃって環境はuvm-1.2で動作しました。
ログ:
# ----------------------------------------------------------------
# UVM-1.2
# (C) 2007-2014 Mentor Graphics Corporation
# (C) 2007-2014 Cadence Design Systems, Inc.
# (C) 2006-2014 Synopsys, Inc.
# (C) 2011-2013 Cypress Semiconductor Corp.
# (C) 2013-2014 NVIDIA Corporation
# ----------------------------------------------------------------
#
# *********** IMPORTANT RELEASE NOTES ************
#
# You are using a version of the UVM library that has been compiled
# with `UVM_OBJECT_DO_NOT_NEED_CONSTRUCTOR undefined.
# See http://www.eda.org/svdb/view.php?id=3770 for more details.
#
# (Specify +UVM_NO_RELNOTES to turn off this notice)
#
# UVM_INFO ../uvm-1.2/src/base/uvm_root.svh(453) @ 0: reporter [NO_DPI_TSTNAME] UVM_NO_DPI defined--getting UVM_TESTNAME directly, without DPI
# UVM_INFO @ 0: reporter [RNTST] Running test sample_test...
# UVM_INFO ../uvm-1.2/src/base/uvm_traversal.svh(279) @ 0: reporter [UVM/COMP/NAMECHECK] This implementation of the component name checks requires DPI to be enabled
# UVM_INFO @ 0: uvm_test_top [TEST] Hello World
# UVM_INFO ../uvm-1.2/src/base/uvm_root.svh(579) @ 0: reporter [UVMTOP] UVM testbench topology:
# -------------------------------------------------------------------
# Name Type Size Value
# -------------------------------------------------------------------
# uvm_test_top sample_test - @341
# tb tb_env - @359
# sample_model sample_env - @372
# master sample_master_agent - @410
# driver sample_master_driver - @429
# rsp_port uvm_analysis_port - @448
# seq_item_port uvm_seq_item_pull_port - @438
# monitor sample_master_chg_monitor - @458
# ap_read uvm_analysis_port - @477
# ap_write uvm_analysis_port - @467
# sequencer sample_master_sequencer - @487
# rsp_export uvm_analysis_export - @496
# seq_item_export uvm_seq_item_pull_imp - @614
# arbitration_queue array 0 -
# lock_queue array 0 -
# num_last_reqs integral 32 'd1
# num_last_rsps integral 32 'd1
# slave sample_slave_agent - @419
# driver sample_slave_driver - @627
# rsp_port uvm_analysis_port - @646
# seq_item_port uvm_seq_item_pull_port - @636
# sequencer sample_slave_sequencer - @656
# rsp_export uvm_analysis_export - @665
# seq_item_export uvm_seq_item_pull_imp - @783
# arbitration_queue array 0 -
# lock_queue array 0 -
# num_last_reqs integral 32 'd1
# num_last_rsps integral 32 'd1
# sample_scrbd uvm_scoreboard - @381
# ap_exp uvm_analysis_imp_exp - @400
# ap_obs uvm_analysis_imp_obs - @390
# disable_scoreboard integral 1 'h0
# mode integral 8 'h2
# -------------------------------------------------------------------
#
# UVM_INFO @ 0: uvm_test_top.tb.sample_model [ENV] Hello ENV
# UVM_INFO @ 0: uvm_test_top.tb.sample_model.slave [AGENT] Hi
# UVM_INFO @ 0: uvm_test_top.tb.sample_model.slave.sequencer [SEQR] Hi
# UVM_INFO @ 0: uvm_test_top.tb.sample_model.slave.driver [DRIVER] Hi
# UVM_INFO @ 0: uvm_test_top.tb.sample_model.master [AGENT] Hi
# UVM_INFO @ 0: uvm_test_top.tb.sample_model.master.sequencer [SEQR] Hi
# UVM_INFO @ 0: uvm_test_top.tb.sample_model.master.monitor [MONITOR] Hi
# me me me
# UVM_INFO @ 0: uvm_test_top.tb.sample_model.master.driver [DRIVER] Hi
# UVM_INFO @ 300: uvm_test_top.tb.sample_model.master.monitor [MON] write addr=10h wdata=5ah
# UVM_INFO @ 300: uvm_test_top.tb.sample_scrbd [SCRBD] write expected data
# UVM_INFO @ 600: uvm_test_top.tb.sample_model.master.monitor [MON] read addr=10h rdata=5ah
# UVM_INFO @ 600: uvm_test_top.tb.sample_scrbd [SCRBD] write observed data
# UVM_INFO @ 600: uvm_test_top.tb.sample_scrbd [SCRBD] data compare OK. addr=10h
# UVM_INFO ../uvm-1.2/src/base/uvm_report_server.svh(847) @ 700: reporter [UVM/REPORT/SERVER]
# --- UVM Report Summary ---
#
# ** Report counts by severity
# UVM_INFO : 19
# UVM_WARNING : 0
# UVM_ERROR : 0
# UVM_FATAL : 0
# ** Report counts by id
# [AGENT] 2
# [DRIVER] 2
# [ENV] 1
# [MON] 2
# [MONITOR] 1
# [NO_DPI_TSTNAME] 1
# [RNTST] 1
# [SCRBD] 3
# [SEQR] 2
# [TEST] 1
# [UVM/COMP/NAMECHECK] 1
# [UVM/RELNOTES] 1
# [UVMTOP] 1
#
# ** Note: $finish : ../uvm-1.2/src/base/uvm_root.svh(517)
# Time: 700 ps Iteration: 86 Instance: /tb_top