共通のモジュールでパラメータ化タイプを使用しています。Systemverilogでは、ある型に対して条件を設定する方法はありますか?
言うする方法はあります:(タイプ== TYPE1)は、構造体に他の一つの方法 を割り当てる 場合であれば(タイプ== TYPE2)別の方法
私が生成するブロックでこれを描いたを割り当てます。
共通のモジュールでパラメータ化タイプを使用しています。Systemverilogでは、ある型に対して条件を設定する方法はありますか?
言うする方法はあります:(タイプ== TYPE1)は、構造体に他の一つの方法 を割り当てる 場合であれば(タイプ== TYPE2)別の方法
私が生成するブロックでこれを描いたを割り当てます。
はい、あなたがあれば/のようなケース/ケースならば、生成、または手続きんタイプの演算子を使用することができます:
real r;
if (type(r) == type(real)) ...
しかし残念ながらLRMからの使用例条件に関係なく、すべてのブランチのコードが正常にコンパイルされなければなりません。存在しないstructメンバーを参照することはできません。
typedef struct {int a;} s1_t;
typedef struct {int a;int b;} s2_t;
s1_t s;
initial
#1 // procedural-if
if (type(s) == type(s1_t))
$display("%m s.a = %0d",s.a);
else if (type(s) == type(s2_t))
$display("%m s.b ==%0d",s.b); // this will not compile
IEEE1800-2012 § 6.23に記載されているオペレータはtype()
です。 LRMからの使用例:
bit[12:0] A_bus, B_bus; parameter typebus_t = type(A_bus); generate case(type(bus_t)) type(bit[12:0]): addfixed_int #(bus_t) (A_bus,B_bus); type(real): add_float #(type(A_bus)) (A_bus,B_bus); endcase endgenerate
IEEE1800-2012 § 20.6.1で説明$typename()
もあります。 $typename()
戻り値の型の文字列。
// source code // $typename would return typedef bitnode; // "bit" node [2:0] X; // "bit [2:0]" int signedY; // "int" packageA; enum{A,B,C=99} X; // "enum{A=32'sd0,B=32'sd1,C=32'sd99}A::e$1" typedef bit[9:1'b1] word; // "A::bit[9:1]" endpackage: A importA::*; moduletop; typedef struct{node A,B;} AB_t; AB_t AB[10]; // "struct{bit A;bit B;}top.AB_t$[0:9]" ... endmodule