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

  • 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值