No seu exemplo, você está truncando bits implicitamente.
Tornar o truncamento explícito geralmente pode remover os avisos em simulação / fiapos / síntese.
Uma maneira de fazer isso em linha é usar um operador de conversão, por exemplo:
typedef logic [15:0] HALF_WORD;
assign x = HALF_WORD'((func(A) ^ func(B));
Essa abordagem pode fazer sentido se for óbvio, no contexto, que todos os bits que estão sendo descartados são zeros.
Se alguns bits podem ser diferentes de zero, sugiro ainda usar uma rede intermediária como @dwikle sugerida em uma resposta anterior , pois fica mais claro que você está realmente jogando bits fora. Aqui está novamente para referência.
wire[31:0] y;
assign y = func(A) ^ func(B);
assign x = y[15:0];