如何防止ModelSIM在仿真过程中停止?
How to prevent ModelSIM from stopping during simulation?
我正在尝试模拟一个递减计数器,我在 SystemVerilog 中使用 D-Latches 进行了描述,但是当我开始模拟时,ModelSIM 停止工作,我无法执行任何操作。
这是递减计数器的描述
`timescale 1ns/1ns
module Down_Counter_Part5 (input RST,CLK,EnableIN, output[7:0] Qout, output EnableOUT);
genvar i;
wire[8:0] En;
wire[7:0] D,Qbar;
assign En[0] = EnableIN;
assign EnableOUT = En[8];
generate
for (i=0; i<8; i=i+1) begin
assign D[i] = (Qout[i] ^ En[i]) & (~RST);
assign En[i+1] = Qbar[i] & En[i];
Clocked_D_Latch Ii (D[i],CLK,Qout[i],Qbar[i]);
end
endgenerate
endmodule
这是我的测试平台
`timescale 1ns/1ns
module Testbench_Part6 ();
logic rst = 1,clk = 1,enablein = 1;
wire[7:0] qout;
wire enableout;
Down_Counter_Part5 UUT (rst,clk,enablein,qout,enableout);
initial repeat (5) #5000 rst = ~rst;
endmodule
我该如何解决这个问题?
你有一个零时间无限组合反馈回路。这将使模拟器超时或出现 hag。
我假设当 CLK
为高电平时锁存器是透明的;你没有显示那段代码。因此,当 CLK 为高电平时,Qout
将等于 D
。但是当 En
为高电平时,D
将等于 Qout
的倒数。由于没有时间阻塞,Qout
将被重新评估,导致对 D
的另一次更新,导致对 Qout
的另一次更新,并永远持续下去。
如果您只打算对此进行模拟,请在分配中添加一点延迟,以便您可以在 wavefrom/logfile 中看到反馈循环。我还建议将 RST
设为 0,以便可以清除 X 和 Z 值。
assign #1 D[i] = (Qout[i] ^ En[i]) & (~RST);
添加 #1
不是真正设计的正确解决方案。正确的解决方案要求所有信号在每个时间步都处于可确定状态,没有 #
延迟。
我正在尝试模拟一个递减计数器,我在 SystemVerilog 中使用 D-Latches 进行了描述,但是当我开始模拟时,ModelSIM 停止工作,我无法执行任何操作。
这是递减计数器的描述
`timescale 1ns/1ns
module Down_Counter_Part5 (input RST,CLK,EnableIN, output[7:0] Qout, output EnableOUT);
genvar i;
wire[8:0] En;
wire[7:0] D,Qbar;
assign En[0] = EnableIN;
assign EnableOUT = En[8];
generate
for (i=0; i<8; i=i+1) begin
assign D[i] = (Qout[i] ^ En[i]) & (~RST);
assign En[i+1] = Qbar[i] & En[i];
Clocked_D_Latch Ii (D[i],CLK,Qout[i],Qbar[i]);
end
endgenerate
endmodule
这是我的测试平台
`timescale 1ns/1ns
module Testbench_Part6 ();
logic rst = 1,clk = 1,enablein = 1;
wire[7:0] qout;
wire enableout;
Down_Counter_Part5 UUT (rst,clk,enablein,qout,enableout);
initial repeat (5) #5000 rst = ~rst;
endmodule
我该如何解决这个问题?
你有一个零时间无限组合反馈回路。这将使模拟器超时或出现 hag。
我假设当 CLK
为高电平时锁存器是透明的;你没有显示那段代码。因此,当 CLK 为高电平时,Qout
将等于 D
。但是当 En
为高电平时,D
将等于 Qout
的倒数。由于没有时间阻塞,Qout
将被重新评估,导致对 D
的另一次更新,导致对 Qout
的另一次更新,并永远持续下去。
如果您只打算对此进行模拟,请在分配中添加一点延迟,以便您可以在 wavefrom/logfile 中看到反馈循环。我还建议将 RST
设为 0,以便可以清除 X 和 Z 值。
assign #1 D[i] = (Qout[i] ^ En[i]) & (~RST);
添加 #1
不是真正设计的正确解决方案。正确的解决方案要求所有信号在每个时间步都处于可确定状态,没有 #
延迟。