假设我有一个场景,我需要只比较一个寄存器的几位而不关心其他位。 eq,我需要检查3位寄存器的第一位和最后一位(A [2:0]),我不关心中间位,比较矢量是3'b1X0(参数)。
if ((A[2]==1) & ((A[0]==0))
这里if
语句中的条件是我的控制信号。casex(A) begin 3'b1?0: ... , ... endcase
。谢谢!
if (A[2:0] inside {3'b1?0} )
SystemVerilog关键字inside
。它至少得到了Accellera的SystemVerilog 3.1(在SystemVerilog之前是IEEE的一部分)的支持。 IEEE Std 1800-2012 11.4.13有使用范例。 inside
是可综合的。
还有if ( A[2:0] ==? 3'b1?0 )
(IEEE Std 1800-2012 11.4.6)。我手边的唯一参考资料(2004年出版的一本书)表示它尚不支持合成。欢迎您试用。
(A[2]==1)
是一个逻辑表达式,&
是一个按位运算符,尽管要么使用&&
逻辑和运算符会更好的语义。这与&&
是short-circuit operator的大多数其他语言略有不同。
逻辑上你想要的是if ((A[2]==1) && ((A[0]==0))
,但它可以简化为一个按位表达式:
if ( ~A[0] & A[2] )
注意:尽量避免使用casex,未知部分将在模拟中与x匹配。尝试使用casez
,?仍然可以用来匹配不关心。
更新内部与casez的比较
案例陈述是大多数语言中使用的一种干净的控制结构,以避免大的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
VS
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。
没有我知道的操作员允许你使用'?'或者在等式比较中使用'x'来忽略它们。
你没有提到的另一个选择是使用位掩码来选择你唯一关心的位。如果你有很多位,这可能比单独测试每个位更紧凑。
如果你只关心A == 3'b1?0
,那么它可以写成:
if((A & 3'b101) == 3'b100)