В модуле я хотел бы создать много регистров различной длины и посылать информацию между этими регистрами каждый тактовый цикл.В частности, я пытаюсь создать модуль, который эффективно добавляет все элементы в список путем добавления их элементов попарно в новый список, а затем продолжается до тех пор, пока не появится один элемент.
Что-то вроде следующего, где вводпредставляет 4 списка длиной 16 из 8-битных целых чисел (этот код проходит синтез и реализацию, хотя я не проверял его, поэтому я не совсем уверен, что он выполняет то, что я хочу):
module math_op #(
parameter listlength=16,
parameter numlists=4,
parameter bits=8
)(
input clk,
input [bits*listlength*numlists-1:0] addthese,
output reg [bits*numlists-1:0] add
);
integer k;
integer j;
reg [bits*listlength/2-1:0] sum1[numlists-1:0];
reg [bits*listlength/4-1:0] sum2[numlists-1:0];
reg [bits*listlength/8-1:0] sum3[numlists-1:0];
always @(posedge clk) begin
for(k=0; k<numlists; k=k+1)
for(j=0; j<listlength/2; j=j+1) begin
sum1[k][bits*j +: bits]=addthese[2*bits*j+k*bits*listlength +: bits]+addthese[bits*2*j+bits+k*listlength +: bits];
end
for(k=0; k<numlists; k=k+1)
for(j=0; j<listlength/4; j=j+1) begin
sum2[k][bits*j +: bits]=sum1[k][2*bits*j +: bits]+sum1[k][2*bits*j+bits +: bits];
end
for(k=0; k<numlists; k=k+1)
for(j=0; j<listlength/8; j=j+1) begin
sum3[k][bits*j +: bits]=sum2[k][2*bits*j +: bits]+sum2[k][2*bits*j+bits +: bits];
end
for(k=0; k<numlists; k=k+1) begin
add[k*bits +: bits]=sum3[k][0 +: bits]+sum3[k][bits +: bits];
end
end
endmodule
Я хотел бычтобы можно было быстро изменить код для добавления списков разной длины.Например, я хотел бы иметь возможность изменить 'listlength' на 32, и иметь код, скомпилированный для создания дополнительного регистра (т.е. добавить еще один шаг попарного добавления, чтобы выходные данные остались той же длины).Если я изменю 'listlength' на 8192, соответствующее количество регистров должно быть создано для попарного добавления к выходу правильной длины.
Основываясь на небольшом количестве исследований, мне кажется, что я ищукоманда generate / genvar в verilog.Однако все примеры генерирования, которые я нашел, просто создают экземпляры модулей, а не регистров, и я даже не уверен, возможно ли создать переменную в одном цикле ссылки на команду генерации в другом.
По сути, я не совсем понимаю, как использовать команду создания, и я не совсем уверен, что это команда, которую я ищу.Предложения?