Verilog vivado模拟错误:达到迭代限制10000
当我试图在vivado中运行模拟时,我得到: 错误:已达到迭代限制10000。可能的零延迟 在模拟时间无法提前的情况下检测到振荡。请 检查您的源代码。请注意,可以更改迭代限制 使用switch-maxdeltaid。时间:10ns迭代次数: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, //
`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;
请不要故意破坏您的问题,这将使未来的访问者更难看到他们是否有相同的问题,以及答案是否对他们也有帮助。随附的代码有许多问题。这可能是,但删除代码会删除提供的答案所需的上下文。