comment puis-je compter le nombre de bits définis dans un uint dans specman?
-
10-07-2019 - |
Question
Je souhaite compter le nombre de bits définis dans un uint dans Specman:
var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;
Quelle est la meilleure façon de faire cela?
La solution
Je ne connais pas Specman, mais une autre façon de voir les choses que j'ai faite a l'air un peu ringarde, mais tend à être efficace: Conservez un tableau de 256 éléments; chaque élément du tableau est constitué du nombre de bits correspondant à cette valeur. Par exemple (pseudocode):
bit_count = [0, 1, 1, 2, 1, ...]
Ainsi, bit_count 2 == 1, car la valeur 2, en binaire, a un seul" 1 "" bit. De même, bit_count [255] == 8.
Ensuite, divisez l'uint en octets, utilisez les valeurs d'octet pour indexer dans le tableau nombre_bits et ajoutez les résultats. Pseudocode:
total = 0
for byte in list_of_bytes
total = total + bit_count[byte]
MODIFIER
Ce problème apparaît dans le livre Beautiful Code , dans le chapitre de Henry S. Warren. Matt Howells montre également une implémentation en langage C qui calcule efficacement le nombre de bits. Voir cette répondre .
Autres conseils
Une façon que j'ai vue est:
x_set_bits = pack(NULL, x).count(it == 1);
pack (NULL, x)
convertit x
en une liste de bits.
count
agit sur la liste et compte tous les éléments pour lesquels la condition est vérifiée. Dans ce cas, la condition est que l'élément soit égal à 1, ce qui correspond au nombre de bits définis.