-1

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

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

4

1 回答 1

2

您所拥有的不是纹波计数器,而且您似乎并不真正了解测试台和 DUT 之间的边界(被测设计,或者在您的情况下是“纹波计数器”)。

您所拥有的是一个模拟四个独立触发器的测试平台。如果您正在模拟波纹计数器,您应该有一个名为“RCounter”之类的模块,该模块在其他名为“RCounter_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)块来暗示您想要一些状态保留。我将留给您查找如何使用 always 块来建模触发器。

于 2013-02-20T18:43:52.600 回答