无法理解 D 触发器代码中的错误

Unable to understand error in D flip flop code

我的测试台代码有问题,我没有得到正确的波形。甚至时钟也不触发。

D 触发器代码:

module D_FF(o,D,clk);
    
    output reg o;
    input D,clk;
    
    always @ (posedge clk)
        begin
        if(D==1'b1)begin
            o=1'b1;
        end
        else begin
            o=1'b0;
        end
    end
    
endmodule

测试台代码:

module DD_flipflop_tb();
    
    reg clk,D;
    wire o;
    
    D_FF i1(o,D,clk);

    initial begin
        clk=1'b0;
        D=1'b0;
    end
    
    always begin
        #20 clk=~clk;
        #35  D=~D;
        #5000 $finish; 
    end
endmodule 

这是您的测试平台中 always 块中发生的情况。

在时间0,clk和D为0。

在时间 20,您将 clk 反转,变为 1。

在时间 55,你反转 D,它变成 1。

在时间 5055,您调用了终止模拟的 $finish。块中的语句只执行一次,这就是为什么你的输入永远不会改变超过一次的原因。

在您的测试台中,在 initial 块中将它们初始化为 0,然后将时钟生成与数据信号分开。

initial begin
    clk = 0;
    forever #20 clk=~clk;
end

initial begin
   D=0;
   forever #35 D=~D;
end

initial #5000 $finish; 

您可能希望在测试台中分别分配时钟和激励:

initial begin
  clk = 0;
  D = 0;
  #5000 $finish;
end

//..clock
always
  #20 clk = ~clk;

//..stimulus
always
  #35 D = ~D;