回答:
別の変数を使用できますが、これは特にエレガントではありません。
wire[31:0] y;
assign y = func(A) ^ func(B);
assign x = y[15:0];
より良いアプローチは、関数を使用することです。
function [15:0] trunc_32_to_16(input [31:0] val32);
trunc_32_to_16 = val32[15:0];
endfunction
assign x = trunc_32_to_16(func(A) ^ func(B));
あなたの例では、ビットを暗黙的に切り捨てています。
多くの場合、トランケーションを明示的にすると、シミュレーション/ lint /合成の警告が削除されます。
これをインラインで実行する1つの方法は、キャスト演算子を使用することです。例:
typedef logic [15:0] HALF_WORD;
assign x = HALF_WORD'((func(A) ^ func(B));
このアプローチは、ドロップされるすべてのビットが0であることがコンテキストから明らかである場合に意味があります。
一部のビットがゼロ以外の場合は、以前の回答で提案された@dwikleのような中間ネットを使用することをお勧めします。これにより、実際にビットを破棄していることがより明確になります。ここでも参照用です。
wire[31:0] y;
assign y = func(A) ^ func(B);
assign x = y[15:0];
これは行数を減らすのに役立つと思います。
wire [15:0] not_used ;
assign {not_used, x} = (func(A) ^ func(B));
割り当てでも有効かどうかはわかりません。