4

假设我有一个场景,我只需要比较寄存器的几个位,而不关心其他位。eq,我需要检查 3 位寄存器(A[2:0])的第一位和最后一位,我不关心中间位,比如比较向量是 3'b1X0(参数)。

  1. 最简单的方法是选择我关心的所有位,并且它们和我生成了一个控制信号: if ((A[2]==1) & ((A[0]==0))这里的条件if语句是我的控制信号。

  2. 另一种方法是使用 casex 语句:casex(A) begin 3'b1?0: ... , ... endcase.

  3. 有没有类似 ifx-elsex 语句或可以在不使用第一种和第二种方法的情况下进行这种操作的东西?

谢谢!

4

3 回答 3

5

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 年出版的书)说它还不支持合成。欢迎您尝试一下。

于 2013-06-18T22:29:31.973 回答
2

(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。

于 2013-06-18T21:54:44.053 回答
0

据我所知,没有运营商允许您使用“?” 或 'x' 在相等比较中忽略它们。

您没有提到的另一种选择是使用位掩码来选择您只关心的位。如果您有很多位,这可能比单独测试每个位更紧凑。

如果你只关心A == 3'b1?0,那么它可以这样写:

if((A & 3'b101) == 3'b100)

于 2013-06-18T21:24:19.140 回答