EDAPlayground:Verilog 代码 "reached maximum runtime"
EDAPlayground: Verilog code "reached maximum runtime"
我有一个简单的时序逻辑网络 Verilog 代码。它由设计和测试台文件组成;它可以编译,但运行时间太长。我不确定为什么;除了 clk
,我没有在其中放置任何循环。也许我在使用二进制数时有一些语法错误。我 运行 它使用在线 EDA Playground 软件;我没在 Xilinx 上试过。
Simulator: Icarus Verilog 0.9.7, compile options: -Wall. "Execution
interrupted or reached maximum runtime."
日志是这样写的。
设计文件:
module hazimodul(
input clk,
input rst,
input ce,
input x,
output z
);
reg[1:0] all;
reg[3:0] y;
reg[0:0] zout;
always@(posedge clk)
begin
if(rst)
begin
zout <= 1'b0;
all <= 2'b00;
y <= 4'b0111;
end
else if(ce)
begin
if(all == 2'b00)
begin
if(x== 1'b0)
zout<=1'b0;
else
all <=2'b01;
end
if(all==2'b01)
begin
zout <= y[3:3];
y <= {y[2:0],y[3:3]};
if (y == 4'b0111)
all <= 2'b10;
end
if(all==2'b10)
begin
if(x == 1'b0)
all <= 2'b00;
end
end
end
assign z = zout;
endmodule
测试文件:
module test;
reg clk;
reg rst;
reg x;
reg ce;
// Outputs
wire z;
// Instantiate the Unit Under Test (UUT)
hazimodul uut (
.clk(clk),
.rst(rst),
.x(x),
.ce(ce),
.z(z)
);
initial begin
// Initialize Inputs
clk = 0;
rst = 0;
x=0;
ce=0;
#10;
rst<=1;
#20;
rst<=0;
#30
ce<=1;
#40
x<=1;
#80
x<=0;
#90
x<=1;
end
always #5
clk <=~clk;
endmodule
您需要告诉模拟器何时停止 运行ning。一种方法是使用 $finish
系统任务,您可以将其添加到测试台:
initial #1000 $finish;
现在,模拟在 edaplayground 结束。您可以将 #1000
延迟更改为对您的设计更有意义的内容。
这里解释了为什么您的代码会继续 运行。您的测试台有 2 个并行线程:一个 initial
块和一个 always
块。在这两个线程中,您都将事件添加到 Verilog 事件队列中。 initial
块在最后一次分配给 x
之后结束。
但是,always
块继续向事件队列添加事件,因此模拟永远不会结束。
添加第二个 initial
块与 $finish
强制模拟结束,不管无限 always
块。
我有一个简单的时序逻辑网络 Verilog 代码。它由设计和测试台文件组成;它可以编译,但运行时间太长。我不确定为什么;除了 clk
,我没有在其中放置任何循环。也许我在使用二进制数时有一些语法错误。我 运行 它使用在线 EDA Playground 软件;我没在 Xilinx 上试过。
Simulator: Icarus Verilog 0.9.7, compile options: -Wall. "Execution interrupted or reached maximum runtime."
日志是这样写的。
设计文件:
module hazimodul(
input clk,
input rst,
input ce,
input x,
output z
);
reg[1:0] all;
reg[3:0] y;
reg[0:0] zout;
always@(posedge clk)
begin
if(rst)
begin
zout <= 1'b0;
all <= 2'b00;
y <= 4'b0111;
end
else if(ce)
begin
if(all == 2'b00)
begin
if(x== 1'b0)
zout<=1'b0;
else
all <=2'b01;
end
if(all==2'b01)
begin
zout <= y[3:3];
y <= {y[2:0],y[3:3]};
if (y == 4'b0111)
all <= 2'b10;
end
if(all==2'b10)
begin
if(x == 1'b0)
all <= 2'b00;
end
end
end
assign z = zout;
endmodule
测试文件:
module test;
reg clk;
reg rst;
reg x;
reg ce;
// Outputs
wire z;
// Instantiate the Unit Under Test (UUT)
hazimodul uut (
.clk(clk),
.rst(rst),
.x(x),
.ce(ce),
.z(z)
);
initial begin
// Initialize Inputs
clk = 0;
rst = 0;
x=0;
ce=0;
#10;
rst<=1;
#20;
rst<=0;
#30
ce<=1;
#40
x<=1;
#80
x<=0;
#90
x<=1;
end
always #5
clk <=~clk;
endmodule
您需要告诉模拟器何时停止 运行ning。一种方法是使用 $finish
系统任务,您可以将其添加到测试台:
initial #1000 $finish;
现在,模拟在 edaplayground 结束。您可以将 #1000
延迟更改为对您的设计更有意义的内容。
这里解释了为什么您的代码会继续 运行。您的测试台有 2 个并行线程:一个 initial
块和一个 always
块。在这两个线程中,您都将事件添加到 Verilog 事件队列中。 initial
块在最后一次分配给 x
之后结束。
但是,always
块继续向事件队列添加事件,因此模拟永远不会结束。
添加第二个 initial
块与 $finish
强制模拟结束,不管无限 always
块。