まずはここから
職場で見ている方には関係ありませんが、家でOVMをいじる方には関係ある情報です。
無償のModelSimは、.randomize()メソッドが使えませんが、OVMはこの.randomize()メソッドを
よく使用します。そのため、OVMのクラスライブラリを入手後、クラスライブラリを編集して.randomize()
メソッドの部分を書き換えないと使えません。そんな方は、こちらのサイトを御覧ください。
それでは、OVMの入り口に入ります。まずはHello Worldを表示させます。
ただし、Hello Worldの表示は、あくまでOVMの実行フェーズに組み込んで実行します。
initial文に書いても意味がありませんからね!
OVMな記述にはいろを塗ってあります。OVMの記述は1つのmoduleの中に書き入れます。
#OVMのコードが多くなってきたら、includeでファイルを分けます
--- test.sv ---
module test;
`include "ovm.svh" /// とにかく
int cnt;
class hello extends ovm_test;
`ovm_component_utils(hello)
function new(string name = "hello", ovm_component parent=null);
super.new(name,parent);
endfunction : new
task run;
$display("Hello World!!");
global_stop_request;
endtask
endclass
initial run_test();
endmodule
上記は…見慣れないと複雑かもしれませんが、ほとんどの記述が定形です。
- ovm.svhをincludeする。
- ovm_testというclassをextends(継承)。
- `ovm_component_utils()は決まり文句。()の中のhelloは、class名と同じにする。
- function newのstring nameにもclass名と同じ文字列を初期値として入れる。
- task run;は、OVMの中で複数の実行フェーズが処理されており、その中でrunが実行される。
- task run中のglobal_stop_requestは、OVMで定義されたもので、Simulationの終了時に実行する。
- initial文のrun_test()は、OVM内の実行フェーズを起動する記述(定形)。これを忘れるとOVMは動かない。
また、上記ファイルのコンパイル時に、OVMのincludeパスを教える必要があります。ModelSimでは
vlog +incdir+$OVM_INSTDIR/src
とします。$OVM_INSTDIRは、ダウンロードしたOVMクラスライブラリを展開したディレクトリです。
実行結果は以下のとおりです。
# ----------------------------------------------------------------
# OVM-2.1.1
# (C) 2007-2009 Mentor Graphics Corporation
# (C) 2007-2009 Cadence Design Systems, Inc.
# ----------------------------------------------------------------
# OVM_INFO @ 0: reporter [RNTST] Running test hello...
# Hello World!!
#
# --- OVM Report Summary ---
#
# ** Report counts by severity
# OVM_INFO : 1
# OVM_WARNING : 0
# OVM_ERROR : 0
# OVM_FATAL : 0
# ** Report counts by id
# [RNTST] 1
# ** Note: $finish : ../../../ovm/ovm-2.1.1/src/base/ovm_root.svh(507)
# Time: 0 ps Iteration: 28 Instance: /test/ovm_root::run_test