begin end中阻塞语句与非阻塞语句执行顺序的问题

来源:互联网 发布:java中字符串截断 编辑:程序博客网 时间:2024/06/05 16:16
  • 1
module fsm_2(clk,A,Y);input clk,A;output reg Y;reg q1;always@(posedge clk)beginY<=q1&(~A);q1=~A;endendmodule


  • 2

将always块中的语句改为

q1=~A;Y<=q1&(~A);

  • 3

将always块中的语句改为

q1<=~A;Y<=q1&(~A);



1与3的电路是相同的。

因此,我认为在非阻塞赋值后加阻塞赋值语句是没有意义的,对于综合后,将对于非阻塞赋值语句的RHS表达式的变量重新赋值的阻塞赋值全变为非阻塞赋值,因为他认为RHS表达式的变量在这个时钟周期内不能被改变,如:1中,Y<=q1&(~A);q1=~A;非阻塞赋值语句的RHS表达式的变量q1在下一条阻塞语句中又被赋值,因此,默认为q1<=~A;

总结:

对执行顺序的理解:

begin end块中顺序执行,即一条一条的执行,只不过,遇到非阻塞时 ,只执行RHS表达式的值,不执行赋值,而后,再执行下一条语句,若下一条语句仍是非阻塞,则继续只执行RHS表达式的值,不执行赋值。如:

module fsm_2(clk,A,Y1,Y2);input clk,A;output reg Y1,Y2;reg q1,q2;always@(posedge clk)beginq1<=A;//1Y1<=q1&(~A);//2q2=~A;//3Y2<=q2&(~A);//4endendmodule

执行顺序是:A,q1&(~A),q2=~A,q2&(~A);

对于有些文章说

“ 在计算非阻塞赋值的RHS表达式和更新LHS期间,其他的verilog语句,包括其他的verilog     非阻塞赋值语句都能同时计算RHS表达式和更新LHS。”不能理解是

2非阻塞语句的rhs执行中,同时4非阻塞语句的rhs同时也在执行,而是2非阻塞语句的rhs执行后,再执行3阻塞语句,再执行4非阻塞语句的rhs。