verilog中的三目运算符

(1)
assign c=(sel)?a:b;


(2)
always @(sel or a or b) begin
       if(sel)
              c = a;
       else
              c = b;
end

       这两段代码,我用quartus综合出来的结果都是一个选择器,但是我私以为,这样两种风格的代码,我们都会偏向使用第一种,除了书写方便外,是否还有别的优势?如资源分配等?

发表于 2012-9-25 21:18 | 只看该作者

 

第一种好。
if else的逻辑是:只要条件不符合,就走else路。
试想如果上级电路出错,出现sel=1'bx的时候,那么代码(2)的c就会走else路=b。
而? :的运行结果跟实际电路更接近:连控制端sel都是不定值了,那c毫无疑问地应该是x,除非a=b。
总之,代码(1)在综合结果、资源利用等方面和(2)是完全一致的,但(1)的前仿结果跟后仿、跟实际电路更接近。

发表于 2012-10-1 09:46 | 只看该作者

 

编码规范严格的企业里,是规定要用第二种的,
可靠性比第一种高,不容易写错

请教各位大虾,关于Verilog中三目运算符的用法

发布: 2010-7-12 10:43 | 作者: shxr来源: EETOP 赛灵思(Xilinx) 社区 |

就是这个 out=s?a:b;这个用法只能用在assign中吗?谢谢各位了

well_fish (2010-7-12 11:39:09)

always initial都可以

gdarboux (2010-7-12 17:17:28)

楼上正解

shxr (2010-7-13 09:21:40)

那能够用非阻塞赋值如“out<=s?a:b;”吗?

MOSFET (2010-7-13 16:58:17)

回楼上可以你这相当于 assign out_t=s?a:b; always@(...) out<=out_t;

xinyuliujian (2010-7-14 17:06:17)

谢谢!指点

neptune1983 (2010-7-14 20:24:15)

这条语句就相当于一个if---else语句

 

 

 

注意:if语句和case语句都只能用于always语句内部,如果要在always语句之外应用条件语句,可用三目运算符:如下:

              assign data = ( sel ) ? a : b ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值