だから、私はベリログで加算器ツリーを書き込もうとしています。その一般的な部分は、追加する要素の構成可能な数と構成可能なワードサイズがあることです。しかし、私は問題を次々と抱えており、これが私の問題を解決する正しい方法であると疑問を呈し始めています。(私はより大きなプロジェクトでそれを使用します。)加算器ツリーをハードコーディングすることは間違いなく可能ですが、それは多くのテキストを必要とします。
だから、私はあなたとあなたがそれについてどう思うかについてスタックオーバーフローをチェックしたいと思います。これは「それを行う方法」ですか?さまざまなアプローチについての提案も受け付けています。
また、私はVerilogを初めて使用することもできます。
誰かが興味を持っている場合のために、これが私の現在の機能していないコードです:(私はあなたが問題を解決することを期待していません;私は便宜のためにそれを示しています。)
module adderTree(
input clk,
input [`WORDSIZE * `BANKSIZE - 1 : 0] terms_flat,
output [`WORDSIZE - 1 : 0] sum
);
genvar i, j;
reg [`WORDSIZE - 1 : 0] pipeline [2 * `BANKSIZE - 1 : 0]; // Pipeline array
reg clkPl = 0; // Pipeline clock
assign sum = pipeline[0];
// Pack flat terms
generate
for (i = `BANKSIZE; i < 2 * `BANKSIZE; i = i + 1) begin
always @ (posedge clk) begin
pipeline[i] <= terms_flat[i * `WORDSIZE +: `WORDSIZE];
clkPl = 1;
end
end
endgenerate
// Add terms logarithmically
generate
for (i = 0; i < $clog2(`BANKSIZE); i = i + 1) begin
for (j = 0; j < 2 ** i; j = j + 1) begin
always @ (posedge clkPl) begin
pipeline[i * (2 ** i) + j] <= pipeline[i * 2 * (2 ** i) + 2 * j] + pipeline[i * 2 * (2 ** i) + 2 * j + 1];
end
end
end
endgenerate
endmodule