verilog中?:的写法和case写法,综合结果一样吗

a = b==1?1:
b==2?2:
b==3?3:
0
类似写法用case实现。
从代码上感觉前者是按顺序一级一级下来判断的,但是综合结果二者其实应该是一致的?是这样吗?

这是一个三目运算符的嵌套
跟写if嵌套差不多意思
改成case就是

switch(b)
{
case 1:
    a=1;
    break;
case 2:
    a=2;
    break;
case 3:
    a=3;
    break;
default:
    a=0;
    break;
}

但是其实还有更简练的写法

a=(b>0 && b<4)?b:0;

综合后是不一样的
用下面 4 种方式写的代码,综合后的结果如下


module xxx1
(
    output    [7:0]    a,
    input    [7:0]    b
);
assign    a =     b == 1 ? 1:
                b == 2 ? 2:
                b == 3 ? 4:0;
endmodule

module xxx2
(
    output    [7:0]    a,
    input    [7:0]    b
);
reg    [7:0]    a;
always@(*)
begin
    case(b)
    1:        a    <= b;
    2:        a    <= b;
    3:        a    <= b;
    default:a    <= 0;
    endcase
end
endmodule

module xxx3
(
    output    [7:0]    a,
    input    [7:0]    b
);
reg    [7:0]    a;
always@(*)
begin
    if(a<4)    a    <= b;
    else    a    <= 0;
end
endmodule

module xxx4
(
    output    [7:0]    a,
    input    [7:0]    b
);
assign    a    = b < 4 ? b:0;
endmodule



img

img

img

img