Verilog 测试台中的信号未从初始状态向前发展

Signals not going forward from initial state in Verilog test bench

我正在使用一个由两个相互连接的 d_flipflops (DFF) 组成的系统(第一个 DFF 的输出 q 连接到第二个触发器的输入 d。我创建了子模块DFF 并将它们嵌入到顶层模块中。然后我创建了一个测试台。但是问题是无论我提供的时间延迟如何,模拟都不会超出初始状态。它说模拟在 t=0 时完成。虽然编译没有错误,但我不明白我的代码有什么问题。我还尝试提供绝对时间值作为测试平台的延迟(例如#50ns 而不是#50)但没有用。我尝试在 iverilog 中模拟它和还尝试了 EDAplayground 的不同编译器。如果有人可以提供对我的问题的见解,那将对我有很大帮助。 谢谢!

module d_ff(d, clk, reset, q, q_not);

input d, clk, reset;

output q, q_not;

reg q, q_not;



always @ (reset or posedge clk)
begin
 if (reset == 0)
 begin
  q<=d;
  
  q_not <= ~d;
 end
 else 
 begin 
  q<=1'b0;
  
  q_not <= 1'b1; 
 end

end


endmodule




module main(d, clk, reset, q2, q2_not, q1_not);

input d, clk, reset;

output q2, q2_not, q1_not;


wire d2;

d_ff dup(.d(d), .clk(clk), .reset(reset), .q(d2), .q_not(q1_not));
d_ff dup2(.d(d2), .clk(clk), .reset(reset), .q(q2), .q_not(q2_not));



initial
begin
$display("end of main module");
$finish;
end

endmodule

这是测试台:

// Code your testbench here
// or browse Examples
`timescale 1 ns / 100 ps /// 100ps


module main_tb;


reg d, clk, reset;

wire q2, q2_not, q1_not;


main UUT(.d(d), .clk(clk), .reset(reset), .q2(q2), .q2_not(q2_not), .q1_not(q1_not));


initial
begin

clk = 0;
d=1'b0;
reset=1'b1;
#500ns reset=1'b0;

end

always begin
#50ns clk = !clk;

end


initial
begin
  $dumpfile("dump.vcd");
$dumpvars;
end


initial
begin
$monitor("clk = %b, d=%b, reset=%b, q=%b, q_not=%b, d2_not=%b", clk,d,reset, q2,q2_not, q1_not);


#500 reset =1'b1;
#500 d=1'b1;
#500 reset =1'b0;
#500 d=1'b0;
#500 reset = 1'b0;
#500 d=1'b0;
#500 reset = 1'b0;
#500 d=1'b0;
#500 d=1'b1;
#100 reset =1'b1;
#500 d = 1'b1;
 
#50000ns $finish;
end

endmodule

这个:

initial
begin
   $display("end of main module");
   $finish;
end

正在终止您的模拟,因为所有初始语句都是 运行 并行 。删除它并在主要首字母的末尾放置一个 $finish 或 $stop。
也最好将所有 clk 分配移动到 clk 块中,与 reset 和 b:

相同
initial
begin
   clk = 1'b0;
   forever 
      #50ns clk = !clk;
end


initial
begin
   $monitor("clk = %b, d=%b, reset=%b, q=%b, q_not=%b, d2_not=%b", clk,d,reset, q2,q2_not, q1_not);
   d=1'b0;
   reset=1'b1;
   #500ns reset=1'b0;
   #500 reset =1'b1;
   #500 d=1'b1;
   #500 reset =1'b0;
   #500 d=1'b0;
   ...
   $finish; // $stop;
end