我正在用d触发器为Ripple计数器编写一个测试台。我的程序正在编译,没有错误,但是,我得到了undefined
的结果。我该如何解决这个问题?
这是代码:
module RCounter;
reg d,d2,d3,d4,clk;
wire q,q2,q3,q4;
DFlipFlop a(d,q,clk);
DFlipFlop a1(d2,q2,q);
DFlipFlop a2(d3,q3,q2);
DFlipFlop a3(d4,q4,q3);
initial
begin
clk =1;
d=0;d2=0;d3=0;d4=0;
#2 d=1;d2=~q2; d3=~q3; d4=~q4;
#2 d=0;d2=~q2; d3=~q3; d4=~q4;
#2 d=1;d2=~q2; d3=~q3; d4=~q4;
#2 d=0;d2=~q2; d3=~q3; d4=~q4;
#2 d=1;d2=~q2; d3=~q3; d4=~q4;
#2 d=0;d2=~q2; d3=~q3; d4=~q4;
#2 d=1;d2=~q2; d3=~q3; d4=~q4;
end
always
begin
#2 assign clk = ~ clk;
end
endmodule
我做错了什么?我该如何解决?
您所拥有的不是纹波计数器,而且您似乎并不真正了解测试台和DUT之间的边界(在测试中的设计,或者在您的情况下,是"纹波计数器")。
你所拥有的是一个模拟四个独立触发器的测试台。如果你在模拟一个波纹计数器,你应该有一个名为"RCounter"的模块,它被实例化在另一个称为"RCcounter_TB"的东西中。测试台应该只驱动输入(用于计数器、时钟和复位),而不应该驱动单个触发器的d引脚,因为这些触发器之间的连接是您想要测试的。
在纹波计数器模块中,您可以定义触发器之间的有线连接。该模块内不应存在任何#
时间延迟,因为模块没有固定时间延迟的概念。如果你想让d2引脚从~q2驱动,那么你只需要这样分配:
assign d2 = ~q2
因为在硬件中,这只是从~q2的输出循环回d2的一条线。它总是存在的,它没有时间的概念。
至于你为什么在输出中得到X,我猜这来自于你在上一个问题中发布的触发器设计。
module DFlipFlop(d,q,clk);
input d,clk;
output q;
assign q = clk?( (d==1)? 1:0) : q;
endmodule
这不是一个触发器,因为这里没有状态保持,它只是一个带有无限反馈循环的赋值语句(本质上只有一个线驱动它自己)。
如果你想对触发器进行建模,你需要使用always @(posedge clk)
块,这意味着你想要一些状态保持。我把它留给你去研究如何使用一个总是块来模拟一个触发器。