メソッドが SystemVerilog で操作するオブジェクトの名前を取得する方法はありますか?
実装のように
object1.printName()
文字列を出力する必要があります
object1
メソッドが SystemVerilog で操作するオブジェクトの名前を取得する方法はありますか?
実装のように
object1.printName()
文字列を出力する必要があります
object1
いいえ、クラスに対してこれを行うためのメカニズムは言語にありません。
モジュールの場合、%m
フォーマット指定子を使用して階層名を表示できます。ただし、クラスの場合、を使用した出力%m
には、インスタンス名ではなく、クラス タイプ名が表示されます。(少なくとも Incisive と Questa で観察された動作でした。) また%m
、関数内から呼び出された場合は関数名が含まれることにも注意してください。
例:
module test;
// Print %m in a module
function void printName();
$display("%m");
endfunction
class foo;
// Print %m in a class
virtual function void printName();
$display("%m");
endfunction
endclass
foo foo_inst = new;
endmodule
module top;
test test_inst();
initial begin
test_inst.foo_inst.printName();
test_inst.printName();
end
endmodule
出力:
top.test_inst.foo.printName
top.test_inst.printName
からの出力%m
が有用な場合は、を使用して文字列にキャプチャし$sformatf
、それを変更したり、何でもしたりできます。
インスタンスには名前がありません。次のコードを検討してください。
someObject a
someObject b
initial begin
a = new();
b = a;
a.printName();
b.printName();
end
a
の同じインスタンスをb
指しますsomeObject
。作成したのは 1 つだけです。したがって、両方の呼び出しで同じ名前を報告する必要がありますが、アクセスに使用したハンドルの名前を報告する必要があります。それは不可能です。
OVM/UVM オブジェクトには、インスタンス名を含むメンバー変数が含まれています。これは、構築時に指定するか、 を使用して設定できますset_name()
。を使って読み取ることができますget_name()
。話しているオブジェクトが OVM/UVM でなくても、同様のシステムを使用できます。
OVM/UVM を使用している場合、get_full_name() / get_name() はテストベンチ階層内のコンポーネントの名前を返します。
オブジェクトは動的であるため、暗黙のうちに、あなたが求めている質問は無効です。
誰かがオブジェクト名を実装したい場合、すべてのオブジェクトのコンストラクターに「文字列名」を渡すことで、オブジェクトが新しくなったときに親がその名前を教えてくれます。
OVM/UVM のすべてのコンポーネントを見ると、コンストラクターの署名が表示されます: function new(string name="", ovm_component parent=null)
これらは、基本クラスが get_full_name() / get_name() を実装するために使用します
そのような高レベルなものについては、あなたが説明したとおりのものがあるかどうかはわかりません.
ただし、$typename
システム タスクがあります。ただし、クラスのオブジェクトでどのように機能するかはわかりません。以前はこれが必要だとは思いませんでした。
通常、私が行っていること (そして、私が行っていることは便利だと思います) は、オブジェクトの「名前」である、コンストラクターによって割り当てられるクラスに格納された文字列を作成することです。その後、ログに記録するときにそれを使用できるので、さまざまなメッセージがどこから来たのかがわかります。もちろん、これは、有用な名前で新しい変数を作成するかどうかに依存します。