在Verilog / SV中是否有像ifx一样的ifx-elsex语句?

问题描述 投票:3回答:3

假设我有一个场景,我需要只比较一个寄存器的几位而不关心其他位。 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语句或可用于在不使用第一和第二种方法的情况下进行此类操作的内容?

谢谢!

verilog system-verilog
3个回答
4
投票

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年出版的一本书)表示它尚不支持合成。欢迎您试用。


2
投票

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


0
投票

没有我知道的操作员允许你使用'?'或者在等式比较中使用'x'来忽略它们。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.