veryl-std 0.20.3

A modern hardware description language
Documentation
pub module ecc_encoder #(
    param WIDTH      : u32  = 8                                   ,
    param TYPE       : type = logic<WIDTH>                        ,
    const DATA_WIDTH : u32  = $bits(TYPE)                         ,
    const CHECK_WIDTH: u32  = ecc_pkg::get_check_width(DATA_WIDTH),
    const CODE_WIDTH : u32  = DATA_WIDTH + CHECK_WIDTH            ,
) (
    i_enable: input  logic            ,
    i_data  : input  TYPE             ,
    o_code  : output logic<CODE_WIDTH>,
) {
    var check: logic<CHECK_WIDTH>;

    always_comb {
        o_code = {i_data, check};
    }

    if CHECK_WIDTH == 5 :g {
        var data: logic<hamming_11_5_pkg::DATA_WIDTH>;

        always_comb {
            data = i_data as hamming_11_5_pkg::DATA_WIDTH;
            if i_enable {
                check = hamming_11_5_pkg::encode(data) as CHECK_WIDTH;
            } else {
                check = '0;
            }
        }
    } else if CHECK_WIDTH == 6 {
        var data: logic<hamming_26_6_pkg::DATA_WIDTH>;

        always_comb {
            data = i_data as hamming_26_6_pkg::DATA_WIDTH;
            if i_enable {
                check = hamming_26_6_pkg::encode(data) as CHECK_WIDTH;
            } else {
                check = '0;
            }
        }
    } else if CHECK_WIDTH == 7 {
        var data: logic<hamming_57_7_pkg::DATA_WIDTH>;

        always_comb {
            data = i_data as hamming_57_7_pkg::DATA_WIDTH;
            if i_enable {
                check = hamming_57_7_pkg::encode(data) as CHECK_WIDTH;
            } else {
                check = '0;
            }
        }
    } else if CHECK_WIDTH == 8 {
        var data: logic<hamming_120_8_pkg::DATA_WIDTH>;

        always_comb {
            data = i_data as hamming_120_8_pkg::DATA_WIDTH;
            if i_enable {
                check = hamming_120_8_pkg::encode(data) as CHECK_WIDTH;
            } else {
                check = '0;
            }
        }
    } else if CHECK_WIDTH == 9 {
        var data: logic<hamming_247_9_pkg::DATA_WIDTH>;

        always_comb {
            data = i_data as hamming_247_9_pkg::DATA_WIDTH;
            if i_enable {
                check = hamming_247_9_pkg::encode(data) as CHECK_WIDTH;
            } else {
                check = '0;
            }
        }
    } else {
        always_comb {
            check = '0;
        }
    }
}