(A[2]==1)
是一个逻辑表达式,它是一个位运算符,尽管两者都有效,但使用逻辑和运算符&
会是更好的语义。&&
这与大多数其他语言略有不同,后者&&
是短路运算符。
逻辑上你想要的是if ((A[2]==1) && ((A[0]==0))
,但它可以简化为按位表达式:
if ( ~A[0] & A[2] )
注意:尽量避免使用 casex,未知部分会在模拟中匹配 x。尝试casez
改用, ? 仍然可以用来匹配不关心。
更新内部与 casez 的比较
Case 语句是大多数语言中使用的一种干净的控制结构,以避免出现较大的 if elsif else 链。内部操作会将 x 匹配到不关心 '?' 价值观。这使得它的用法类似于 casex,这被认为是不好的做法,因为它可以隐藏模拟失败。
casez(sel)
4'b1??? a= 3'd4;
4'b01?? a= 3'd3;
4'b001? a= 3'd2;
4'b0001 a= 3'd1;
4'b0000 a= 3'd0;
endcase
对比
if (sel inside {4'b1???})
a= 3'd4;
else if (sel inside {4'b01??})
a= 3'd3;
else if (sel inside {4'b001?})
a= 3'd2;
...
以上实际上等于casex(但更冗长)我相信你也可以使用而不是casex:
case(sel) inside
4'b1??? a= 3'd4;
4'b01?? a= 3'd3;
4'b001? a= 3'd2;
4'b0001 a= 3'd1;
4'b0000 a= 3'd0;
endcase
但是我永远不会使用casex。