集合成员运算符
SystemVerilog 支持单值集合和集合成员运算符。
集合成员运算符的语法如下:

inside 运算符左侧的表达式可以是任何单一的表达式。
inside 运算符右侧的 range_list 是一个由逗号分隔的表达式或范围列表。集合的成员将被扫描,直到找到匹配项,运算返回 1'b1。如果没有找到匹配项,inside 运算符返回 1'b0。如果列表中的某个表达式是unpacked的数组,则会通过递归进入数组,直到到达单一值。值可以重复;因此,值和数值范围可能会重叠。表达式和范围的求值顺序是非确定性的。

inside 运算符对非整数表达式使用等式运算符 (==) 来进行比较。
整数表达式则使用通配符等式运算符 (==?),这样集合中的值如果在某一位上有 x 或 z 位,它将被视为该位位置的“无关”位(参见 11.4.6)。与通配符等式相似,inside 运算符左侧表达式中的 x 或 z 不会被视为“无关”位。

如果没有找到匹配项,但其中一些比较结果为 x,则内部运算符应返回 1'bx。返回值实际上是所有比较与左侧表达式的按位或(OR)归约结果(The return value is effectively the OR reduction of all the comparisons in the set with the expression on the left-hand side.)。

范围可以通过用方括号 [ ] 括起来并用冒号(:)分隔的低值和高值来指定,如 [low_bound:high_bound]。由 $ 指定的边界表示左侧表达式类型的最小值或最大值。如果左侧表达式的值在该范围内(包括边界),则会找到匹配项。?在指定范围时,表达式必须是单一类型,并且该类型必须定义了关系运算符(<=、>=)。如果冒号左侧的边界大于右侧的边界,则该范围为空,不包含任何值。
例如:


可以通过两个表达式,用绝对容差符号(+/-)或相对容差符号(+%-)分隔,来指定一个范围。
[A +/- B] 表示一个绝对容差范围,定义为:
[A-type(A)’(B) : A+type(A)’(B)].
[A +%- B] 表示一个相对容差范围,定义为:
[A-type(A)’(A*B/100.0) : A+type(A)’(A*B/100.0)].
无论 A 和 B 的符号如何,边界总是被视为 [低值:高值],并根据需要交换两个结果值。该范围的结果类型始终与 A 的类型相同。对于容差的实数到整数的转换,发生的是截断而非四舍五入。
例如: 假设 A = 7.0。A 的 25% 容差表示为:[A +%- 25],结果将是范围 [5.25:8.75]。如果 A 是整数(例如 7 或 -7),则结果范围会通过容差的截断转换为整数类型。例如,容差为 1.75(7 的 25%),但会截断为 1;因此,[5.25:8.75] 会转换为 [6:8],而 [-8.75:-5.25] 会转换为 [-8:-6]。
Case 语句
case 语句是一个多分支决策语句,用于测试一个表达式是否与多个其他表达式之一匹配,并根据匹配结果进行相应的分支操作。case 语句的语法如下:

12.5.4 集合成员资格 Case 语句
inside 关键字可以在括号表达式后使用,以表示集合成员资格(见 11.4.13)。在 case-inside 语句中,case_expression 将与每个 case_item_expression(范围列表)进行比较,使用集合成员资格 inside 运算符。inside 运算符使用不对称通配符匹配(见 11.4.6)。因此,case_expression 将是左操作数,而每个 case_item_expression 将是右操作数。case_expression 和每个 case_item_expression 在大括号中的表达式将按照普通 case 语句、唯一 case 语句或优先级 case 语句指定的顺序进行求值。
当 inside 操作将 case_expression 与 case_item_expression 进行比较时,如果返回 1'b1(匹配),则 case_item 被认为匹配;如果返回 1'b0 或 1'bx(不匹配),则认为没有匹配。如果所有比较都不匹配,并且给出了默认项,则将执行默认项语句。



浙公网安备 33010602011771号