Оператор Generate-if не может дать постоянное значение

Я пытался создать сетку маршрутизаторов (каждый маршрутизатор представляет собой модуль) переменной длины, которую можно указать с помощью двух параметров. в то время как количество портов ввода/вывода фиксировано для модуля, соединения генерируются внутри и подключаются соответствующим образом к вводу/выводу. Я успешно сгенерировал все порты, но не смог сгенерировать маршрутизаторы. Компилятор Verilog выдал ошибку:

условное выражение не может быть преобразовано в константу

Ошибка была с генерацией роутеров. выражения в двух циклах for не могут быть вычислены и, следовательно, условные операторы. Я пытался поместить все в всегда блок, но не повезло.

вот код:

 `timescale 1ns / 1ps
 `define n ((i-1)*NUMBER_OF_ROUTER_COLS + j)

module top_n_router #(parameter NUMBER_OF_ROUTER_ROWS = 2, NUMBER_OF_ROUTER_COLS = 2)(
input clk, clr,
input [7:0] current_address_r1, current_address_r2, current_address_r3, current_address_r4,
input [31:0] data_in_core_r1, data_in_core_r2, data_in_core_r3, data_in_core_r4,
input full_in_core_vc1_r1, full_in_core_vc2_r1, full_in_core_vc3_r1, full_in_core_vc4_r1,
input full_in_core_vc1_r2, full_in_core_vc2_r2, full_in_core_vc3_r2, full_in_core_vc4_r2,
input full_in_core_vc1_r3, full_in_core_vc2_r3, full_in_core_vc3_r3, full_in_core_vc4_r3,
input full_in_core_vc1_r4, full_in_core_vc2_r4, full_in_core_vc3_r4, full_in_core_vc4_r4,


output reset,
output [31:0] data_out_core_r1, data_out_core_r2, data_out_core_r3, data_out_core_r4,
output full_out_core_vc1_r1, full_out_core_vc2_r1, full_out_core_vc3_r1, full_out_core_vc4_r1,
output full_out_core_vc1_r2, full_out_core_vc2_r2, full_out_core_vc3_r2, full_out_core_vc4_r2,
output full_out_core_vc1_r3, full_out_core_vc2_r3, full_out_core_vc3_r3, full_out_core_vc4_r3,
output full_out_core_vc1_r4, full_out_core_vc2_r4, full_out_core_vc3_r4, full_out_core_vc4_r4
);

localparam NUMBER_OF_ROUTERS = NUMBER_OF_ROUTER_ROWS * NUMBER_OF_ROUTER_COLS;

wire gnd;
wire vdd;
assign gnd=0;
assign vdd=1;

genvar i,j,k,n;

generate
    for(i=1; i<=NUMBER_OF_ROUTERS; i=i+1)       // input [31:0] data_in_core_r1; to replace such ports
        begin  : r_dinc
               wire [31:0]data_in_core;
        end
    for(i=1; i<=NUMBER_OF_ROUTERS; i=i+1)       // output [31:0] data_out_core_r1; to replace such ports
        begin  : r_doutc
               wire [31:0]data_out_core;
        end
    for(i=1; i<=NUMBER_OF_ROUTERS; i=i+1)       // input [7:0] current_address_r1; to replace such ports
        begin  : r_addr
               wire [31:0]router_addr;
        end
    for(i=1; i<=NUMBER_OF_ROUTERS; i=i+1)       // wire data_out_link3_r1; to replace such ports
        begin  : r_dout
            for(j=1; j<=4; j=j+1)
                begin : link
                    wire [31:0]data_out_r_link;
                end
        end
     for(i=1; i<=NUMBER_OF_ROUTERS; i=i+1)      // input full_in_core_vc1_r1; to replace such ports
        begin  : r_full_i
            for(j=1; j<=4; j=j+1)
                begin : vc
                    wire [31:0] full_in_r_vc = 32'd0;
                end
        end
      for(i=1; i<=NUMBER_OF_ROUTERS; i=i+1)         // output full_out_core_vc1_r4; to replace such ports
          begin  : r_full_oc
            for(j=1; j<=4; j=j+1)
                 begin : vc
                      wire [31:0] full_o_r_vc ;
                 end
          end 
        for(i=1; i<=NUMBER_OF_ROUTERS; i=i+1)       // wire full_out_link1_vc1_r1; to replace such ports
                   begin  : r_full_ol
                     for(j=1; j<=4; j=j+1)
                          begin : vc
                            for(k=0; k<=4; k=k+1)
                                begin : link
                                    wire [31:0] full_o_r_vc_l;
                                end
                          end
                   end
