我們在工作中常常會(huì)針對數(shù)組施加各式的約束,下面列舉一下有趣的Systemverilog數(shù)組約束示例:
1、如何約束動(dòng)態(tài)數(shù)組的最后一個(gè)元素為特定值。(事先不知道數(shù)組的大?。?/strong>
rand int some_dynamic_array[];
constraint last_elem_c {
some_dynamic_array[some_dynamic_array.size() - 1] == 5;
}
上面是最先想到的寫法,但是會(huì)報(bào)錯(cuò),因?yàn)?SV約束語法不允許使用size()或任何其他隨機(jī)值作為索引 。所以只能修改代碼:
constraint last_elem_c {
foreach(some_dynamic_array[i])
if (i == some_dynamic_array.size() - 1)
some_dynamic_array[i] == 5;
}
2、約束數(shù)組中必須包含一個(gè)特定的值2。
constraint contains_c {
2 inside { some_dynamic_array };
}
相反,如果我們約束數(shù)組中不包含值2呢?
constraint not_contains_c {
!(2 inside { some_dynamic_array });
}
3、約束數(shù)組中每個(gè)值都是唯一的。
constraint all_elems_unique_c {
unique { some_dynamic_array };
}
這個(gè)約束非常簡短高效,等價(jià)于下面這段冗長的代碼:
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];
}
上面這段代碼雖然冗長,確是我們開發(fā)數(shù)組約束的一個(gè)通用框架。
4、約束2個(gè)數(shù)組相等。如果數(shù)組是packed可以直接使用==,如果數(shù)組是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];
}
-
Verilog
+關(guān)注
關(guān)注
28文章
1343瀏覽量
109925
發(fā)布評論請先 登錄
相關(guān)推薦
評論