come posso contare il numero di bit impostati in un uint in specman?
-
10-07-2019 - |
Domanda
Voglio contare il numero di bit impostati in un uint in Specman:
var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;
Qual è il modo migliore per farlo?
Soluzione
Non conosco Specman, ma un altro modo in cui l'ho visto sembra un po 'sdolcinato, ma tende ad essere efficiente: mantenere un array di 256 elementi; ogni elemento dell'array è costituito dal numero di bit corrispondenti a quel valore. Ad esempio (pseudocodice):
bit_count = [0, 1, 1, 2, 1, ...]
Pertanto, bit_count 2 == 1, perché il valore 2, in binario, ha un singolo" 1 " po. Allo stesso modo, bit_count [255] == 8.
Quindi, suddividere uint in byte, utilizzare i valori byte per indicizzare l'array bit_count e aggiungere i risultati. Pseudocodice:
total = 0
for byte in list_of_bytes
total = total + bit_count[byte]
MODIFICA
Questo problema si presenta nel libro Beautiful Code , in il capitolo di Henry S. Warren. Inoltre, Matt Howells mostra un'implementazione del linguaggio C che calcola in modo efficiente un conteggio dei bit. Vedi questo rispondere .
Altri suggerimenti
Un modo che ho visto è:
x_set_bits = pack(NULL, x).count(it == 1);
pack (NULL, x)
converte x
in un elenco di bit.
count
agisce nell'elenco e conta tutti gli elementi per i quali la condizione è valida. In questo caso la condizione è che l'elemento sia uguale a 1, che risulta dal numero di bit impostati.