3

レジスタの個々のビットを追加する方法を考え出そうとしています。例: if regA = 111000 then regB = 3(のビットの合計regA)。1) Verilog または SystemVerilog に、この操作を行うために直接使用できる合成可能な関数/演算子はありますか?

そうでない場合、特に操作が 1 クロック サイクル (純粋な組み合わせロジック) で実行される必要があり、レジスタ幅がパラメーター化可能であるため、問題は少し興味深いものになる可能性があります。

2) 組み込みの Verilog または SystemVerilog オペレーターがない場合、何ができるでしょうか?

ありがとう、ウジュワル

4

2 に答える 2

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

SystemVerilog (IEEE Std 1800-2005 以降):

always_comb begin
  B = '0; // fill 0
  foreach(A[i])
    B += A[i];
end

どちらも組み合わせロジックに合成されます。ラッチやフロップはありません。

SystemVerilog には がありますが$countones()、合成可能かどうかはわかりません。それは次のとおりです。always_comb B = $countones(A)

于 2013-06-18T02:40:59.973 に答える
2

このようなものを試すことができます。何を合成するのか正確にはわかりませんが、うまくいくはずです。

int i; 
reg [`WIDTH-1:0]    A;
reg [`WIDTH_LOG2:0] B;

B = 0;

for(i = 0; i < `WIDTH; i = i + 1)
begin
   B = B + A[i];
 end

もちろん、ツール フローと使用可能なものに応じて、パフォーマンスが向上する可能性のあるより複雑な方法があり、独自の加算器を作成して並列にカスケードし、各ステップのサイズを小さくすることができます。幅が 32 ビットであると仮定すると、次のようになります。

 adder1bit_1(output1, A[31:24]); 
 adder1bit_2(output2, A[23:16]);
 adder1bit_3(output3, A[15:8]);
 adder1bit_4(output4, A[7:0]);

 adder3bit_1(output5, output1, output2);
 adder3bit_2(output6, output3, output4);

 adder4bit(final_ouput, output5, output6);
于 2013-06-18T01:50:03.660 に答える