Verilog vivado模拟错误:达到迭代限制10000

Verilog vivado模拟错误:达到迭代限制10000,verilog,simulation,Verilog,Simulation,当我试图在vivado中运行模拟时,我得到: 错误:已达到迭代限制10000。可能的零延迟 在模拟时间无法提前的情况下检测到振荡。请 检查您的源代码。请注意,可以更改迭代限制 使用switch-maxdeltaid。时间:10ns迭代次数:10000 我在测试的模块中没有任何初始语句 有人能指出问题出在哪里吗 `timescale 1ns / 1ps module mulp( input clk, input rst, input start, input [4:0] mplier, //

当我试图在vivado中运行模拟时,我得到:

错误:已达到迭代限制10000。可能的零延迟 在模拟时间无法提前的情况下检测到振荡。请 检查您的源代码。请注意,可以更改迭代限制 使用switch-maxdeltaid。时间:10ns迭代次数:10000

我在测试的模块中没有任何初始语句

有人能指出问题出在哪里吗

`timescale 1ns / 1ps

module mulp(
input clk,
input rst,
input start,
input [4:0] mplier,  // -13
input [4:0] mplcant, // -9
output reg done,
output [9:0] product
);

parameter N = 6;
parameter Idle = 2'b00;
parameter Load = 2'b01;
parameter Oper = 2'b10;
parameter Finish = 2'b11;

reg done_r;
reg [N-1:0] A, A_r, B, B_r;
reg [1:0] state, state_r;
reg [2:0] count, count_r; 

wire [N-2:0] C, C_comp;
reg [N-2:0] C_r;
   
assign C = mplcant; assign C_comp = {~C + 1};
assign product = {A_r[N-2:0], B_r[N-2:0]};

always @(posedge clk) begin
    if (rst) begin
        state_r <= Idle;
        count_r <= 0;
        done_r <= 0;
        A_r <= 0;
        B_r <= 0;
    end else begin
        state_r <= state;
        count_r <= count;
        done_r <= done;
        A_r <= A;
        B_r <= B;
    end // if
end // always

always @(*) begin
    state = state_r;
    count = count_r - 1; // count: 6
    done = done_r;
    A = A_r;
    B = B_r;
    
    case (state) 
        Idle: begin
            if (start) begin
                state <= Load;
            end // if
        end
        Load: begin
            A = 0; B = {mplier, 1'b0}; count = N; // start at 6
            state = Oper;
        end
        Oper: begin
            if (count == 0)
                state = Finish;
            else begin
                case (B[1:0])
                    2'b01: begin
                        // add C to A
                        A = A_r + {C[N-2], C[N-2:0]};
                        // shift A and B
                        A = {A_r[N-1], A_r[N-1:1]};
                        B = {A_r[0], B_r[N-1:1]};
                    end
                    2'b10: begin
                        A = A_r + {C_comp[N-2], C_comp[N-2:0]};
                        A = {A_r[N-1], A[N-1:1]};
                        B = {A_r[0], B_r[N-1:1]};
                    end
                    (2'b00 | 2'b11): begin
                        A = {A_r[N-1], A[N-1:1]};
                        B = {A_r[0], B_r[N-1:1]}; 
                    end
                    default: begin
                        state = Idle; done = 1'bx; // error
                    end
                endcase  
            end // else
        end // Oper
        Finish: begin
            done = 1; 
            state = Idle;
        end // Finish
        default: begin
            done = 1'bx;
            state = Idle;
        end 
    endcase
end // always

endmodule
`时间刻度为1ns/1ps
模块mulp(
输入时钟,
输入rst,
输入启动,
输入[4:0]放大器,//-13
输入[4:0]mplcont,//-9
输出注册完成,
输出[9:0]产品
);
参数N=6;
参数Idle=2'b00;
参数载荷=2'b01;
参数Oper=2'b10;
参数Finish=2'b11;
注册完成;
注册[N-1:0]A,A_r,B,B_r;
注册[1:0]状态,状态\u r;
reg[2:0]计数,计数\u r;
导线[N-2:0]C,C_comp;
注册号[N-2:0]C\r;
分配C=mplcont;分配C_comp={~C+1};
赋值乘积={A_r[N-2:0],B_r[N-2:0]};
始终@(posedge clk)开始
如果(rst)开始

说明你有一个组合循环。您正在组合
始终
块中采样并驱动
状态
信号。通常,在FSM中对注册的状态变量(
state\r
)进行采样。更改:

case (state) 
            state <= Load;
致:


不相关,但您应该在组合块中使用所有阻塞赋值(而不是混合)。更改:

case (state) 
            state <= Load;

请不要故意破坏您的问题,这将使未来的访问者更难看到他们是否有相同的问题,以及答案是否对他们也有帮助。随附的代码有许多问题。这可能是,但删除代码会删除提供的答案所需的上下文。