多数のパック構造体 typedef を含むパッケージがあり、これらの構造体の最大ビット幅を教えてくれる CONSTANT 関数を作成しようとしています。各構造体には、列挙された明示的な message_type があります。私が書いた以下の関数はコンパイラによって定数として解釈されるべきだと思いますが、「(vlog-2118) 関数 'get_max_message_length' は有効な定数関数ではありません」というエラーが表示されます (これは ModelSim にあります)。
この関数が一定でない理由を誰か教えてもらえますか? デバッグ後、間違って解釈される原因となっているのは列挙型メソッド「next()」であると判断しました。可能な代替ソリューションはありますか?前もって感謝します!
typedef enum logic [7:0]
{
MESSAGE_TYPE_0=0,
MESSAGE_TYPE_1=1,
MESSAGE_TYPE_2=2
} _MSGTYPE;
function integer get_message_length (_MSGTYPE message_type);
case (message_type)
MESSAGE_TYPE_0: return ($bits(message_0));
MESSAGE_TYPE_1: return ($bits(message_1));
MESSAGE_TYPE_2: return ($bits(message_2));
default: return 0;
endcase
endfunction
function integer get_max_message_length ();
automatic _MSGTYPE largest = largest.first();
automatic _MSGTYPE next = next.first();
next = next.next();
while (next != next.first()) begin
largest = get_message_length(largest) > get_message_length(next) ? largest : next;
next = next.next();
end
return get_message_length(largest);
endfunction