问verilog:阻塞和非阻塞赋值的顺序问题?
在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块更新前的结果。
这是我个人的理解,如果有误请大家更正。
