这应该是最简单的解决问题,但由于某种原因我无法弄明白。我目前正在自学Verilog,并且正在为这些模块开发非常基本的模块和测试平台。其中一个模块是D触发器(DFF)。这是DFF模块(无复位):
module DFF( clk, D, Q );
parameter n = 1; // DFF width
input clk;
input [n-1:0] D;
output [n-1:0] Q;
reg [n-1:0] Q;
always @( posedge clk ) begin
Q <= D;
end
endmodule
以下是测试平台:
module DFF_tb;
reg clk, D;
reg Q;
DFF #(1) DUT ( clk, D, Q );
initial begin
clk = 1'b0;
forever #10 clk = ~clk; // Generate clock
end
initial begin
D = 0; // Check D = 0
if ( Q !== 0 ) $display( "[FAIL] Q = 0" );
#40 D = 1; // Check D = 1
#40
if ( Q !== 1 ) $display( "[FAIL] Q = 1" );
$finish; // Complete test
end
endmodule
这是模拟:
测试台reg Q在模拟期间保持x(认为Q [0]没有......)。
知道为什么吗?谢谢!
答案 0 :(得分:2)
你没有重置翻牌,因此在第一个时钟边缘之前,Q没有任何已知值。
通常,翻牌具有异步重置,应在测试台的模拟开始时置位。 FF中的始终阻止应为:
always @( posedge clk or posedge reset ) begin
if (reset)
Q <= '0;
else
Q <= D;
end
另外,您不需要将Q定义为reg。它可以是电线。 edaplayground.com
上的工作代码