1

ベクターを構造体にキャストし、同じステートメントでメンバーを抽出したいと思います。これは可能ですか?そうしないと、一時変数に代入する必要があり、見苦しくなります。

例えば:

typedef struct packed { logic a; logic b } struct_t;
struct_t my_struct;

logic [1:0] foo;
assign bar = struct_t'(foo).a;

^^^^^ これは明らかに許可されていません ! なんで ?

4

2 に答える 2

3

それができればいいと思いますが、言語では許可されていません。SystemVerilog LRM (IEEE 1800-2009) は、セクション 23.7 でこれを説明しています。

構造体、共用体、クラス、またはカバーグループ オブジェクトへの階層名とメンバー選択は、ピリオドで区切られた一連の名前コンポーネントの同じ構文形式を共有します。このような名前は、その名前が階層名であるかメンバー選択であるかが判別される前に、ドット付き名と呼ばれます。階層名の特徴的な側面は、名前の最初のコンポーネントがスコープ名と一致する必要があり、メンバー選択の最初の名前コンポーネントが変数名と一致する必要があることです。使用される一般的なアプローチは、最初の名前コンポーネントをすぐに解決しようとし、その解決試行の結果を使用して、全体的な名前をどのように扱うかを決定することです。

変数名はありますがstruct_t'(foo)、ないため.a、メンバー選択として扱われません。

同様に、C++ のように関数呼び出しから返されたクラスまたは構造体のメンバーにアクセスすることはできません。

function struct_t getStruct();
  // do something
endfunction

logic a;
a = getStruct().a;   // <= Not allowed
于 2012-06-01T03:00:53.953 に答える
2

仕様によると、それは有効な構文のようには見えません。メンバーへのアクセスは、任意の式ではなく、識別子でのみ許可されていると確信しています。

于 2012-05-31T22:45:33.740 に答える