endgenerate

// Rn = (i-1)*NUMBER_OF_COLS + j ie, numbering of nth router is given by this relation

generate           
        for(i=1; i<=NUMBER_OF_ROUTER_ROWS; i=i+1)
            begin : r_row
                if (i==1) 
                    begin
                        for(j=1; j<=NUMBER_OF_ROUTER_COLS; j=j+1)
                            begin : r_col                      
                                if (j==1) 
                                    begin
                                        //instantiate here for top-left corner

                                    end     
                                else if (j == NUMBER_OF_ROUTER_COLS)
                                    begin
                                        //instantiate here for top-right corner 

                                    end
                                else
                                    begin
                                        //instantiate here for upper-most edge

                                    end  
                         end
                  end     
                else if (i == NUMBER_OF_ROUTER_ROWS)
                    begin
                        begin
                            for(j=1; j<=NUMBER_OF_ROUTER_COLS; j=j+1)
                                begin : r_col
                                    if (j==1) 
                                        begin
                                            //instantiate here for bottom-left corner

                                        end     
                                    else if (j == NUMBER_OF_ROUTER_COLS)
                                        begin
                                           //instantiate here for bottom-right corner 

                                        end
                                    else
                                        begin
                                          //instantiate here for lower-most edge

                                        end  
                                end 
                    end
                end

                else
                    begin
                        begin
                            for(j=1; j<=NUMBER_OF_ROUTER_COLS; j=j+1)
                                begin : r_col
                                    if (j==1) 
                                        begin
                                            //instantiate here for leftmost edge routers

                                        end     
                                    else if (j == NUMBER_OF_ROUTER_COLS)
                                        begin
                                           //instantiate here for rightmost edge routers

                                        end
                                    else
                                        begin
                                           //instantiate here for central routers

                                        end  
                           end 
                    end

               end
         end 
endgenerate

    endmodule         

Я использовал Vivado 2018.1 для написания этого кода. Он не жалуется на какую-либо синтаксическую ошибку, но выдает ошибку во время моделирования.

Любая помощь будет принята с благодарностью. Спасибо


person Vasanth    schedule 04.02.2019    source источник
comment
Как вы смоделировали это? нет испытательного стенда. Не уверен, что это имеет значение, но у вас есть дополнительные блоки begin..end в последних двух предложениях else.   -  person Serge    schedule 05.02.2019
comment
Какой номер строки вызывает ошибку?   -  person Oldfart    schedule 05.02.2019
comment
@Oldfart во втором блоке генерации выражение в двух циклах for (вложенных с i и j) не может быть оценено как константа.   -  person Vasanth    schedule 05.02.2019
comment
@Серж Я не использовал тестовый стенд. Я просто нажал запустить симуляцию в вивадо. Раньше открывалось пустое окно без ошибок, а теперь выдает ошибку.   -  person Vasanth    schedule 05.02.2019


Ответы (1)


Я понял проблему. видимо, макрос не работал должным образом (не знаю почему) и текст 'n' не заменялся. поэтому из-за неопределенного символа выражения в цикле for не могли быть вычислены. Просто заменил все экземпляры n на ((i-1)*NUMBER_OF_ROUTER_COLS + j), и все заработало.

Тем не менее, кто-нибудь может объяснить, почему макрос не сработал?

РЕДАКТИРОВАТЬ: благодаря @Oldfart. Пробел вокруг «+» вызывал проблему.

person Vasanth    schedule 05.02.2019
comment
Потому что в нем есть место? - person Oldfart; 05.02.2019
comment
@Oldfart Нет, между текстом макроса и его значением должен быть пробел. - person Vasanth; 05.02.2019
comment
Я имею в виду пробелы вокруг "+" - person Oldfart; 05.02.2019