System Verilog Generate - Невозможно получить доступ к локальным шинам в предыдущих циклах, используя $ size - PullRequest
0 голосов
/ 17 марта 2020

введите описание изображения здесь

Я пытаюсь реализовать дерево OR, используя заданный c тип ячейки CKOR2 поэтапно. Этап в генерации l oop. Мне нужно получить доступ к ширине выходной шины предыдущих циклов в текущем l oop, чтобы определить ширину и определить выходную шину текущего каскада.

Я получаю ошибки в строке, используя $ size

module test ( A, o );
    parameter WIDTH = 9 ;
    input [WIDTH-1:0] A;
    output o;
    localparam NUM_OR_STAGES = $clog2(WIDTH) ;
    genvar i;
    for (i=0; i < NUM_OR_STAGES; i=i+1) begin: OR
        localparam j=i-1;
        if ( i == 0 ) begin
            localparam width = WIDTH;
            wire [WIDTH-1:0] stgout;
            assign stgout = A;
        end 
        else begin
            localparam width = $size( OR[i-1].stgout ) ; 
            localparam width_div2 = width/2;
            localparam offset = ( width % 2); 
            wire [width_div2-1:0] stgo;
            wire [width_div2+offset-1:0] stgout;
            CKOR2 u_ckor[width_div2-1:0] ( .o(stgo), .i0(OR[i-1].stgout[width-1:width-width_div2]), .i1(OR[i-1].stgout[width-width_div2-1:width-2*width_div2]));
            if ( offset )
                assign stgout = { stgo,OR[i-1].stgout[0] };
            else 
                assign stgout = stgo;
        end
    end
    assign o = OR[NUM_OR_STAGES -1].stgout;
endmodule

1 Ответ

1 голос
/ 17 марта 2020

Ваша проблема: stgout[0] объявлен внутри неназванного блока begin/end, и вы не можете получить к нему доступ снаружи блока. Это также проблема для соединений порта CKOR2. Присвоение имен блокам не решит вашу проблему, поскольку вам придется переключаться между ссылками на ветку i==0, когда i равен 1, и другой веткой, когда i!=1. Лучше перенести объявления за пределы if/else веток. Я не проверял математику, но это должно приблизить вас:

module test ( A, o );
    parameter WIDTH = 9 ;
    input [WIDTH-1:0] A;
    output o;
    localparam NUM_OR_STAGES = $clog2(WIDTH) ;
    genvar i;
    for (i=0; i < NUM_OR_STAGES; i=i+1) begin: OR
      localparam width = WIDTH*2/(i+1);
      localparam width_div2 = width/2;
      localparam offset = ( width % 2); 
      wire [width_div2+offset-1:0] stgout;
      if ( i == 0 ) begin
            assign stgout = A;
      end else begin
            wire [width_div2-1:0] stgo;
            CKOR2 u_ckor[width_div2-1:0] ( .o(stgo), .i0(OR[i-1].stgout[width-1:width-width_div2]), .i1(OR[i-1].stgout[width-width_div2-1:width-2*width_div2]));
            if ( offset )
                assign stgout = { stgo,OR[i-1].stgout[0] };
            else 
                assign stgout = stgo;
        end
    end
    assign o = OR[NUM_OR_STAGES -1].stgout;
endmodule
...