まずはここから

職場で見ている方には関係ありませんが、家で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

上記は…見慣れないと複雑かもしれませんが、ほとんどの記述が定形です。

  1. ovm.svhをincludeする。
  2. ovm_testというclassをextends(継承)。
  3. `ovm_component_utils()は決まり文句。()の中のhelloは、class名と同じにする。
  4. function newのstring nameにもclass名と同じ文字列を初期値として入れる。
  5. task run;は、OVMの中で複数の実行フェーズが処理されており、その中でrunが実行される。
  6. task run中のglobal_stop_requestは、OVMで定義されたもので、Simulationの終了時に実行する。
  7. 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