我试图用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
如何解决这个问题?
你有一个零时间的无限组合反馈回路。这将罐模拟器超时或出现哈格。
我假设锁存器是透明的,当...。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
并不是实际设计的正确方案。一个正确的解决方案要求所有信号在每个时间步长都处于可确定的状态,而不需 #
拖延。