-
1
module fsm_2(clk,A,Y);
input clk,A;
output reg Y;
reg q1;
always@(posedge clk)
begin
Y<=q1&(~A);
q1=~A;
end
endmodule
- 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)
begin
q1<=A;//1
Y1<=q1&(~A);//2
q2=~A;//3
Y2<=q2&(~A);//4
end
endmodule
执行顺序是:A,q1&(~A),q2=~A,q2&(~A);
对于有些文章说
“ 在计算非阻塞赋值的RHS表达式和更新LHS期间,其他的verilog语句,包括其他的verilog 非阻塞赋值语句都能同时计算RHS表达式和更新LHS。”不能理解是
2非阻塞语句的rhs执行中,同时4非阻塞语句的rhs同时也在执行,而是2非阻塞语句的rhs执行后,再执行3阻塞语句,再执行4非阻塞语句的rhs。