|
非阻塞赋值(如b <= a)书上讲解如下:
1、在语句块中,上面语句所赋的变量值不能立即就为下面的语句所用;
2、块结束后才能完成这次操作,而所赋的变量值是上一次赋值得到的;
3、在编写可综合德尔时序逻辑模块时,这是最常用的赋值方法
而在我实际运用中,可能是理解偏差,总是有些疑问,如下面的例子
exp1
always @(posedge clk)
begin
b <= a;
c<= b;
end
always 块中用了非阻塞赋值方式,定义了两个reg型信号b和c,clk信号的上升沿到来时,b就等于a,c就等于b,这里用到了两个触发器。如若在此clk之前,a为1,b为0;经此clk到来后,b被赋值1,c等于b,但这个b是此clk到来前的b,为0,也就是在语句块中,上一条语句所赋的值不能立即被下面的语句所用,实际上就是先计算更新RHS的值,在此语句块结束后才更新LHS的值。。这些都能理解但是后面的一段代码我就有点理解上的问题了
exp2
always @(posedge clk or negedge rst_n)
if (!rst_n) begin
num < = 4'd0;
state<= A;
end
else begin
num <= num + 1 ;
case (state)
A: begin
语句1;
end
B: begin
语句2;
end
C: begin
语句3;
end
endcase
end
首先复位后,num为0,state = A;
当来一个clk时,执行else 后面的begin ..... end语句块
问题是,我觉得来第一个clk时,首先更新RHS的num+1;但在此clk中语句块中num的值仍应该为0,所以因为state=A,所以执行语句1时,num的值应为0,,!!
然而在实践中时发现在A中,num 是为1 ?!!
很不解,望高手指导!!!! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|