首页 > 解决方案 > 更改为自动时钟会导致输出变为空白

问题描述

尝试在测试台中自动化延迟触发器的时钟,因为我不想总是像这样手动执行它:

clock = 0
#5 clock = 1
#10 clock = 0

但是突然之间,我的代码(如下)不起作用。

module d_flip_flop
(
    input [bit:0] a,
    input clock,
    output reg [bit:0] out
);
    parameter bit = 4 - 1;
    always @(posedge clock)
        begin
            out = a;
        end
endmodule

试验台

module d_flip_flop_tb;
    reg [bit:0] a;
    reg clock;
    wire [bit:0] out;
    
    parameter bit = 4 - 1;

    d_flip_flop FLIP1
    (
        a,
        clock,
        out
    );

    initial
        begin
            clock = 0;
            forever
                begin
                    #5 clock = ~clock;
                end
            #1 assign a = 4'b0000;
            $display("INPUT  | %b", a);
            $monitor("OUTPUT | %b", out);
            #15 assign a = 4'b1111;
        end
endmodule

输出似乎是空白的,所以我不知道在没有输出任何错误的情况下要更改什么(使用 Icarus v10)。此外,当我手动滴答时钟时,它工作正常。

标签: verilog

解决方案


主要问题是forever循环阻止$displayand$monitor代码执行。您应该将时钟分离到自己的initial块中。我还添加了一条$finish语句来干净地终止模拟。

我不得不将你的parameter声明移到它们的使用之上,因为我在不同的模拟器上用你的代码编译错误。

module d_flip_flop
#(    parameter bit = 4 - 1)
(
    input [bit:0] a,
    input clock,
    output reg [bit:0] out
);
    always @(posedge clock)
        begin
            out = a;
        end
endmodule

module d_flip_flop_tb;
    parameter bit = 4 - 1;
    reg [bit:0] a;
    reg clock;
    wire [bit:0] out;
    

    d_flip_flop FLIP1
    (
        a,
        clock,
        out
    );

    initial begin
            clock = 0;
            forever
                begin
                    #5 clock = ~clock;
                end
    end

    initial begin
            #1 a = 4'b0000;
            $display("INPUT  | %b", a);
            $monitor("OUTPUT | %b", out);
            #15 a = 4'b1111;
            #100 $finish;
    end
endmodule

现在我看到输出变化:

INPUT  | 0000
OUTPUT | xxxx
OUTPUT | 0000
OUTPUT | 1111

其他注意事项:

您不应该在块assign内使用。initial

bit是 SystemVerilog 的保留关键字。一旦iverilog支持该语法,您可能会遇到编译错误。您可以更改bit为像WIDTH.


推荐阅读