veryl-std 0.20.3

A modern hardware description language
Documentation
pub function dispatch_binary::<N: p32, T: type> (
    sel         : input logic<selector_pkg::calc_binary_select_width(N)>,
    data        : input T                                               ,
    default_data: input T                                               ,
) -> T<N> {
    var result: T<N>;

    for i in 0..N {
        result[i] = default_data;
    }
    result[sel] = data;

    return result;
}

pub function dispatch_vector::<N: p32, T: type> (
    sel         : input logic<N>,
    data        : input T       ,
    default_data: input T       ,
) -> T<N> {
    var result: T<N>;

    for i in 0..N {
        if sel[i] {
            result[i] = data;
        } else {
            result[i] = default_data;
        }
    }

    return result;
}

pub function dispatch::<KIND: selector_pkg::selector_kind, N: p32, T: type> (
    sel         : input logic<selector_pkg::calc_select_width(N, KIND)>,
    data        : input T                                              ,
    default_data: input T                                              ,
) -> T<N> {
    const BINARY_SEL_WIDTH: u32 = selector_pkg::calc_binary_select_width(N);

    if KIND == selector_pkg::selector_kind::BINARY {
        return dispatch_binary::<N, T>(sel as BINARY_SEL_WIDTH, data, default_data);
    } else {
        return dispatch_vector::<N, T>(sel as N, data, default_data);
    }
}

pub module demux #(
    param WIDTH       : u32           = 1                               ,
    param DATA_TYPE   : type          = logic<WIDTH>                    ,
    param DEFUALT_DATA: DATA_TYPE     = 0 as DATA_TYPE                  ,
    param ENTRIES     : u32           = 2                               ,
    param KIND        : selector_kind = selector_kind::BINARY           ,
    param SELECT_WIDTH: u32           = calc_select_width(ENTRIES, KIND),
) (
    i_select: input  logic    <SELECT_WIDTH>,
    i_data  : input  DATA_TYPE              ,
    o_data  : output DATA_TYPE<ENTRIES>     ,
) {
    import selector_pkg::*;

    always_comb {
        o_data = dispatch::<KIND, ENTRIES, DATA_TYPE>(i_select, i_data, DEFUALT_DATA);
    }
}