TailCorr/rtl/z_dsp/CoefGen.sv

443 lines
14 KiB
Systemverilog

module CoefGen #(
parameter data_in_width = 32
,parameter coef_width = 32
,parameter frac_data_out_width = 20//X for in,5
,parameter frac_coef_width = 31//division
)
(
input rstn
,input clk
,input [5:0] vldi
,input signed [31:0] a0_re
,input signed [31:0] b0_re
,input signed [31:0] a1_re
,input signed [31:0] b1_re
,input signed [31:0] a2_re
,input signed [31:0] b2_re
,input signed [31:0] a3_re
,input signed [31:0] b3_re
,input signed [31:0] a4_re
,input signed [31:0] b4_re
,input signed [31:0] a5_re
,input signed [31:0] b5_re
,output reg signed [31:0] a_re0
,output reg signed [31:0] b_re0
,output reg signed [31:0] ab_re0
,output reg signed [31:0] abb_re0
,output reg signed [31:0] ab_pow3_re0
,output reg signed [31:0] ab_pow4_re0
,output reg signed [31:0] ab_pow5_re0
,output reg signed [31:0] ab_pow6_re0
,output reg signed [31:0] ab_pow7_re0
,output reg signed [31:0] b_pow8_re0
,output reg signed [31:0] a_re1
,output reg signed [31:0] b_re1
,output reg signed [31:0] ab_re1
,output reg signed [31:0] abb_re1
,output reg signed [31:0] ab_pow3_re1
,output reg signed [31:0] ab_pow4_re1
,output reg signed [31:0] ab_pow5_re1
,output reg signed [31:0] ab_pow6_re1
,output reg signed [31:0] ab_pow7_re1
,output reg signed [31:0] b_pow8_re1
,output reg signed [31:0] a_re2
,output reg signed [31:0] b_re2
,output reg signed [31:0] ab_re2
,output reg signed [31:0] abb_re2
,output reg signed [31:0] ab_pow3_re2
,output reg signed [31:0] ab_pow4_re2
,output reg signed [31:0] ab_pow5_re2
,output reg signed [31:0] ab_pow6_re2
,output reg signed [31:0] ab_pow7_re2
,output reg signed [31:0] b_pow8_re2
,output reg signed [31:0] a_re3
,output reg signed [31:0] b_re3
,output reg signed [31:0] ab_re3
,output reg signed [31:0] abb_re3
,output reg signed [31:0] ab_pow3_re3
,output reg signed [31:0] ab_pow4_re3
,output reg signed [31:0] ab_pow5_re3
,output reg signed [31:0] ab_pow6_re3
,output reg signed [31:0] ab_pow7_re3
,output reg signed [31:0] b_pow8_re3
,output reg signed [31:0] a_re4
,output reg signed [31:0] b_re4
,output reg signed [31:0] ab_re4
,output reg signed [31:0] abb_re4
,output reg signed [31:0] ab_pow3_re4
,output reg signed [31:0] ab_pow4_re4
,output reg signed [31:0] ab_pow5_re4
,output reg signed [31:0] ab_pow6_re4
,output reg signed [31:0] ab_pow7_re4
,output reg signed [31:0] b_pow8_re4
,output reg signed [31:0] a_re5
,output reg signed [31:0] b_re5
,output reg signed [31:0] ab_re5
,output reg signed [31:0] abb_re5
,output reg signed [31:0] ab_pow3_re5
,output reg signed [31:0] ab_pow4_re5
,output reg signed [31:0] ab_pow5_re5
,output reg signed [31:0] ab_pow6_re5
,output reg signed [31:0] ab_pow7_re5
,output reg signed [31:0] b_pow8_re5
);
reg vldi_or_r1;
wire vldi_or = | vldi;
sirv_gnrl_dffr #(1) dff_vldi_or_1(vldi_or, vldi_or_r1 ,clk,rstn);
reg signed [data_in_width-1:0] a_re_r1;
reg signed [data_in_width-1:0] b_re_r1;
always @(posedge clk or negedge rstn) begin
if(rstn == 1'b0) begin
a_re_r1 <= 'h0;
b_re_r1 <= 'h0;
end
else if(|vldi) begin
case(1'b1)
vldi[0]: begin
a_re_r1 <= a0_re;
b_re_r1 <= b0_re;
end
vldi[1]: begin
a_re_r1 <= a1_re;
b_re_r1 <= b1_re;
end
vldi[2]: begin
a_re_r1 <= a2_re;
b_re_r1 <= b2_re;
end
vldi[3]: begin
a_re_r1 <= a3_re;
b_re_r1 <= b3_re;
end
vldi[4]: begin
a_re_r1 <= a4_re;
b_re_r1 <= b4_re;
end
vldi[5]: begin
a_re_r1 <= a5_re;
b_re_r1 <= b5_re;
end
// default: begin
// a_re_r1 <= a_re[0];
// b_re_r1 <= b_re[0];
// end
endcase
end
end
reg en;
reg en_r1;
sirv_gnrl_dffr #(1) dff_en_1(en, en_r1 ,clk,rstn);
reg [3:0] cnt0;
wire add_cnt0;
wire end_cnt0;
always @(posedge clk or negedge rstn)begin
if(!rstn)begin
cnt0 <= 0;
end
else if(add_cnt0)begin
if(end_cnt0)
cnt0 <= 0;
else
cnt0 <= cnt0 + 1;
end
end
assign add_cnt0 = en;
assign end_cnt0 = add_cnt0 && cnt0== 8-1;
wire en_l;
wire en_h;
always @(posedge clk or negedge rstn)begin
if(rstn==1'b0)begin
en <= 0;
end
else if(en_h)begin
en <= 1;
end
else if(en_l)begin
en <= 0;
end
end
assign en_h = vldi_or == 1 && vldi_or_r1 == 0 && cnt0 == 0;
assign en_l = end_cnt0;
reg signed [data_in_width-1:0] bin_re;
wire signed [data_in_width-1:0] bout_re;
always @(*)begin
if(en_r1) begin
bin_re <= bout_re;
end
else begin
bin_re <= 32'd2147483647;
end
end
mult_real
#(
.A_width(data_in_width)
,.C_width(coef_width)
,.o_width(data_in_width)
)
inst_c1 (
.clk (clk ),
.rstn (rstn ),
.en (en ),
.din (bin_re ),
.coef (b_re_r1 ),
.dout (bout_re )
);
wire signed [data_in_width-1:0] abo_re;
mult_real
#(
.A_width(data_in_width)
,.C_width(coef_width)
,.o_width(data_in_width)
)
inst_c2 (
.clk (clk ),
.rstn (rstn ),
.en (en ),
.din (bin_re ),
.coef (a_re_r1 ),
.dout (abo_re )
);
reg signed [coef_width-1 :0] ao_re_r1 ;
reg signed [coef_width-1 :0] ab_re_r1 ;
reg signed [coef_width-1 :0] abb_re_r1 ;
reg signed [coef_width-1 :0] ab_pow3_re_r1 ;
reg signed [coef_width-1 :0] ab_pow4_re_r1 ;
reg signed [coef_width-1 :0] ab_pow5_re_r1 ;
reg signed [coef_width-1 :0] ab_pow6_re_r1 ;
reg signed [coef_width-1 :0] ab_pow7_re_r1 ;
reg signed [coef_width-1 :0] bo_re_r1 ;
reg signed [coef_width-1 :0] b_pow8_re_r1 ;
always @(posedge clk or negedge rstn)begin
if(!rstn)begin
ao_re_r1 <= 0;
ab_re_r1 <= 0;
abb_re_r1 <= 0;
ab_pow3_re_r1 <= 0;
ab_pow4_re_r1 <= 0;
ab_pow5_re_r1 <= 0;
ab_pow6_re_r1 <= 0;
ab_pow7_re_r1 <= 0;
bo_re_r1 <= 0;
b_pow8_re_r1 <= 0;
end
else if(add_cnt0 && cnt0 == 1 && en_r1)begin
ao_re_r1 <= abo_re;
bo_re_r1 <= bin_re;
end
else if(add_cnt0 && cnt0 == 2 && en_r1)begin
ab_re_r1 <= abo_re;
end
else if(add_cnt0 && cnt0 == 3 && en_r1)begin
abb_re_r1 <= abo_re;
end
else if(add_cnt0 && cnt0 == 4 && en_r1)begin
ab_pow3_re_r1 <= abo_re;
end
else if(add_cnt0 && cnt0 == 5 && en_r1)begin
ab_pow4_re_r1 <= abo_re;
end
else if(add_cnt0 && cnt0 == 6 && en_r1)begin
ab_pow5_re_r1 <= abo_re;
end
else if(add_cnt0 && cnt0 == 7 && en_r1)begin
ab_pow6_re_r1 <= abo_re;
end
else if(cnt0 == 0 && en_r1)begin
ab_pow7_re_r1 <= abo_re;
b_pow8_re_r1 <= bin_re;
end
// else begin
// end
end
reg [5:0] vldi_r1;
reg [5:0] vldi_r2;
reg [5:0] vldi_r3;
reg [5:0] vldi_r4;
reg [5:0] vldi_r5;
reg [5:0] vldi_r6;
reg [5:0] vldi_r7;
reg [5:0] vldi_r8;
reg [5:0] vldi_r9;
reg [5:0] vldi_r10;
//syncer #(6, 10) sync_vldo_syncer (clk, rstn, vldi, vldi_r10);
sirv_gnrl_dffr #(6) dff_vldi_1(vldi,vldi_r1,clk,rstn);
sirv_gnrl_dffr #(6) dff_vldi_2(vldi_r1, vldi_r2 ,clk,rstn);
sirv_gnrl_dffr #(6) dff_vldi_3(vldi_r2, vldi_r3 ,clk,rstn);
sirv_gnrl_dffr #(6) dff_vldi_4(vldi_r3, vldi_r4 ,clk,rstn);
sirv_gnrl_dffr #(6) dff_vldi_5(vldi_r4, vldi_r5 ,clk,rstn);
sirv_gnrl_dffr #(6) dff_vldi_6(vldi_r5, vldi_r6 ,clk,rstn);
sirv_gnrl_dffr #(6) dff_vldi_7(vldi_r6, vldi_r7 ,clk,rstn);
sirv_gnrl_dffr #(6) dff_vldi_8(vldi_r7, vldi_r8 ,clk,rstn);
sirv_gnrl_dffr #(6) dff_vldi_9(vldi_r8, vldi_r9 ,clk,rstn);
sirv_gnrl_dffr #(6) dff_vldi_10(vldi_r9, vldi_r10,clk,rstn);
always @(posedge clk or negedge rstn) begin
if(!rstn) begin
a_re0 <= 0;
b_re0 <= 0;
ab_re0 <= 0;
abb_re0 <= 0;
ab_pow3_re0 <= 0;
ab_pow4_re0 <= 0;
ab_pow5_re0 <= 0;
ab_pow6_re0 <= 0;
ab_pow7_re0 <= 0;
b_pow8_re0 <= 0;
a_re1 <= 0;
b_re1 <= 0;
ab_re1 <= 0;
abb_re1 <= 0;
ab_pow3_re1 <= 0;
ab_pow4_re1 <= 0;
ab_pow5_re1 <= 0;
ab_pow6_re1 <= 0;
ab_pow7_re1 <= 0;
b_pow8_re1 <= 0;
a_re2 <= 0;
b_re2 <= 0;
ab_re2 <= 0;
abb_re2 <= 0;
ab_pow3_re2 <= 0;
ab_pow4_re2 <= 0;
ab_pow5_re2 <= 0;
ab_pow6_re2 <= 0;
ab_pow7_re2 <= 0;
b_pow8_re2 <= 0;
a_re3 <= 0;
b_re3 <= 0;
ab_re3 <= 0;
abb_re3 <= 0;
ab_pow3_re3 <= 0;
ab_pow4_re3 <= 0;
ab_pow5_re3 <= 0;
ab_pow6_re3 <= 0;
ab_pow7_re3 <= 0;
b_pow8_re3 <= 0;
a_re4 <= 0;
b_re4 <= 0;
ab_re4 <= 0;
abb_re4 <= 0;
ab_pow3_re4 <= 0;
ab_pow4_re4 <= 0;
ab_pow5_re4 <= 0;
ab_pow6_re4 <= 0;
ab_pow7_re4 <= 0;
b_pow8_re4 <= 0;
a_re5 <= 0;
b_re5 <= 0;
ab_re5 <= 0;
abb_re5 <= 0;
ab_pow3_re5 <= 0;
ab_pow4_re5 <= 0;
ab_pow5_re5 <= 0;
ab_pow6_re5 <= 0;
ab_pow7_re5 <= 0;
b_pow8_re5 <= 0;
end
else if(|vldi_r10) begin
case(1'b1)
vldi_r10[0]: begin
a_re0 <= ao_re_r1 ;
b_re0 <= bo_re_r1 ;
ab_re0 <= ab_re_r1 ;
abb_re0 <= abb_re_r1 ;
ab_pow3_re0 <= ab_pow3_re_r1;
ab_pow4_re0 <= ab_pow4_re_r1;
ab_pow5_re0 <= ab_pow5_re_r1;
ab_pow6_re0 <= ab_pow6_re_r1;
ab_pow7_re0 <= ab_pow7_re_r1;
b_pow8_re0 <= b_pow8_re_r1 ;
end
vldi_r10[1]: begin
a_re1 <= ao_re_r1 ;
b_re1 <= bo_re_r1 ;
ab_re1 <= ab_re_r1 ;
abb_re1 <= abb_re_r1 ;
ab_pow3_re1 <= ab_pow3_re_r1;
ab_pow4_re1 <= ab_pow4_re_r1;
ab_pow5_re1 <= ab_pow5_re_r1;
ab_pow6_re1 <= ab_pow6_re_r1;
ab_pow7_re1 <= ab_pow7_re_r1;
b_pow8_re1 <= b_pow8_re_r1 ;
end
vldi_r10[2]: begin
a_re2 <= ao_re_r1 ;
b_re2 <= bo_re_r1 ;
ab_re2 <= ab_re_r1 ;
abb_re2 <= abb_re_r1 ;
ab_pow3_re2 <= ab_pow3_re_r1;
ab_pow4_re2 <= ab_pow4_re_r1;
ab_pow5_re2 <= ab_pow5_re_r1;
ab_pow6_re2 <= ab_pow6_re_r1;
ab_pow7_re2 <= ab_pow7_re_r1;
b_pow8_re2 <= b_pow8_re_r1 ;
end
vldi_r10[3]: begin
a_re3 <= ao_re_r1 ;
b_re3 <= bo_re_r1 ;
ab_re3 <= ab_re_r1 ;
abb_re3 <= abb_re_r1 ;
ab_pow3_re3 <= ab_pow3_re_r1;
ab_pow4_re3 <= ab_pow4_re_r1;
ab_pow5_re3 <= ab_pow5_re_r1;
ab_pow6_re3 <= ab_pow6_re_r1;
ab_pow7_re3 <= ab_pow7_re_r1;
b_pow8_re3 <= b_pow8_re_r1 ;
end
vldi_r10[4]: begin
a_re4 <= ao_re_r1 ;
b_re4 <= bo_re_r1 ;
ab_re4 <= ab_re_r1 ;
abb_re4 <= abb_re_r1 ;
ab_pow3_re4 <= ab_pow3_re_r1;
ab_pow4_re4 <= ab_pow4_re_r1;
ab_pow5_re4 <= ab_pow5_re_r1;
ab_pow6_re4 <= ab_pow6_re_r1;
ab_pow7_re4 <= ab_pow7_re_r1;
b_pow8_re4 <= b_pow8_re_r1 ;
end
vldi_r10[5]: begin
a_re5 <= ao_re_r1 ;
b_re5 <= bo_re_r1 ;
ab_re5 <= ab_re_r1 ;
abb_re5 <= abb_re_r1 ;
ab_pow3_re5 <= ab_pow3_re_r1;
ab_pow4_re5 <= ab_pow4_re_r1;
ab_pow5_re5 <= ab_pow5_re_r1;
ab_pow6_re5 <= ab_pow6_re_r1;
ab_pow7_re5 <= ab_pow7_re_r1;
b_pow8_re5 <= b_pow8_re_r1 ;
end
// default: begin
// ao_re[0] <= 'h0;
// ab_re[0] <= 'h0;
// abb_re[0] <= 'h0;
// ab_pow3_re[0] <= 'h0;
// ab_pow4_re[0] <= 'h0;
// ab_pow5_re[0] <= 'h0;
// ab_pow6_re[0] <= 'h0;
// ab_pow7_re[0] <= 'h0;
// b_pow8_re[0] <= 'h0;
// end
endcase
end
end
endmodule