Priority encoder

// synthesis verilog_input_version verilog_2001
/*
输入in = 4'b1000,输出pos = 2'd3。
输入in = 4'b0100,输出pos = 2'd2。
输入in = 4'b0010,输出pos = 2'd1。
输入in = 4'b0001,输出pos = 2'd0。
输入in = 4'b0000,输出pos = 2'd0。
*/
module top_module (
    input [3:0] in,
    output reg [1:0] pos
);
/*
    always @(*) begin  // 组合逻辑
        if (in[3]) begin
            pos = 2'd3;  // 如果in[3]为1,输出3
        end else if (in[2]) begin
            pos = 2'd2;  // 如果in[2]为1,输出2
        end else if (in[1]) begin
            pos = 2'd1;  // 如果in[1]为1,输出1
        end else if (in[0]) begin
            pos = 2'd0;  // 如果in[0]为1,输出0
        end else begin
            pos = 2'd0;  // 如果所有位都为0,输出0
        end
    end
*/
/*
always @(*) begin  // 组合逻辑
        case (1'b1)  // 使用1'b1作为条件,确保case语句总是匹配
            in[3]: pos = 2'd3;  // 如果in[3]为1,输出3
            in[2]: pos = 2'd2;  // 如果in[2]为1,输出2
            in[1]: pos = 2'd1;  // 如果in[1]为1,输出1
            in[0]: pos = 2'd0;  // 如果in[0]为1,输出0
            default: pos = 2'd0;  // 如果所有位都为0,输出0
        endcase
    end

*/


    //case
    always@(*)
        begin
            case(in)
                4'b0000:pos = 2'd00;
                4'b0001:pos = 2'd00;
                4'b0010:pos = 2'd01;
                4'b0011:pos = 2'd00;
                4'b0100:pos = 2'd02;
                4'b0101:pos = 2'd00;
                4'b0110:pos = 2'd01;
                4'b0111:pos = 2'd00;
                4'b1000:pos = 2'd03;
                4'b1001:pos = 2'd00;
                4'b1010:pos = 2'd01;
                4'b1011:pos = 2'd00;
                4'b1100:pos = 2'd02;
                4'b1101:pos = 2'd00;
                4'b1110:pos = 2'd01;
                4'b1111:pos = 2'd00;
                default:pos = 2'd00;
            endcase
        end

endmodule