解释为什么当 #10 begin A = 1'b0; 时 fork-join 的行为不同B = 1'b1;结束,并到#10;开始 A = 1'b0; B = 1'b1;结束

问题描述 投票:0回答:1

请注意第二种情况下

#10
延迟后的分号。

我以为我理解了

fork-join
,但在这些输出之后,我认为我不明白。有人可以解释一下为什么分号造成了差异吗?当延迟后面有分号时,代码如何在
fork-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

输出: Output of the code without semicolon after delay.

第二种情况,代码是:

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

输出: Output of the code with semicolon after delay

verilog delay system-verilog fork-join
1个回答
0
投票

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

waveform_fork_join1
中,在时间 10,什么也没有发生,因为分号创建了一个 null 语句。与
begin/end
位于同一行的
#10;
块是一个完全独立的语句,在时间 0 执行。

您编写代码的方式非常混乱。首先,对于这样一个简单的例子来展示行为的差异,不需要这么多变量。考虑这种编写代码的替代方法:

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 个延迟语句与

begin/end
代码无关。

© www.soinside.com 2019 - 2024. All rights reserved.