仿真过程中 FIR 低通滤波器模块错误

FIR lowpass filter module error during simulation

这是一个FIR低通滤波器模块,使用Kogge Stone Adder进行加法。该错误似乎是在使用 Kogge 石头加法器电路时发生的。 如果移除 kogge stone adder 部分,模块工作正常(第 38 -72 行) 如果使用第 189 行(m_axis_fir_tdata <= acc0 + acc1 +...)代替 m_axis_fir_tdata <= res15.

这是我正在使用的 Kogge stone adder
这是顶层模块

    module FIR(
    input clk,
    input reset,
    input signed [15:0] s_axis_fir_tdata, 
    input s_axis_fir_tvalid,
    input m_axis_fir_tready,
    output reg m_axis_fir_tvalid,
    output reg s_axis_fir_tready,
    output reg signed [31:0] m_axis_fir_tdata
    );
    reg enable_fir, enable_buff;
    reg [5:0] buff_cnt;
    reg signed [15:0] in_sample; 
    reg signed [15:0] buff0, buff1, buff2, buff3, buff4, buff5, buff6, buff7, buff8, buff9, buff10, buff11, buff12, buff13, buff14, buff15,buff16; 
    wire signed [15:0] tap0, tap1, tap2,  tap3, tap4, tap5, tap6, tap7, tap8, tap9, tap10, tap11, tap12, tap13, tap14, tap15, tap16; 
    reg signed [31:0] acc0, acc1, acc2, acc3, acc4, acc5, acc6, acc7, acc8, acc9, acc10, acc11, acc12, acc13, acc14, acc15, acc16; 
    wire signed [31:0] val0,val1,val2,val3,val4,val5,val6,val7,val8,val9,val10,val11,val12,val13,val14,val15,val16;
    
   
    assign tap0 = -17; 
    assign tap1 = 62;  
    assign tap2 = 456;  
    assign tap3 = 1482;  
    assign tap4 = 3367;  
    assign tap5 = 6013;  
    assign tap6 = 8880;  
    assign tap7 = 11129;  
    assign tap8 = 11983;  
    assign tap9 = 11129;  
    assign tap10 = 8880; 
    assign tap11 = 6013; 
    assign tap12 = 3367; 
    assign tap13 = 1482;
    assign tap14 = 456; 
    assign tap15 = 62;
    assign tap16 = -17;
    
    assign val0 = acc0;
    assign val1 = acc1;
    assign val2 = acc2;
    assign val3 = acc3;
    assign val4 = acc4;
    assign val5 = acc5;
    assign val6 = acc6;
    assign val7 = acc7;
    assign val8 = acc8;
    assign val9 = acc9;
    assign val10 = acc10;
    assign val11 = acc11;
    assign val12 = acc12;
    assign val13 = acc13;
    assign val14 = acc14;
    assign val15 = acc15;
    assign val16 = acc16;
    wire [31:0] res0,res1,res2,res3,res4,res5,res6,res7,res8,res9,res10,res11,res12,res13,res14,res15;
    wire carry0,carry1,carry2,carry3,carry4,carry5,carry6,carry7,carry8,carry9,carry10,carry11,carry12,carry13,carry14,carry15;
    ksa_top a0(1'b0,val0,val1,res0,carry0);
    ksa_top a1(carry0,res0,val2,res1,carry1);    
    ksa_top a2(carry1,res1,val3,res2,carry2);
    ksa_top a3(carry2,res2,val4,res3,carry3);
    ksa_top a4(carry3,res3,val5,res4,carry4);
    ksa_top a5(carry4,res4,val6,res5,carry5);
    ksa_top a6(carry5,res5,val7,res6,carry6);
    ksa_top a7(carry6,res6,val8,res7,carry7);
    ksa_top a8(carry7,res7,val9,res8,carry8);
    ksa_top a9(carry8,res8,val10,res9,carry9);
    ksa_top a10(carry9,res9,val11,res10,carry10);
    ksa_top a11(carry10,res10,val12,res11,carry11);
    ksa_top a12(carry11,res11,val13,res12,carry12);
    ksa_top a13(carry12,res12,val14,res13,carry13);
    ksa_top a14(carry13,res13,val15,res14,carry14);
    ksa_top a15(carry14,res14,val16,res15,carry15);  
    always @ (posedge clk or negedge reset)
        begin
            if (reset == 1'b0) 
                begin
                    buff_cnt <= 4'd0;
                    enable_fir <= 1'b0;
                    in_sample <= 8'd0;
                end
            else if (m_axis_fir_tready == 1'b0 || s_axis_fir_tvalid == 1'b0)
                begin
                    enable_fir <= 1'b0;
                    buff_cnt <= 6'd51;
                    in_sample <= in_sample;
                end
            else if (buff_cnt == 6'd51)
                begin
                    buff_cnt <= 4'd0;
                    enable_fir <= 1'b1;
                    in_sample <= s_axis_fir_tdata;
                end
            else
                begin
                    buff_cnt <= buff_cnt + 1;
                    in_sample <= s_axis_fir_tdata;
                end
        end   

    always @ (posedge clk)
        begin
            if(reset == 1'b0 || m_axis_fir_tready == 1'b0 || s_axis_fir_tvalid == 1'b0)
                begin
                    s_axis_fir_tready <= 1'b0;
                    m_axis_fir_tvalid <= 1'b0;
                    enable_buff <= 1'b0;
                end
            else
                begin
                    s_axis_fir_tready <= 1'b1;
                    m_axis_fir_tvalid <= 1'b1;
                    enable_buff <= 1'b1;
                end
        end
    
    
    always @ (posedge clk)
        begin
            if(enable_buff == 1'b1)
                begin
                    buff0 <= in_sample;
                    buff1 <= buff0;        
                    buff2 <= buff1;         
                    buff3 <= buff2;      
                    buff4 <= buff3;      
                    buff5 <= buff4;       
                    buff6 <= buff5;    
                    buff7 <= buff6;       
                    buff8 <= buff7;       
                    buff9 <= buff8;       
                    buff10 <= buff9;        
                    buff11 <= buff10;       
                    buff12 <= buff11;       
                    buff13 <= buff12;       
                    buff14 <= buff13;
                    buff15 <= buff14;
                    buff16 <= buff15;    
                end
            else
                begin
                    buff0 <= 0;
                    buff1 <= 0;        
                    buff2 <= 0;         
                    buff3 <= 0;      
                    buff4 <= 0;      
                    buff5 <= 0;       
                    buff6 <= 0;    
                    buff7 <= 0;       
                    buff8 <= 0;       
                    buff9 <= 0;       
                    buff10 <= 0;        
                    buff11 <= 0;       
                    buff12 <= 0;       
                    buff13 <= 0;       
                    buff14 <= 0;
                    buff15 <= 0;
                    buff16 <= 0;                
                end
        end
        
    
    always @ (posedge clk)
        begin
            if (enable_fir == 1'b1)
                begin
                    acc0 <= tap0 * buff0;
                    acc1 <= tap1 * buff1;
                    acc2 <= tap2 * buff2;
                    acc3 <= tap3 * buff3;
                    acc4 <= tap4 * buff4;
                    acc5 <= tap5 * buff5;
                    acc6 <= tap6 * buff6;
                    acc7 <= tap7 * buff7;
                    acc8 <= tap8 * buff8;
                    acc9 <= tap9 * buff9;
                    acc10 <= tap10 * buff10;
                    acc11 <= tap11 * buff11;
                    acc12 <= tap12 * buff12;
                    acc13 <= tap13 * buff13;
                    acc14 <= tap14 * buff14;
                    acc15 <= tap15 * buff15;
                    acc16 <= tap16 * buff16;
                end
        end       
    always @ (posedge clk) 
        begin 
            if (enable_fir == 1'b1)
                begin
                   //m_axis_fir_tdata <= acc0 + acc1 + acc2 + acc3 + acc4 + acc5 + acc6 + acc7 + acc8 + acc9 + acc10 + acc11 + acc12 + acc13 + acc14 + acc15 + acc16;
                   m_axis_fir_tdata <= res15;
                         
                end
        end
endmodule

这是测试平台

module tb_FIR;

    reg clk, reset, s_axis_fir_tvalid, m_axis_fir_tready;
    reg signed [15:0] s_axis_fir_tdata;
    wire m_axis_fir_tvalid;
    wire [31:0] m_axis_fir_tdata;
    
    
    always begin
        clk = 1; #5;
        clk = 0; #5;
    end
    
    always begin
        reset = 1; #20;
        reset = 0; #50;
        reset = 1; #1000000;
    end
    
    always begin
        s_axis_fir_tvalid = 0; #100;
        s_axis_fir_tvalid = 1; #1000;
        s_axis_fir_tvalid = 0; #50;
        s_axis_fir_tvalid = 1; #998920;
    end
    
    always begin
        m_axis_fir_tready = 1; #1500;
        m_axis_fir_tready = 0; #100;
        m_axis_fir_tready = 1; #998400;
    end
    
    
    FIR FIR_i(
        .clk(clk),
        .reset(reset),
        .s_axis_fir_tdata(s_axis_fir_tdata),    
        .s_axis_fir_tvalid(s_axis_fir_tvalid), 
        .m_axis_fir_tready(m_axis_fir_tready),
        .m_axis_fir_tvalid(m_axis_fir_tvalid), 
        .s_axis_fir_tready(s_axis_fir_tready),   
        .m_axis_fir_tdata(m_axis_fir_tdata));  
        
    reg signed[15:0] mem[241:0];
    initial begin
        $readmemb("C:/Users/adith/docs/KTU/Verilog-FIR-master/analysis/databin.mem" , mem);
    end
    
    integer i=0;
    initial begin
        #15;
        for(i = 0 ; i < 242 ; i = i+1) begin
            s_axis_fir_tdata  = mem[i];
            #20;
        end 
    end

    
    integer file;
    integer cnt=0;
    initial begin
        file = $fopen("dataout1.txt" , "w");
    end

    always @(posedge clk) begin
        $fdisplay(file , m_axis_fir_tdata );
    end

    always @(posedge clk) begin
        $display("data out (%d)------> : %d ," , cnt, m_axis_fir_tdata );
        cnt = cnt + 1;
        if (cnt == 250) begin
            #20 $fclose(file);
            reset = 0;
            #20 $stop;
        end
    end
    

endmodule

这些是我收到的错误消息

INFO: [VRFC 10-2263] Analyzing Verilog file "C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sources_1/new/FIR.v" into library xil_defaultlib
INFO: [VRFC 10-311] analyzing module FIR
INFO: [VRFC 10-2263] Analyzing Verilog file "C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sources_1/new/black.v" into library xil_defaultlib
INFO: [VRFC 10-311] analyzing module black
INFO: [VRFC 10-2263] Analyzing Verilog file "C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sources_1/new/grey.v" into library xil_defaultlib
INFO: [VRFC 10-311] analyzing module grey
INFO: [VRFC 10-2263] Analyzing Verilog file "C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sources_1/new/ks_1.v" into library xil_defaultlib
INFO: [VRFC 10-311] analyzing module ks_1
INFO: [VRFC 10-2263] Analyzing Verilog file "C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sources_1/new/ks_2.v" into library xil_defaultlib
INFO: [VRFC 10-311] analyzing module ks_2
INFO: [VRFC 10-2263] Analyzing Verilog file "C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sources_1/new/ks_3.v" into library xil_defaultlib
INFO: [VRFC 10-311] analyzing module ks_3
INFO: [VRFC 10-2263] Analyzing Verilog file "C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sources_1/new/ks_4.v" into library xil_defaultlib
INFO: [VRFC 10-311] analyzing module ks_4
INFO: [VRFC 10-2263] Analyzing Verilog file "C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sources_1/new/ks_5.v" into library xil_defaultlib
INFO: [VRFC 10-311] analyzing module ks_5
INFO: [VRFC 10-2263] Analyzing Verilog file "C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sources_1/new/ks_6.v" into library xil_defaultlib
INFO: [VRFC 10-311] analyzing module ks_6
INFO: [VRFC 10-2263] Analyzing Verilog file "C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sources_1/new/ks_7.v" into library xil_defaultlib
INFO: [VRFC 10-311] analyzing module ks_7
INFO: [VRFC 10-2263] Analyzing Verilog file "C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sources_1/new/ksa_top.v" into library xil_defaultlib
INFO: [VRFC 10-311] analyzing module ksa_top
INFO: [VRFC 10-2263] Analyzing Verilog file "C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sources_1/new/pg.v" into library xil_defaultlib
INFO: [VRFC 10-311] analyzing module pg
INFO: [VRFC 10-2263] Analyzing Verilog file "C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sim_1/new/FIR_tb.v" into library xil_defaultlib
INFO: [VRFC 10-311] analyzing module tb_FIR
ERROR: [VRFC 10-2989] 's_axis_fir_tready' is not declared [C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sim_1/new/FIR_tb.v:62]
ERROR: [VRFC 10-2865] module 'tb_FIR' ignored due to previous errors [C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sim_1/new/FIR_tb.v:22]

报错信息比较清楚:

ERROR: [VRFC 10-2989] 's_axis_fir_tready' is not declared [C:/Users/adith/docs/project docs/FIR1/FIR1.srcs/sim_1/new/FIR_tb.v:62]

在 FIR 连接中,您连接了一个在您的测试台模块中不存在的信号:

   FIR FIR_i(
        .clk(clk),
        .reset(reset),
        .s_axis_fir_tdata(s_axis_fir_tdata),    
        .s_axis_fir_tvalid(s_axis_fir_tvalid), 
        .m_axis_fir_tready(m_axis_fir_tready),
        .m_axis_fir_tvalid(m_axis_fir_tvalid), 
        .s_axis_fir_tready(s_axis_fir_tready), // <-  s_axis_fir_tready is not declared in testbench
        .m_axis_fir_tdata(m_axis_fir_tdata));