ベクターを構造体にキャストし、同じステートメントでメンバーを抽出したいと思います。これは可能ですか?そうしないと、一時変数に代入する必要があり、見苦しくなります。
例えば:
typedef struct packed { logic a; logic b } struct_t;
struct_t my_struct;
logic [1:0] foo;
assign bar = struct_t'(foo).a;
^^^^^ これは明らかに許可されていません ! なんで ?
ベクターを構造体にキャストし、同じステートメントでメンバーを抽出したいと思います。これは可能ですか?そうしないと、一時変数に代入する必要があり、見苦しくなります。
例えば:
typedef struct packed { logic a; logic b } struct_t;
struct_t my_struct;
logic [1:0] foo;
assign bar = struct_t'(foo).a;
^^^^^ これは明らかに許可されていません ! なんで ?
それができればいいと思いますが、言語では許可されていません。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
仕様によると、それは有効な構文のようには見えません。メンバーへのアクセスは、任意の式ではなく、識別子でのみ許可されていると確信しています。