一直对这个也不是特别明白
夏语文那本书上有一章将这个,可是说的好像不是很明白。基本没有读懂。
我理解他的意思就是说两种赋值在时间上是有差别的,阻塞是计算等式左边和给右边赋值是同时的,而且是有优先级的(不能被打断)。非阻塞是有一个时间差的。所以,在连续赋值时,比如:a=b;b=c;和b<=c;a<=b;前一个综合成一个寄存器,后一个综合成两个寄存器串联。可是b=c;a=b;综合的结构就是两个寄存器串联。
大家来讨论一下吧!
[ 本帖最后由 salading 于 2008-8-26 17:30 编辑 ]



最新回复
salading (2008-8-26 17:27:25)
写了两段代码,简单的赋值语句,都是沿触发的always块(如下所示),都综合成了触发器,没有任何区别:
1。always(posedge clk or negedge rst)
if(!rst)。。。。。。
else
a<=b;
2。always(posedge clk or negedge rst)
if(!rst)。。。。。。
else
a=b;
[ 本帖最后由 salading 于 2008-8-26 17:28 编辑 ]
neosly (2008-8-26 20:04:10)
一个是顺序执行的
一个是并行的执行的
尤其是加上延迟的时候很明显
个人感觉
salading (2008-8-27 11:16:55)
[ 本帖最后由 salading 于 2008-8-27 11:21 编辑 ]
salading (2008-8-27 11:22:20)
和左侧等式的赋值两个过程
yadog (2008-8-27 12:07:02)
这边文章相信可以解答疑惑
cryinrain_cug (2008-8-27 13:28:12)
这个东西主要看实践来检验!
xiaoyuer38 (2008-8-27 13:39:28)
salading (2008-8-27 14:41:53)
QUOTE:
夏那本书的这一章就是翻译的那篇文章,现在感觉是verilog就是一种单纯的语言,每种综合器对他都会有自己的理解。这二者是不能等价的番茄 (2008-8-27 14:53:16)
非阻塞并行执行
jiajie0628 (2008-8-27 15:14:19)
sinob (2008-8-27 16:30:15)
salading (2008-8-27 17:16:07)
always@(posedge clk)
a<=a+1;
always@(posedge clk)
b<=a;
这个a,b之间是有一个周期的延时的。是因为两个always块并行执行,每个always赋值时先计算等式右边,再给等式左边。比如说当赋值开始时,a=3,则先计算a+1和a,计算结果a+1是4,a是3,然后再给左边,则b=3而此时a=4。a,b之间是有一个周期的延时。
而假如后一个模块是下降沿触发的话,即:
always@(negedge clk)
b<=a;
则只有半个周期的延时。因为此时a是稳定的。
[ 本帖最后由 salading 于 2008-8-27 17:17 编辑 ]
salading (2008-8-28 09:49:21)