更改为自动时钟会导致输出变为空白

Changing to automatic clock causes output to go blank

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

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)。另外,当我手动滴答时钟时,它工作正常。

主要问题是 forever 循环阻止了 $display$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

其他说明:

你不应该在 initial 块中使用 assign

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