如何防止ModelSIM在仿真过程中停止工作?

问题描述 投票:1回答: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

如何解决这个问题?

verilog system-verilog modelsim
1个回答
0
投票

你有一个零时间的无限组合反馈回路。这将罐模拟器超时或出现哈格。

我假设锁存器是透明的,当...。CLK 是高的,你没有显示那段代码。所以 Qout 将等于 D 当CLK为高电平时。但当 En 高,那么 D 的倒数,等于 Qout. 由于没有时间阻隔。Qout 将被重新评估,导致另一次更新。D导致另一次更新 Qout,并一直持续下去。

如果你只打算模拟这个,那么在赋值中加一点延迟,这样你就可以在wavefromlogfile中看到反馈循环。我还建议从 RST 为0,这样X和Z的值就可以被冲掉。

assign #1 D[i] = (Qout[i] ^ En[i]) & (~RST);

添加 #1 并不是实际设计的正确方案。一个正确的解决方案要求所有信号在每个时间步长都处于可确定的状态,而不需 # 拖延。

© www.soinside.com 2019 - 2024. All rights reserved.