verilog中阻塞复制,非阻塞复制,顺序块,并行块之间的关系

这几个概念是不一样的
顺序块:顺序块中的语句是按顺序执行的,每条语句中的延迟值是与其前一条语句执行的仿真时间有关。
并行块:并行块语句是并行执行的,它里面的每条语句中指定的延迟值都是相对于语句块开始执行的时候。
所以顺序块和并行块的区别是,里面每条语句执行的仿真时间,而非具体的阻塞,非阻塞语句。
阻塞赋值:在一下条语句执行前,这条赋值语句必须已经完成。
非阻塞赋值:当非阻塞性过程赋值语句执行时,计算右侧的表达式,然后在预定时刻将右侧的值赋给的目标。最快的输出也要在当前时刻结束前的最后时刻。它计算出右侧的值后,并不阻塞,后面的语句正常运行,而真正的赋值发生在当前或者延迟结束的时刻。 不阻塞后面语句执行,在当前或者延迟结束时刻赋值是它的特点。而后面语句内部延迟,它只是说明赋值延迟时刻而已,而不关注赋值的时机。它们是不同的概念。

下面是我写的例子,使用Synplify_pro综合:

module test(
           d1,
           clk,
           q1,
           q2
           );
    input d1,clk;     
    output q1;
    output q2;
    reg q1,q2;
   
    always @  (posedge clk)
       begin
        q1 = d1;
        q2 = q1;
       end
endmodule
综合后只有一个DFF。


module test(
           d1,
           clk,
           q1,
           q2
           );
    input d1,clk;     
    output q1;
    output q2;
    reg q1,q2;
   
    always @  (posedge clk)
       fork
        q1 = d1;
        q2 = q1;
       join
endmodule

综合后有两个DFF。

module test(
           d1,
           clk,
           q1,
           q2
           );
    input d1,clk;     
    output q1;
    output q2;
    reg q1,q2;
   
    always @  (posedge clk)
       begin
        q1 <= d1;
        q2 <= q1;
       end
endmodule
综合后有两个DFF。

module test(
           d1,
           clk,
           q1,
           q2
           );
    input d1,clk;     
    output q1;
    output q2;
    reg q1,q2;
   
    always @  (posedge clk)
       fork
        q1 <= d1;
        q2 <= q1;
       join
endmodule

综合后有两个DFF。

原文地址:https://www.cnblogs.com/rednodel/p/4053744.html