Verilog代码2错误我可以';t find:如果能多给我一双眼睛来发现我可能犯的错误,我将不胜感激;我忽略了

Verilog代码2错误我可以';t find:如果能多给我一双眼睛来发现我可能犯的错误,我将不胜感激;我忽略了,verilog,modelsim,intel-fpga,Verilog,Modelsim,Intel Fpga,我正在写一个verilog代码,读取两个文件并将这些数字保存到寄存器中。然后我将它们相乘并相加。几乎是一个乘法累加器。然而,对于我所拥有的代码,我经历了一段艰难而沮丧的时光。它能正确读取文件中的数字,并且会成倍增加,但问题出在这里?当我第一次使用ModelSim运行它时,我重置了所有内容,以便清除累加器。然后我开始了这个项目,但是我的“macc_out”总是有这么大的延迟,我似乎不知道为什么。这个延迟不应该存在,而是应该从A*B+MAC中得到结果。即使在延迟之后,它也无法获得正确的输出。我的第二

我正在写一个verilog代码,读取两个文件并将这些数字保存到寄存器中。然后我将它们相乘并相加。几乎是一个乘法累加器。然而,对于我所拥有的代码,我经历了一段艰难而沮丧的时光。它能正确读取文件中的数字,并且会成倍增加,但问题出在这里?当我第一次使用ModelSim运行它时,我重置了所有内容,以便清除累加器。然后我开始了这个项目,但是我的“macc_out”总是有这么大的延迟,我似乎不知道为什么。这个延迟不应该存在,而是应该从A*B+MAC中得到结果。即使在延迟之后,它也无法获得正确的输出。我的第二个问题是,如果我从“重置高”转到“重置低”(启动程序),然后再回到“重置高”(重置所有值),它们不会重置!这是令人沮丧的,因为我已经为此工作了一周,不知道/看不到bug。我要求额外的一双眼睛,看看你是否能发现我的错误。附件是我的代码和实例,也是我的ModelSim函数波形。感谢您的帮助

    module FSM(clk,start,reset,done,clock_count);
    input clk, start, reset;
    output reg done;
    output reg[10:0] clock_count;
    reg [0:0] macc_clear;
    reg[5:0] Aread, Bread, Cin;
    wire signed [7:0] a, b;
    wire signed [18:0] macc_out;
    reg [3:0] i,j,m;
    reg add;
    reg [0:0] go;
    reg[17:0] c;
    parameter n = 8;
    reg[1:0] state;


    reg [1:0] S0 = 2'b00;
    reg [1:0] S1 = 2'b01;
    reg [1:0] S2 = 2'b10;
    reg [1:0] S3 = 2'b11;



    ram_A Aout(.clk(clk), .addr(Aread), .q(a));
    ram_B Bout(.clk(clk), .addr(Bread), .q(b));
    mac macout(.clk(clk), .macc_clear(macc_clear), .A(a), .B(b), .macc_out(macc_out), .add(add));
    ram_C C_in(.clk(clk), .addr(Cin), .q(c));




    always @(posedge clk) begin

            if (reset == 1) begin
                i <= 0;
                add<=0;
                j <= 0;
                m <= 0;
                clock_count <= 0;
                go <= 0;
                macc_clear<=1;
            end
            else
                state<=S0;


                case(state) 


                S0: begin
    //              if (reset) begin
    //                  i <= 0;
    //                  add<=0;
    //                  j <= 0;
    //                  m <= 0;
    //                  clock_count <= 0;
    //                  go <= 0;
    //                  macc_clear<=1;
    //                  state <= S0;
    //              end         
                        macc_clear<=1;
                        done<=0;
                        state <= S1;
                        end

                S1: begin
                    add<=1;
                    macc_clear<=0;
                    clock_count<=clock_count+1;
                    m<=m+1;
                    Aread <= 8*m + i;
                    Bread <= 8*j + m;
                    if (m==7) begin
                        state <= S2;
                        macc_clear<=1;
                        add<=0;
                    end

                    else
                        state <=S1;

                    end



                S2: begin
                    add<=1;
                    macc_clear<=0;
                    m<=0;
                    i<=i+1;
                    if (i<7)
                        state<=S1;
                    else if (i==8) begin
                        state<=S3;
                        add<=0;
                end
                end



                S3: begin
                    add<=1;
                    i<=0;
                    j<=j+1;
                    if(j<7)
                        state<=S1;
                    else begin
                        state<=S0;
                        done<=1;
                        add<=0;
                end
                end


    endcase

    end


    always @ (posedge macc_clear) begin
        Cin <= 8*j + i;
        c <= macc_out;
    end

    endmodule



    module mac(clk, macc_clear, A, B, macc_out, add);

  input clk, macc_clear;
  input signed [7:0] A, B;
  input add;
  output reg signed [18:0] macc_out;
  reg signed [18:0] MAC;

  always @( posedge clk) begin

  if (macc_clear) begin
    macc_out <= MAC;
    MAC<=0;
  end

else if (add) begin
    MAC<=(A*B)+ MAC;
    macc_out<=MAC;
    end

end
endmodule



module ram_A( clk, addr,q);
    output reg[7:0] q;
    input [5:0] addr;
    input clk;
    reg [7:0] mem [0:63];
  initial begin
  $readmemb("ram_a_init.txt", mem);
        end

     always @(posedge clk) begin
            q <= mem[addr];
    end
endmodule



module ram_C(clk,addr, q);
    input [18:0] q;
    input [5:0] addr;
    input clk;
    reg [18:0] mem [0:63];



    always @(posedge clk) begin
                mem[addr] <= q;
    end
endmodule
模块FSM(时钟、启动、复位、完成、时钟计数);
输入时钟、启动、复位;
输出完成;
输出寄存器[10:0]时钟计数;
reg[0:0]macc_清除;
reg[5:0]区域、面包、Cin;
电文签名[7:0]a,b;
电文签署[18:0]macc_out;
reg[3:0]i,j,m;
注册添加;
reg[0:0]开始;
reg[17:0]c;
参数n=8;
reg[1:0]状态;
reg[1:0]S0=2'b00;
reg[1:0]S1=2'b01;
reg[1:0]S2=2'b10;
reg[1:0]S3=2'b11;
ram_A Aout(.clk(clk),.addr(Aread),.q(A));
ram_B Bout(.clk(clk),.addr(Bread),.q(B));
mac-macout(.clk(clk),.macc_-clear(macc_-clear),.A(A),.B(B),.macc_-out(macc_-out),.add(add));
ram_C_in(.clk(clk),.addr(Cin),.q(C));
始终@(posedge clk)开始
如果(重置==1)开始
我1)看一看你的MACC模块的示意图-我认为你的一些“问题”将从中显而易见
2)考虑使用<代码>始终@(*)< /代码>(组合)块,用于FSM控制信号(如“代码>添加< /代码>或<代码> MACCURLISH < /代码>”,而不是<代码>始终@(PaseECLK)(顺序)-它使逻辑更容易断言。现在他们已经注册了,所以你有一个周期延迟
3) 在MAC电脑中,重置时清除MAC寄存器,但不清除
macc\u out
寄存器

简而言之,我认为你需要退后一步,考虑哪些信号是组合逻辑,哪些是顺序的,需要在寄存器中。< /P>