我有一个用于顺序逻辑网络的简单Verilog代码。它由一个设计和一个testbench文件组成;它编译,但是运行时间太长了。我不知道为什么;除了clk之外,我没有在其中放任何循环。也许我在使用二进制数字时有一些语法错误。我使用在线EDA游乐场软件运行它;我没有在Xilinx上试用它。
模拟器:IcarusVerilog0.9.7,编译选项:-Wall。“执行中断或达到最大运行时。”
这就是日志上写的。
设计档案:
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发布于 2021-11-02 11:35:33
你需要告诉模拟器什么时候停止运行。一种方法是使用$finish系统任务,您可以将其添加到testbench中:
initial #1000 $finish;现在,模拟在操场上完成。您可以将#1000延迟更改为对设计更有意义的内容。
以下是为什么您的代码继续运行的解释。您的测试平台有两个并行线程:一个initial块和一个always块。在这两个线程中,将事件添加到Verilog事件队列中。initial块在上一次分配给x之后结束。
但是,always块继续向事件队列添加事件,因此模拟永远不会结束。
使用initial添加第二个$finish块将强制模拟结束,而不考虑无限always块。
https://stackoverflow.com/questions/69809617
复制相似问题