在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 36368|回复: 21

[求助] verilog的always块内多个if else语句执行顺序问题

[复制链接]
发表于 2013-4-15 18:13:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
各位达人:verilog的always块内begin 和 end间语句若为阻塞语句赋值,则是顺序执行。若为非阻塞语句赋值,则为并行执行。
但是当一个always块内含有多个if else语句
执行顺序是怎么判断的?

是不是这样: 在一个always@begin end里面
若if else里面的语句是阻塞赋值语句,则是顺序执行,就是先执行了前面的if else语句,执行完了再执行后面的if else语句。
若if else里面的语句是非阻塞赋值语句,则各个if else语句间是并行执行的。
若两个if else 之间还有非阻塞赋值语句,则if else与非阻塞赋值语句都是并行执行的。

这样理解对么?

为了更好的请教大家,大家看下代码,告诉我执行顺序可以么?




  1. always@(posedge clk) begin

  2. if(...) data1 <= data2 else... //第一个if else语句
  3. a <= b;
  4. c <= d;
  5. if(...) data3 <= data4 else... //第二个if else语句

  6. end


复制代码
发表于 2013-4-16 00:05:06 | 显示全部楼层
假设在posedge 时刻
{data1,data2,data3,data4,a,b,c,d}={4‘h1,4'h2,4'h3,4'h4,4'h5,4'h6,4'h7,4'h8}
结果:
{data1,data2,data3,data4,a,b,c,d}={2,2,4,4,6,6,8,8}

其实顺序都是顺序执行的,关键在于阻塞复制和非阻塞复制的“赋值”时刻。
 楼主| 发表于 2013-4-16 08:35:09 | 显示全部楼层
这两个if else语句是先执行前一个,再执行后一个,可以这么理解么?
发表于 2013-4-16 19:54:06 | 显示全部楼层
begin。。end是顺序块,运行的时候是先判断一个再判断另外一个,但是更新值得时候都是在有效延更新
发表于 2013-4-16 22:59:00 | 显示全部楼层
回复 4# changhcl


   begin and应该不算顺序块吧 和块内具体赋值语句有关~
发表于 2013-4-18 17:59:54 | 显示全部楼层
begin end内部的阻塞或非阻塞都需要满足有效沿才动作,而这两个if else顺序执行和同时执行的结果没影响,是独立的。如果两个if else有对同一个变量做赋值动作,则可以体现出阻塞和非阻塞的差别!
发表于 2013-4-18 18:08:04 | 显示全部楼层
这2个赋值,可能会导致无法综合
或者可以强制综合但有毛刺,并且结果还不可预知(既然竞争就看谁的路径短了,短的先被干掉)
发表于 2014-9-13 17:20:22 | 显示全部楼层
遇到了同样的问题,感觉还是用阻塞性赋值思路比较清晰,一开始用的非阻塞性赋值无法实现功能,后来全变成阻塞性赋值就好了!!
发表于 2014-9-13 17:21:18 | 显示全部楼层
楼主现在弄明白了吗,求指教!!
发表于 2014-9-14 11:52:46 | 显示全部楼层
回复 9# guodaqn


    两个语句时刻执行的,相当于把两个语句拆开放在两个always @(posedge clk)执行,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-16 21:53 , Processed in 0.021776 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表