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)的前仿结果跟后仿、跟实际电路更接近。
php

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

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

请教各位大虾,关于 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 ;
相关文章
相关标签/搜索