系统 Verilog - 等待语句

sar*_*rad 3 system-verilog

我对等待语句的确切含义感到困惑。

在这种情况下会发生什么:

forever begin
    wait (vif.xn_valid == 1'b1);
    @(posedge vif.clk);
end
Run Code Online (Sandbox Code Playgroud)

wait语句是否阻塞?是个

@(posedge vif.clk)
Run Code Online (Sandbox Code Playgroud)

每次在循环内执行,无论等待表达式的计算如何?

在这种情况下:

forever begin
    wait(vif.cyc_tic == 1'b1) @(posedge vif.clk) #0 fact_log2_samp_t = vif.fact_log2_samp;
end
Run Code Online (Sandbox Code Playgroud)

#0 fact_log2_samp_t = vif.fact_log2_samp; 仅当 wait 表达式的计算结果为 true 时才执行wait() 之后的代码吗?

Mat*_*lor 6

在这种情况下

forever begin
    wait (vif.xn_valid == 1'b1);
    @(posedge vif.clk);
end
Run Code Online (Sandbox Code Playgroud)

循环会阻塞,直到表达式(vif.xn_valid == 1'b1)为 true,然后阻塞,直到出现posedgeon vif.clk

语句wait将阻塞,直到条件为真。如果条件已经为真,则立即继续执行。

在这种情况下:

forever begin
    wait(vif.cyc_tic == 1'b1) @(posedge vif.clk) #0 fact_log2_samp_t = vif.fact_log2_samp;
end
Run Code Online (Sandbox Code Playgroud)

循环会阻塞,直到表达式(vif.cyc_tic == 1'b1)为 true,然后阻塞,直到出现posedgeon vif.clk。它等同于:

forever begin
    wait(vif.cyc_tic == 1'b1);
    @(posedge vif.clk);
    #0 fact_log2_samp_t = vif.fact_log2_samp;
end
Run Code Online (Sandbox Code Playgroud)