微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 问verilog:阻塞和非阻塞赋值的顺序问题?

问verilog:阻塞和非阻塞赋值的顺序问题?

时间:10-02 整理:3721RD 点击:
假如有两个always块a,b,其敏感信号一样
在a中使用非阻塞赋值"<="
在b中使用阻塞赋值"="
那么每次敏感信号来后,是不是总是b块中赋值语句先执行,然后才是a中的赋值语句执行
就比如下面的程序段:
always(posedge clock)
begin
.....
i<=i+1;
......
end
always(posedge clock)
begin
......
case(i)
0:a=i;
1:a=i+1;
...
endcase
end
假如clock上升沿来前,i是0,那么进入always块后,在第2个块里的case语句中判断时
i是1还是0?仿真看来是i=0
是不是同样敏感信号下,always块中阻塞赋值和非阻塞赋值同时存在时,都是阻塞赋值先执行完,再轮到非阻塞赋值?(时序如果不是这样,我又得改程序了)
刚开始接触veilog,实在太菜,这个问题总是不明白,希望谁能详细解释一下,谢谢了

问verilog:阻塞和非阻塞赋值的顺序问题?
这个问题是比较蹊跷,其实呢你知道基本意思就可以了,只要在时序快里就用<=
其实在这两个模块里用〈= 还是 = 的结果都是一样的。

问verilog:阻塞和非阻塞赋值的顺序问题?
在第二个always块里,i的值是没有改变之前的,这与赋值形式没有关系。可以这样,你把第二个always块里的=换成<=,然后把两个always块合到一起,就明白了。

问verilog:阻塞和非阻塞赋值的顺序问题?
其实只要遵循这样的原则:时序电路用<=,组合电路用=
就对了.

问verilog:阻塞和非阻塞赋值的顺序问题?
thanks!

问verilog:阻塞和非阻塞赋值的顺序问题?
两个always是并行还是顺序执行?

问verilog:阻塞和非阻塞赋值的顺序问题?
并行啊,always块都是并行执行吧

问verilog:阻塞和非阻塞赋值的顺序问题?
因为两个always块是并行(同时)执行的,所以用什么赋值方法都一样.但是在同一个always块中就不一样,=会立即执行(下一行就可以用),而<=要等到所有右边的计算完成后,才赋值.

问verilog:阻塞和非阻塞赋值的顺序问题?
对实践来说,时序用《=,组合用=,不必讨论语法问题

问verilog:阻塞和非阻塞赋值的顺序问题?
同意

最好在时序里不要用=

学习完毕 谢谢

,=会立即执行(下一行就可以用),而<=要等到所有右边的计算完成后,才赋值.
支持

回复 #1 verilog 的帖子
非阻塞赋值“<="和阻塞赋值”=“都是在触发沿触发,但是<=不讲先后顺序,而=讲先后顺序。
如:
always @(posedge clk) (1)
.....
b<=a;
c<=b;
.......

always @(posedge clk)  (2)
......
b=a;
c=b;
.....
(1)中b和c都是取的a和b的值,
而(2)中b取a原来的值,而c取的是b赋值后的值,即a的值。

两个always并行的话会出现竞争的吧,结果会出错的么?

用<=的好

我认为这种说法是不正确的。
在这两个模块里,用nonblocking和blocking会产生不同的效果。

如果第一个always用=,产生的结果就是i=1

nonblocking是在当前仿真周期结束时才付值,而blocking是立即付值。

所以如果将两个always都用=,always的书写顺序会造成仿真结果不同,但是综合电路却是一样的,这就会造成形式验证错误(rtl vs netlist)

所以,如果被付值的变量要在其他always中引用,最好该变量用<=。

当然,最简单的办法就是组合用=,时序用<=

good point

very good

组合用阻塞,时序用非阻塞

dddddddddddddddddddddddd

不错。

可以这样理解,a、b两个过程块是并行运行的,两个块中的赋值并行执行的,如果初始时i=0,则对于第一个过程块:i<=0+1,第二个过程块:case(0):a=0,两个块的赋值没有先后顺序,即第一个块中i的变化不会影响到第二个块的赋值,可以看成块和块之间是非阻塞的,B块中用到A块的结果时用的是A块更新前的结果。
这是我个人的理解,如果有误请大家更正。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top