如何在 SystemVerilog 中做交集?

How to do Intersections in SystemVerilog?

我想在 SystemVerilog 中找到两个列表之间的交集。来自 Specman

var intersect: list of my_enum;
intersect = listA.all(it in listB);

我认为这很古怪。但我在 SystemVerilog 中能想到的最好的是:

typedef enum {A, B, C, D} my_enum;
my_enum listA[$] = {A, B, C};
my_enum listB[$] = {B, C, D};
my_enum intersect[$];

foreach(listA[i])
  if(listA[i] inside listB)
    intersect.push_back(listA[i]);

IEEE 1800-2012 确实提到了 intersect 关键字,但它似乎不适用于这种情况。有没有更优雅的方式?

intersect 是 SVA 中使用的关键字。不建议使用任何关键字作为变量名。

查看 IEEE Std 1800-2012 § 7.12 数组操作方法

我相信这是期望的等效函数是:

myIntersect = listA.find with ( item inside {listB} );