Verilog:添加寄存器的各个位(组合逻辑,寄存器宽度可参数化)

Ujj*_*wal 3 verilog system-verilog

我试图找到一种方法来添加寄存器的各个位.例如,if regA = 111000 then regB = 3(位的总和regA).1)在Verilog或SystemVerilog中是否有可合成的函数/运算符可以直接用于执行此操作?

如果没有,那么问题可能有点有趣,特别是因为操作必须在一个时钟周期内进行(纯组合逻辑)并且寄存器宽度是可参数化的.

2)如果没有内置的Verilog或SystemVerilog操作符,那么可以做什么?

谢谢,Ujjwal

Gre*_*reg 6

Verilog(IEEE Std 1364-2001或更新版):

integer i;
always @* begin
  B = WIDTH_LOG2'b0;
  for (i=0; i<WIDTH; i=i+1)
    B = B + A[i];
end
Run Code Online (Sandbox Code Playgroud)

SystemVerilog(IEEE Std 1800-2005或更新版):

always_comb begin
  B = '0; // fill 0
  foreach(A[i])
    B += A[i];
end
Run Code Online (Sandbox Code Playgroud)

两者都将合成组合逻辑.没有闩锁或翻牌.

SystemVerilog确实有$countones(),但我不确定它是否可以合成.如果它是:always_comb B = $countones(A)