5

私は主にC++のバックグラウンドを持っています。作業中のSystemVerilogコードのバグを追跡していましたが、オブジェクトコピーの割り当てが実際には参照の割り当てであると思っていたのに驚いていました。この簡略化されたコードは、私が何を意味するかを示しています。

for (int i = 0; i < max_num; ++i)
{
    var cls_obj obj1;
    obj1 = obj_array[i];

    some_function(obj1); // modifies the object passed in

    // at this point BOTH obj1 and obj_array[i] are modified.

    // some other code goes here
}

変更されるだけだと思っていobj1ました。これはvarキーワードによるものですか?SystemVerilogでは、コピー割り当てと参照割り当てはどの程度正確に機能しますか?Web検索から情報を見つけるのに苦労しています。

4

2 に答える 2

6

SystemVerilog のクラス変数は参照またはハンドルです。newインスタンスは、キーワードを使用した場合にのみ作成されます。

したがって、あなたの例ではobj1obj_array[i]両方が同じインスタンスを参照 (またはポイント) しています。

デフォルトでは、SystemVerilog の関数パラメーターは値で渡されます。ただし、クラス ハンドルは値として扱われるため、関数に渡すクラスは実質的に参照によって渡されます。

クラスオブジェクトを初期化するときに浅いコピーを行うための組み込みメカニズムが言語にあります。

Packet p1;
Packet p2;
p1 = new;
p2 = new p1;

これは浅いコピーを行います。オブジェクトの場合、ハンドルのみがコピーされます!

これは、IEEE 1800-2009 の 8.11 章の例で説明されています。

varキーワードは、表示されている動作とは何の関係もありません。実際、見たことも使ったこともありませんvar。LRM によれば、これにより、変数を宣言するときに型を省略することができます。あなたのコードでは、タイプ(cls_obj)が指定されているので、その存在は何の役にも立たないと思います。

于 2013-02-20T21:34:43.957 に答える