module priorityEncode32 (bitVector, adr, valid); input [31:0] bitVector; output [4:0] adr; output valid; wire [3:0] anyValid; wire [2:0] adr0, adr1, adr2, adr3, adr4, afAdr; wire [2:0] msgAdr, lsgAdr; wire msaf = |anyValid[3:2]; // partition into 8-bit groups for optimal speed/gate-count priorityEncode8 pe0 (bitVector[7:0], adr0, anyValid[0]); priorityEncode8 pe1 (bitVector[15:8], adr1, anyValid[1]); priorityEncode8 pe2 (bitVector[23:16], adr2, anyValid[2]); priorityEncode8 pe3 (bitVector[31:24], adr3, anyValid[3]); // select most significant group using valid bits assign msgAdr = anyValid[3] ? adr3 : adr2; assign lsgAdr = anyValid[1] ? adr1 : adr0; assign afAdr = msaf ? msgAdr : lsgAdr; assign adr = {msaf, msaf ? anyValid[3] : anyValid[1], afAdr}; assign valid = |anyValid; endmodule