System verilog 一个计数系统verilog

System verilog 一个计数系统verilog,system-verilog,System Verilog,我有一个64位的线向量 wire [63:0] sout; 我想计算这些位的和,或者,相等地,计算一个数 最好的方法是什么?(它应该是可综合的)最佳”是相当主观的,但一个简单明了的表述应该是: wire [6:0] sout_sum = sout[63] + sout[62] + ... + sout[1] + sout[0]; 你也许能够认真思考,想出一些能产生更好的综合结果的东西,但这可能是一个好的开始,直到计时工具说这还不够好。我更喜欢使用for循环,因为它们更容易缩放,需要更少的键入

我有一个64位的线向量

wire [63:0] sout;
我想计算这些位的和,或者,相等地,计算一个数

最好的方法是什么?(它应该是可综合的)

最佳”是相当主观的,但一个简单明了的表述应该是:

wire [6:0] sout_sum = sout[63] + sout[62] + ... + sout[1] + sout[0];

你也许能够认真思考,想出一些能产生更好的综合结果的东西,但这可能是一个好的开始,直到计时工具说这还不够好。

我更喜欢使用for循环,因为它们更容易缩放,需要更少的键入(从而更不容易打字)

SystemVerilog(IEEE标准1800):

Verilog(IEEE标准1364-2005):

参数宽度=64;
//注:$clog2是在1364-2005年添加的,在1364-1995或1364-2001年不支持
reg[$clog2(宽度+1)-1:0]计数;
整数idx;
总是开始
count_one={WIDTH{1'b0}};

对于(idx=0;idx,以下解决方案使用一个函数来计算64位宽总线中的集合(到高位)位总数:

function logic [6:0] AddBitsOfBus (
    input [63:0] InBus
);
    AddBitsOfBus[2:0] = '0;
    for (int k = 0; k < 64; k += 1) begin // for loop
        AddBitsOfBus[6:0] +=  {6'b00_0000, InBus[k]};
    end
endfunction
功能逻辑[6:0]添加位总线(
在总线中输入[63:0]
);
AddBitsOfBus[2:0]=“0;
for(int k=0;k<64;k+=1)开始//for循环
AddBitsOfBus[6:0]+={6'b00_0000,InBus[k]};
结束
端功能

我猜否决票是因为你没有公布你试图解决的问题。可能是真的重复。因为我不知道从哪里开始,除了Jared Davis的答案。这是我目前的答案,但肯定有一种更简洁的方法来写这篇文章。
parameter WIDTH = 64;
// NOTE: $clog2 was added in 1364-2005, not supported in 1364-1995 or 1364-2001
reg [$clog2(WIDTH+1)-1:0] count_ones; 
integer idx;

always @* begin
  count_ones = {WIDTH{1'b0}};  
  for( idx = 0; idx<WIDTH; idx = idx + 1) begin
    count_ones = count_ones + sout[idx];
  end
end
function logic [6:0] AddBitsOfBus (
    input [63:0] InBus
);
    AddBitsOfBus[2:0] = '0;
    for (int k = 0; k < 64; k += 1) begin // for loop
        AddBitsOfBus[6:0] +=  {6'b00_0000, InBus[k]};
    end
endfunction