我们在工作中常常会针对数组施加各式的约束,下面列举一下有趣的Systemverilog数组约束示例:
1、如何约束动态数组的最后一个元素为特定值。(事先不知道数组的大小)
rand int some_dynamic_array[];
constraint last_elem_c {
some_dynamic_array[some_dynamic_array.size() - 1] == 5;
}
上面是最先想到的写法,但是会报错,因为SV约束语法不允许使用size()或任何其他随机值作为索引。所以只能修改代码:
constraint last_elem_c {
foreach(some_dynamic_array[i])
if (i == some_dynamic_array.size() - 1)
some_dynamic_array[i] == 5;
}
2、约束数组中必须包含一个特定的值2。
constraint contains_c {
2 inside { some_dynamic_array };
}
相反,如果我们约束数组中不包含值2呢?
constraint not_contains_c {
!(2 inside { some_dynamic_array });
}
3、约束数组中每个值都是唯一的。
constraint all_elems_unique_c {
unique { some_dynamic_array };
}
这个约束非常简短高效,等价于下面这段冗长的代码:
constraint all_elems_unique_c {
foreach (some_dynamic_array[i])
foreach (some_dynamic_array[j])
if (i != j)
some_dynamic_array[i] != some_dynamic_array[j];
}
上面这段代码虽然冗长,确是我们开发数组约束的一个通用框架。
4、约束2个数组相等。如果数组是packed可以直接使用==,如果数组是unpacked,则不行。
packed array约束:
rand bit[9:0][3:0] some_packed_array, some_other_packed_array;
constraint packed_arrays_equal_c {
some_packed_array == some_other_packed_array;
}
unpacked array约束:
rand bit[3:0] some_unpacked_array[10], some_other_unpacked_array[10];
constraint unpacked_arrays_equal_c {
foreach (some_other_unpacked_array[i])
some_other_unpacked_array[i] == some_unpacked_array[i];
}
作者:验证哥布林
文章来源:芯片验证工程师
推荐阅读
Constrained random value generation的记录
在芯片研发工作中,你犯过哪些“愚蠢”的错误?
UVM response_handler和get_response机制
更多FPGA干货请关注IC设计技术专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。