2025-03-08 11:32:53 +08:00
|
|
|
`timescale 1 ns/1 ns
|
|
|
|
module TB();
|
|
|
|
|
|
|
|
|
|
|
|
reg [1 :0] source_mode;
|
|
|
|
|
|
|
|
initial
|
|
|
|
begin
|
|
|
|
$fsdbDumpfile("TB.fsdb");
|
|
|
|
$fsdbDumpvars(0, TB);
|
|
|
|
$fsdbDumpMDA();
|
|
|
|
// $srandom(417492050);
|
2025-03-20 15:32:42 +08:00
|
|
|
source_mode = 2'd3; //1 for rect;2 for random;3 from matlab
|
2025-03-08 11:32:53 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
reg rstn;
|
|
|
|
|
|
|
|
reg [15:0] din_rect;
|
2025-04-18 15:16:50 +08:00
|
|
|
reg [ 3:0] vldi_coef;
|
2025-03-08 11:32:53 +08:00
|
|
|
reg vldi_data;
|
|
|
|
|
|
|
|
parameter CYCLE = 20;
|
|
|
|
|
|
|
|
reg clk;
|
|
|
|
initial begin
|
|
|
|
clk = 0;
|
|
|
|
forever
|
|
|
|
#(CYCLE/2)
|
|
|
|
clk=~clk;
|
|
|
|
end
|
|
|
|
|
|
|
|
|
2025-04-18 15:16:50 +08:00
|
|
|
reg en;
|
|
|
|
reg signed [31:0] a_re [3:0];
|
|
|
|
reg signed [31:0] b_re [3:0];
|
|
|
|
reg signed [31:0] a_im [3:0];
|
|
|
|
reg signed [31:0] b_im [3:0];
|
2025-03-08 11:32:53 +08:00
|
|
|
|
|
|
|
initial begin
|
|
|
|
rstn = 0;
|
|
|
|
vldi_data <= 0;
|
|
|
|
vldi_coef <= 0;
|
|
|
|
din_rect = 16'd0;
|
2025-04-18 15:16:50 +08:00
|
|
|
a_re[0] <= 0;
|
|
|
|
b_re[0] <= 0;
|
|
|
|
a_re[1] <= 0;
|
|
|
|
b_re[1] <= 0;
|
|
|
|
a_re[2] <= 0;
|
|
|
|
b_re[2] <= 0;
|
2025-03-13 23:33:51 +08:00
|
|
|
a_re[3] <= 0;
|
|
|
|
b_re[3] <= 0;
|
2025-04-18 15:16:50 +08:00
|
|
|
a_im[0] <= 0;
|
|
|
|
b_im[0] <= 0;
|
|
|
|
a_im[1] <= 0;
|
|
|
|
b_im[1] <= 0;
|
|
|
|
a_im[2] <= 0;
|
|
|
|
b_im[2] <= 0;
|
|
|
|
a_im[3] <= 0;
|
|
|
|
b_im[3] <= 0;
|
|
|
|
en <= 0;
|
2025-03-08 11:32:53 +08:00
|
|
|
repeat(3) @(posedge clk);
|
|
|
|
vldi_coef[0] <= 1;
|
|
|
|
rstn = 1;
|
2025-04-18 15:16:50 +08:00
|
|
|
en <= 1;
|
2025-03-08 11:32:53 +08:00
|
|
|
a_re[0] <= 55007237;
|
|
|
|
b_re[0] <= 2143083068;
|
|
|
|
@(posedge clk);
|
|
|
|
vldi_coef[0] <= 0;
|
|
|
|
a_re[0] <= 0;
|
|
|
|
b_re[0] <= 0;
|
2025-04-18 15:16:50 +08:00
|
|
|
repeat(16) @(posedge clk);
|
2025-03-08 11:32:53 +08:00
|
|
|
vldi_coef[1] <= 1;
|
|
|
|
rstn = 1;
|
|
|
|
a_re[1] <= 32690030;
|
|
|
|
b_re[1] <= 2145807236;
|
|
|
|
@(posedge clk);
|
|
|
|
vldi_coef[1] <= 0;
|
|
|
|
a_re[1] <= 0;
|
|
|
|
b_re[1] <= 0;
|
2025-04-18 15:16:50 +08:00
|
|
|
repeat(16) @(posedge clk);
|
2025-03-08 11:32:53 +08:00
|
|
|
vldi_coef[2] <= 1;
|
|
|
|
rstn = 1;
|
|
|
|
a_re[2] <= 429516;
|
|
|
|
b_re[2] <= 2146812530;
|
|
|
|
@(posedge clk);
|
|
|
|
vldi_coef[2] <= 0;
|
|
|
|
a_re[2] <= 0;
|
|
|
|
b_re[2] <= 0;
|
|
|
|
repeat(108) @(posedge clk);
|
|
|
|
vldi_data <= 1;
|
|
|
|
// repeat(10000) @(posedge clk);
|
|
|
|
// vldi_data <= 0;
|
|
|
|
|
|
|
|
end
|
|
|
|
|
2025-03-12 10:16:52 +08:00
|
|
|
|
2025-03-08 11:32:53 +08:00
|
|
|
reg [21:0] cnt;
|
|
|
|
always@(posedge clk or negedge rstn)
|
|
|
|
if(!rstn)
|
|
|
|
cnt <= 22'd0;
|
|
|
|
else
|
|
|
|
cnt <= cnt + 22'd1;
|
|
|
|
|
|
|
|
initial
|
|
|
|
begin
|
|
|
|
wait(cnt[16]==1'b1)
|
|
|
|
$finish(0);
|
|
|
|
end
|
|
|
|
|
|
|
|
reg vldi_data_r1;
|
|
|
|
always@(posedge clk or negedge rstn)
|
|
|
|
if(!rstn)
|
|
|
|
vldi_data_r1 <= 1'b0;
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
vldi_data_r1 <= vldi_data;
|
|
|
|
end
|
|
|
|
|
|
|
|
always@(posedge clk or negedge rstn)
|
|
|
|
if(!rstn)
|
|
|
|
din_rect <= 22'd0;
|
|
|
|
else if(vldi_data)
|
|
|
|
begin
|
|
|
|
din_rect <= 16'd30000;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
din_rect <= 16'd0;
|
|
|
|
end
|
|
|
|
|
2025-04-18 15:16:50 +08:00
|
|
|
reg signed [15:0] random_in [0:15];
|
2025-03-08 11:32:53 +08:00
|
|
|
|
|
|
|
always @(posedge clk or negedge rstn) begin
|
|
|
|
if (!rstn) begin
|
2025-04-18 15:16:50 +08:00
|
|
|
for (int i = 0; i < 16; i = i + 1) begin
|
2025-03-08 11:32:53 +08:00
|
|
|
random_in[i] <= 16'd0;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else if (vldi_data) begin
|
2025-04-18 15:16:50 +08:00
|
|
|
for (int i = 0; i < 16; i = i + 1) begin
|
2025-03-08 11:32:53 +08:00
|
|
|
random_in[i] <= $urandom % 30000;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else begin
|
2025-04-18 15:16:50 +08:00
|
|
|
for (int i = 0; i < 16; i = i + 1) begin
|
2025-03-08 11:32:53 +08:00
|
|
|
random_in[i] <= 16'd0;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2025-04-18 15:16:50 +08:00
|
|
|
integer file[15:0];
|
|
|
|
reg [15:0] data[15:0];
|
|
|
|
integer status[15:0];
|
|
|
|
reg [15:0] reg_array[15:0];
|
|
|
|
string filenames[15:0];
|
2025-03-08 11:32:53 +08:00
|
|
|
initial begin
|
2025-03-12 10:16:52 +08:00
|
|
|
if(source_mode == 3) begin
|
2025-04-18 15:16:50 +08:00
|
|
|
// string filenames[0:3] = {"in0_matlab.dat", "in1_matlab.dat", "in2_matlab.dat", "in3_matlab.dat"};
|
|
|
|
for (int i = 0; i < 16; i++) begin
|
|
|
|
$sformat(filenames[i], "in%0d_matlab.dat", i);
|
|
|
|
end
|
|
|
|
for (int i = 0; i < 16; i = i + 1) begin
|
2025-03-12 10:16:52 +08:00
|
|
|
file[i] = $fopen(filenames[i], "r");
|
|
|
|
if (file[i] == 0) begin
|
|
|
|
$display("Failed to open file: %s", filenames[i]);
|
|
|
|
$finish;
|
|
|
|
end
|
2025-03-08 11:32:53 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2025-04-18 15:16:50 +08:00
|
|
|
always @(posedge clk or negedge rstn) begin
|
|
|
|
if (!rstn) begin
|
|
|
|
for (int i = 0; i < 16; i = i + 1) begin
|
|
|
|
reg_array[i] <= 16'd0;
|
|
|
|
end
|
|
|
|
end else if(vldi_data && source_mode == 3) begin
|
|
|
|
for (int i = 0; i < 16; i = i + 1) begin
|
|
|
|
status[i] = $fscanf(file[i], "%d\n", data[i]);
|
|
|
|
if (status[i] == 1 ) begin
|
|
|
|
reg_array[i] <= data[i];
|
2025-03-08 11:32:53 +08:00
|
|
|
end
|
2025-04-18 15:16:50 +08:00
|
|
|
else begin
|
|
|
|
reg_array[i] <= 16'd0;
|
|
|
|
vldi_data <= 0;
|
|
|
|
end
|
2025-03-08 11:32:53 +08:00
|
|
|
end
|
|
|
|
end
|
2025-04-18 15:16:50 +08:00
|
|
|
end
|
2025-03-12 10:16:52 +08:00
|
|
|
|
2025-04-18 15:16:50 +08:00
|
|
|
reg signed [15:0] iir_in[15:0];
|
2025-03-08 11:32:53 +08:00
|
|
|
|
|
|
|
always @(*)
|
|
|
|
case(source_mode)
|
|
|
|
2'b01 : begin
|
2025-04-18 15:16:50 +08:00
|
|
|
for (int i = 0; i < 16; i = i + 1) begin
|
2025-03-08 11:32:53 +08:00
|
|
|
iir_in[i] = din_rect;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
2'b10 : begin
|
2025-04-18 15:16:50 +08:00
|
|
|
for (int i = 0; i < 16; i = i + 1) begin
|
2025-03-08 11:32:53 +08:00
|
|
|
iir_in[i] = random_in[i];
|
|
|
|
end
|
|
|
|
end
|
|
|
|
2'b11 : begin
|
2025-04-18 15:16:50 +08:00
|
|
|
for (int i = 0; i < 16; i = i + 1) begin
|
2025-03-08 11:32:53 +08:00
|
|
|
iir_in[i] = reg_array[i];
|
|
|
|
end
|
|
|
|
end
|
|
|
|
endcase
|
|
|
|
|
|
|
|
wire [1:0] intp_mode;
|
|
|
|
assign intp_mode = 2'b10;
|
|
|
|
|
|
|
|
wire [1:0] dac_mode_sel;
|
|
|
|
assign dac_mode_sel = 2'b00;
|
|
|
|
|
|
|
|
wire tc_bypass;
|
|
|
|
wire vldo;
|
|
|
|
|
|
|
|
assign tc_bypass = 1'b0;
|
|
|
|
|
2025-04-18 15:16:50 +08:00
|
|
|
//always @(posedge clk or negedge rstn)begin
|
|
|
|
// if(rstn==1'b0)begin
|
|
|
|
// en <= 1;
|
|
|
|
// end
|
|
|
|
// else begin
|
|
|
|
// en <= ~en;
|
|
|
|
// end
|
|
|
|
//end
|
|
|
|
wire signed [15:0] dout_p[15:0];
|
|
|
|
|
|
|
|
z_dsp u_z_dsp(
|
|
|
|
.rstn ( rstn ),
|
|
|
|
.clk ( clk ),
|
|
|
|
.en ( en ),
|
|
|
|
.vldi_coef ( vldi_coef ),
|
|
|
|
.vldi_data ( vldi_data && vldi_data_r1 ),
|
|
|
|
.din0 ( iir_in[0] ),
|
|
|
|
.din1 ( iir_in[1] ),
|
|
|
|
.din2 ( iir_in[2] ),
|
|
|
|
.din3 ( iir_in[3] ),
|
|
|
|
.din4 ( iir_in[4] ),
|
|
|
|
.din5 ( iir_in[5] ),
|
|
|
|
.din6 ( iir_in[6] ),
|
|
|
|
.din7 ( iir_in[7] ),
|
|
|
|
.din8 ( iir_in[8] ),
|
|
|
|
.din9 ( iir_in[9] ),
|
|
|
|
.dina ( iir_in[10] ),
|
|
|
|
.dinb ( iir_in[11] ),
|
|
|
|
.dinc ( iir_in[12] ),
|
|
|
|
.dind ( iir_in[13] ),
|
|
|
|
.dine ( iir_in[14] ),
|
|
|
|
.dinf ( iir_in[15] ),
|
|
|
|
.a0_re ( a_re[0] ),
|
|
|
|
.b0_re ( b_re[0] ),
|
|
|
|
.a1_re ( a_re[1] ),
|
|
|
|
.b1_re ( b_re[1] ),
|
|
|
|
.a2_re ( a_re[2] ),
|
|
|
|
.b2_re ( b_re[2] ),
|
|
|
|
.a3_re ( a_re[3] ),
|
|
|
|
.b3_re ( b_re[3] ),
|
|
|
|
.a0_im ( a_im[0] ),
|
|
|
|
.b0_im ( b_im[0] ),
|
|
|
|
.a1_im ( a_im[1] ),
|
|
|
|
.b1_im ( b_im[1] ),
|
|
|
|
.a2_im ( a_im[2] ),
|
|
|
|
.b2_im ( b_im[2] ),
|
|
|
|
.a3_im ( a_im[3] ),
|
|
|
|
.b3_im ( b_im[3] ),
|
|
|
|
.dout0 ( dout_p[0] ),
|
|
|
|
.dout1 ( dout_p[1] ),
|
|
|
|
.dout2 ( dout_p[2] ),
|
|
|
|
.dout3 ( dout_p[3] ),
|
|
|
|
.dout4 ( dout_p[4] ),
|
|
|
|
.dout5 ( dout_p[5] ),
|
|
|
|
.dout6 ( dout_p[6] ),
|
|
|
|
.dout7 ( dout_p[7] ),
|
|
|
|
.dout8 ( dout_p[8] ),
|
|
|
|
.dout9 ( dout_p[9] ),
|
|
|
|
.douta ( dout_p[10] ),
|
|
|
|
.doutb ( dout_p[11] ),
|
|
|
|
.doutc ( dout_p[12] ),
|
|
|
|
.doutd ( dout_p[13] ),
|
|
|
|
.doute ( dout_p[14] ),
|
|
|
|
.doutf ( dout_p[15] ),
|
|
|
|
.vldo ( vldo )
|
|
|
|
);
|
|
|
|
|
|
|
|
//integer signed In_fid[0:3];
|
|
|
|
integer signed dout_fid[0:15];
|
|
|
|
//string filenames_in[0:3] = {"in0.dat", "in1.dat", "in2.dat", "in3.dat"};
|
|
|
|
string filenames_dout[0:15] = {
|
|
|
|
"dout0.dat", "dout1.dat", "dout2.dat", "dout3.dat",
|
|
|
|
"dout4.dat", "dout5.dat", "dout6.dat", "dout7.dat",
|
|
|
|
"dout8.dat", "dout9.dat", "dout10.dat", "dout11.dat",
|
|
|
|
"dout12.dat", "dout13.dat", "dout14.dat", "dout15.dat"
|
|
|
|
};
|
2025-03-08 11:32:53 +08:00
|
|
|
initial begin
|
|
|
|
#0;
|
2025-04-18 15:16:50 +08:00
|
|
|
// for (int i = 0; i < 4; i = i + 1) begin
|
|
|
|
// In_fid[i] = $fopen(filenames_in[i]);
|
|
|
|
// end
|
|
|
|
for (int i = 0; i < 16; i = i + 1) begin
|
2025-03-08 11:32:53 +08:00
|
|
|
dout_fid[i] = $fopen(filenames_dout[i]);
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2025-04-18 15:16:50 +08:00
|
|
|
//always @(posedge clk) begin
|
|
|
|
// if (vldi_data_r1) begin
|
|
|
|
// for (int i = 0; i < 4; i = i + 1) begin
|
|
|
|
// $fwrite(In_fid[i], "%d\n", $signed(iir_in[i]));
|
|
|
|
// end
|
|
|
|
// end
|
|
|
|
//end
|
2025-03-08 11:32:53 +08:00
|
|
|
|
|
|
|
always @(posedge clk) begin
|
|
|
|
if (vldo) begin
|
2025-04-18 15:16:50 +08:00
|
|
|
for (int i = 0; i < 16; i = i + 1) begin
|
2025-03-08 11:32:53 +08:00
|
|
|
$fwrite(dout_fid[i], "%d\n", $signed(dout_p[i]));
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
endmodule
|
|
|
|
|