2016-11-17 2 views
1

Я хочу подсчитать количество единиц в упакованном массиве. Я придумал следующий код: https://www.edaplayground.com/x/2Va6Подсчитайте количество единиц в массиве бит

Я думаю, что это можно сделать проще. Любое предложение?

typedef bit bit6_t[5:0]; 

module test_rand; 
    bit [5:0] mask_packed; 
    bit mask_packed_bit[5:0]; 
    int mask_unpacked[5:0]; 
    initial begin 
     mask_packed = $urandom_range(((2**6)-1),0); 
     mask_packed_bit = bit6_t'(mask_packed); 
     foreach (mask_packed_bit[i]) begin mask_unpacked[i] = int'(mask_packed_bit[i]); end 
     $display("*********************************"); 
     $display("mask_packed = %p",mask_packed); 
     $display("mask_unpacked  = %p",mask_unpacked); 
     $display("mask_unpacked.sum = %p",mask_unpacked.sum()); 
     $display("*********************************"); 
    end 
endmodule 

ответ

2

Вы можете попробовать следующее

typedef bit bit6_t[5:0]; 

module test_rand; 
    bit [5:0] mask_packed; 
    bit6_t mask_unpacked; 
    initial begin 
     mask_packed = $urandom_range(((2**6)-1),0); 
     mask_unpacked = bit6_t'(mask_packed); 
     $display("*********************************"); 
     $display("mask_packed = %p",mask_packed); 
     $display("mask_unpacked = %p",mask_unpacked); 
     $display("mask_unpacked.sum = %p",mask_unpacked.sum() with (int'(item))); 
     $display("*********************************"); 
    end 
endmodule 

Рабочий пример: https://www.edaplayground.com/x/5cXx

3

1) Для простого кода Verilog:

Ваш последний неявное $ приведение к «междунар ненужно. Так как вы хотите, только сумму, вы можете:

typedef bit bit6_t[5:0]; 

module test_rand; 
    bit [5:0] mask_packed; 
    bit mask_packed_bit[5:0]; 
    int sum = 0; 
    initial begin 
     mask_packed = $urandom_range(((2**6)-1),0); 
     mask_packed_bit = bit6_t'(mask_packed); 
     foreach (mask_packed_bit[i]) begin sum += mask_packed_bit[i]; end 
     $display("*********************************"); 
     $display("mask_packed = %p",mask_packed); 
     $display("mask_packed_bit = %p",mask_packed_bit); 
     $display("sum = %p",sum); 
     $display("*********************************"); 
    end 
endmodule 

Рабочий пример: https://www.edaplayground.com/x/5ZTW

2) Если вы используете SystemVerilog, вы можете использовать простой $ countones функцию.

module test_rand; 
    bit [5:0] mask_packed; 
    initial begin 
     mask_packed = $urandom_range(((2**6)-1),0); 
     $display("*********************************"); 
     $display("mask_packed = %p",mask_packed); 
     $display("countones = %p", $countones(mask_packed)); 
     $display("*********************************"); 
    end 
endmodule 

Рабочий пример: https://www.edaplayground.com/x/2Nsd