计算位数组中的1的数量

时间:2016-11-17 21:27:30

标签: system-verilog

我想计算打包数组中的数量。我想出了以下代码: 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 个答案:

答案 0 :(得分:3)

1)对于普通的verilog代码:

您最后一次隐式$强制转换为' int是不必要的。由于您只需要总和,您可以:

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

答案 1 :(得分: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