返回介绍

7.20 集合成员资格

发布于 2020-09-09 22:55:47 字数 1402 浏览 1025 评论 0 收藏 0

SystemVerilog支持单一值集合以及集合成员资格操作符。

集合成员资格操作符的语法如下:

inside_expression ::= expression inside {open_range_list} // 引用自附录A.8.3

语法7-7 — inside表达式语法(摘录自附录A)

inside操作符左侧的表达式是任意单一表达式。inside操作符右侧的集合成员资格open_range_list是逗号分割的表达式或范围列表。如果列表中的表达式是一个集合数组,那么它的元素会被遍历,沿着数组深入直到到达一个单一值。集合的成员会被扫描直到找到一个匹配并返回1'b1。值可以是重复的,所以值与值的范围可以重叠。表达式和范围的计算顺序是不确定的。

int a, b, c;

if (a inside {b, c}) ...

int array[$] = {3,4,5};
if (ex inside {1, 2, array}) ... // 与{1, 2, 3, 4, 5}相同

对于非integral类型的表达式,inside操作符使用相等操作符(==)来执行比较。如果没有找到匹配的值,inside操作符返回1'b0。integral表达式也使用相等操作符,除了集合中各个值中的z会被当作是不予考虑的位,并且不会考虑这个位的位置。注意:与casez语句所执行的比较不同,位于左侧的表达式中的z值会被考虑在内;不予考虑是单向的。

logic [2:0] val;
while (val inside {3'b1?1}) ... // 匹配于3'b101, 3'b111, 3'b1x1, 3'b1z1

如果没有找到匹配,但某些比较结果是x,那么inside操作符应该返回1'bx。返回值实际是集合中所有与左侧表达式比较结果的或缩减。

wire r;
assign r = 3'bz11 inside {3'b1?1, 3'b011}; // r = 1'bx

SystemVerilog可以使用方括号([])来指定一个范围,方括号中包含了一个低边界和高边界,这两个边界值之间用冒号(:)隔开,例如[low_bound:high_bound]这样的形式。使用$指定的范围应代表左侧表达式类型的最高或最低值。如果左侧的表达式包含在范围之内,那么会找到一个匹配。当指定了一个范围的时候,表达式必须是定义了关系操作符(<=,>=)的单一值。如果冒号左侧的边界大于冒号右侧的边界,那么这个范围是空的并且不包含任何值。

例如:

bit ba = a inside {[16:23], [32:47]};

string I;
if (I inside {["a rock":"hard place"]}) ...
    // I在"a rock"和"hard place"之间

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文