纹波计数器的未定义结果

时间:2013-02-20 18:20:29

标签: counter verilog hdl

我正在使用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

我做错了什么,我该如何解决?

1 个答案:

答案 0 :(得分:2)

你所拥有的不是波纹计数器,你似乎并不真正理解你的测试平台和你的DUT之间的界限(被测设计,或者你的情况下,'波纹计数器& #39;)

你所拥有的是一个模拟四个独立触发器的测试平台。如果你正在模拟一个波纹计数器,你应该有一个类似于' RCounter'这样的模块,它在一个名为' RCounter_TB'的其他东西中实例化。测试平台应仅驱动输入(用于计数器,时钟和复位),它不应驱动单个触发器的d引脚,因为这些触发器之间的连接是您要测试的。

在纹波计数器模块内,您可以定义触发器之间的有线连接。此模块中不应存在任何#时间延迟,因为模块没有固定时间延迟的概念。如果你想从~q2驱动d2引脚,那么你就这样分配它:

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)块,暗示你想要一些状态保留。我将留给你查看如何使用always块来模拟触发器。