Verilog: создание множества регистров различной длины / команда generate / genvar - PullRequest
0 голосов
/ 22 марта 2019

В модуле я хотел бы создать много регистров различной длины и посылать информацию между этими регистрами каждый тактовый цикл.В частности, я пытаюсь создать модуль, который эффективно добавляет все элементы в список путем добавления их элементов попарно в новый список, а затем продолжается до тех пор, пока не появится один элемент.

Что-то вроде следующего, где вводпредставляет 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.Однако все примеры генерирования, которые я нашел, просто создают экземпляры модулей, а не регистров, и я даже не уверен, возможно ли создать переменную в одном цикле ссылки на команду генерации в другом.

По сути, я не совсем понимаю, как использовать команду создания, и я не совсем уверен, что это команда, которую я ищу.Предложения?

...