如何防止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 不是真正设计的正确解决方案。正确的解决方案要求所有信号在每个时间步都处于可确定状态,没有 # 延迟。