System verilog 如何在SystemVerilog中进行交叉?
我想在SystemVerilog中找到两个列表之间的交集。从斯派克曼那里有System verilog 如何在SystemVerilog中进行交叉?,system-verilog,System Verilog,我想在SystemVerilog中找到两个列表之间的交集。从斯派克曼那里有 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 int
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
是SVAs中使用的一个关键字。不建议使用任何关键字作为变量名
查看§7.12数组操作方法
我相信这是理想的等效函数:
myIntersect = listA.find with ( item inside {listB} );
啊,是这样。我应该用一个不同的名字作为我的例子。这个函数正是我想要的,谢谢。仅供参考:未打包的数组分配应该使用
{}
(带前导单引号)而不是{}
<代码>列表A[$]={A,B,C}代码>应该是listA[$]='{A,B,C}代码>示例见§7。