解释为什么当 #10 开始 A = 1'b0 时,fork-join 的行为会有所不同;B = 1'b1;结束,到 #10;开始 A = 1'b0;B = 1'b1;结束 [复制]

Explain why fork-join behaves differently when #10 begin A = 1'b0; B = 1'b1;end, and to #10; begin A = 1'b0; B = 1'b1; end [duplicate]

提问人:Leharika Naidu 提问时间:11/17/2023 最后编辑:toolicLeharika Naidu 更新时间:11/17/2023 访问量:39

问:

请注意第二种情况延迟后的分号。#10

我以为我明白了,但在这些输出之后,我认为我没有。有人可以解释为什么分号会导致差异吗?当延迟后有分号时,代码如何流入?fork-joinfork-join

在第一种情况下,代码为:

module waveform_fork_join();

    reg A,B,C,D,E,F,en;
    
    initial
        fork
            en = 1'b0; A = 1'b1; B = 1'b0; C = 1'b0; D = 1'b0; E = 1'b1; F = 1'b1;
            #10 begin
            A = 1'b0; B = 1'b1; C = 1'b1; 
            end
            #20 begin
            A = 1'b1; B = 1'b0; D = 1'b1; E = 1'b0; 
            end
            #30 begin
            B = 1'b1; E = 1'b1; F = 1'b0; 
            end
            #40 begin
            en = 1'b1; B = 1'b0; D = 1'b0; F = 1'b1;
            end
            #50 begin
            B = 1'b1; 
            end
            #60 begin
            B = 1'b0; D = 1'b1; 
            end
            #70 B = 1;
            #80 $finish;
        join

endmodule

输出:延迟后不带分号的代码输出。

在第二种情况下,代码为:

module waveform_fork_join1();

    reg A,B,C,D,E,F,en;
    
    initial
        fork
            en = 1'b0; A = 1'b1; B = 1'b0; C = 1'b0; D = 1'b0; E = 1'b1; F = 1'b1;
            #10;    begin
            A = 1'b0; B = 1'b1; C = 1'b1; 
            end
            #20; begin
            A = 1'b1; B = 1'b0; D = 1'b1; E = 1'b0; 
            end
            #30; begin
            B = 1'b1; E = 1'b1; F = 1'b0; 
            end
            #40; begin
            en = 1'b1; B = 1'b0; D = 1'b0; F = 1'b1;
            end
            #50; begin
            B = 1'b1; 
            end
            #60; begin
            B = 1'b0; D = 1'b1; 
            end
            #70;    B = 1;
            #80 $finish;
        join

endmodule

输出:延迟后带分号的代码输出

verilog 延迟 系统-verilog fork-join

评论

0赞 dave_59 11/17/2023
一式两份查看我的答案

答:

0赞 toolic 11/17/2023 #1

在 中,在时间 10 时,模块执行,切换信号。waveform_fork_joinbegin/end

在 中,在时间 10 时,没有任何反应,因为分号创建了一个 null 语句。在同一行开始的块是一个完全独立的语句,在时间 0 执行。waveform_fork_join1begin/end#10;

您编写代码的方式非常令人困惑。首先,对于这样一个简单的例子来证明行为的差异,不需要那么多变量。请考虑以下编写代码的替代方法:

module waveform_fork_join();
    reg A,B;
    
    initial
        fork
            A = 1'b1;
            B = 1'b0;
            #10 begin
                A = 1'b0;
                B = 1'b1;
            end
            #20 begin
                A = 1'b1;
                B = 1'b0; 
            end
            #30 begin
                B = 1'b1;
            end
        join
endmodule

module waveform_fork_join1();
    reg A,B;
    
    initial
        fork
            A = 1'b1;
            B = 1'b0;
            #10;
            begin
                A = 1'b0;
                B = 1'b1;
            end
            #20;
            begin
                A = 1'b1;
                B = 1'b0; 
            end
            #30;
            begin
                B = 1'b1;
            end
        join
endmodule

也许这样可以更清楚地表明,这 3 个延迟语句与代码无关。在第一种情况下,5 件事在时间 0 开始执行。在第 2 种情况下,8 件事在时间 0 开始执行。begin/end