module fm_3d_ru_span_step_core (
    clk_core,
    rst_x,
    i_en,
    i_valid,
    i_kind,
    i_end_flag,
    i_start_p,
    i_end_p,
    i_delta_t,
    o_valid,
    o_kind,
    o_end_flag,
    o_start_p,
    o_step_p
);

////////////////////////////
// I/O definition
////////////////////////////
    input         clk_core;
    input         rst_x;
    input         i_en;
    input         i_valid;
    input  [3:0]  i_kind;
    input         i_end_flag;
    input  [21:0] i_start_p;
    input  [21:0] i_end_p;
    input  [21:0] i_delta_t;
    output        o_valid;
    output [3:0]  o_kind;
    output        o_end_flag;
    output [21:0] o_start_p;
    output [21:0] o_step_p;
////////////////////////////
// wire
////////////////////////////
    wire  [21:0]  w_end_p;
    wire  [21:0]  w_start_p;
    wire  [21:0]  w_delta_p;
////////////////////////////
// assign
////////////////////////////
////////////////////////////
// module instance
////////////////////////////
    // adder (end_p - start_p)
    fm_3d_fadd fadd (
        .clk_core(clk_core),
        .i_en(i_en),
        .i_a(i_end_p),
        .i_b(i_start_p),
        .i_adsb(1'b1),
        .o_c(w_delta_p)
    );

    // delta_p * delta_t (not necessary to add delay to delta_t, t is static)
    fm_3d_fmul mul_delta_tp (
        .clk_core(clk_core),
        .i_en(i_en),
        .i_a(w_delta_p),
        .i_b(i_delta_t),
        .o_c(o_step_p)
    );
    // delay adjust for o_start_p
    fm_3d_delay #(22,6) delay_p (
        .clk_core(clk_core),
        .i_en(i_en),
        .i_data(i_start_p),
        .o_data(o_start_p)
    );

    // delay adjust for valid
    fm_3d_delay #(1,6) delay_valid (
        .clk_core(clk_core),
        .i_en(i_en),
        .i_data(i_valid),
        .o_data(o_valid)
    );

    fm_3d_delay #(1,6) delay_end_flag (
        .clk_core(clk_core),
        .i_en(i_en),
        .i_data(i_end_flag),
        .o_data(o_end_flag)
    );

    fm_3d_delay #(4,6) delay_kind (
        .clk_core(clk_core),
        .i_en(i_en),
        .i_data(i_kind),
        .o_data(o_kind)
    );

endmodule