在第一条 $display() 语句执行后,是什么原因导致程序块停止执行?
以下代码在第一次执行 $display() 并打印出0 之后会挂起。错误信息如下:
### *Execution interrupted or reached maximum runtime.
Exit code expected: 0, received: 137*
有人能找出问题出在哪里吗?
下面是代码:
interface simple_if;
logic clk, rst;
logic [7:0] data;
logic valid, ready;
// define modport for DUT
modport dut_mp(
input clk, rst, valid, data,
output ready);
// define modport for driver
modport driver_mp (
output data, valid,
input clk, rst, ready);
endinterface
module dut (simple_if.dut_mp intf);
always_ff @(
posedge intf.clk or posedge intf.rst)
if (intf.rst)
intf.ready <= 0;
else
intf.ready <= intf.valid;
endmodule
program driver(simple_if.driver_mp intf);
initial begin
intf.data = 8'hA5;
intf.valid = 1; #2;
$display("%0d", intf.ready); #8;
intf.valid = 0; #2;
$display("%0d", intf.ready);
end
endprogram
module top;
// instantiate interface
simple_if intf();
initial begin
intf.clk = 0; #5;
forever intf.clk = ~intf.clk; #5;
end
initial begin
intf.rst = 0; #1; intf.rst = 1;
end
// connect interface to DUT
dut dut_inst(.intf(intf));
// Launch the program bloc as testbench
driver driver_inst(.intf(intf));
initial begin
$dumpfile("dump.vcd"); // to get waveform
$dumpvars;
end
initial #50 $finish;
endmodule
解决方案
导致挂起的原因是在这段代码中存在一个无限循环:
initial begin
intf.clk = 0; #5;
forever intf.clk = ~intf.clk; #5;
end
首先,这种编码风格真的很让人困惑。你应该把每条语句放在单独的一行。代码应该像这样:
initial begin
intf.clk = 0;
#5;
forever intf.clk = ~intf.clk;
#5;
end
现在就更容易看出 forever 那一行是一个无限循环,因为没有延迟。
这是修复无限循环的一种常见方法:
initial begin
intf.clk = 0;
#5;
forever #5 intf.clk = ~intf.clk;
end
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。