Я пытался создать сетку маршрутизаторов (каждый маршрутизатор представляет собой модуль) переменной длины, которую можно указать с помощью двух параметров. в то время как количество портов ввода/вывода фиксировано для модуля, соединения генерируются внутри и подключаются соответствующим образом к вводу/выводу. Я успешно сгенерировал все порты, но не смог сгенерировать маршрутизаторы. Компилятор 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 для написания этого кода. Он не жалуется на какую-либо синтаксическую ошибку, но выдает ошибку во время моделирования.
Любая помощь будет принята с благодарностью. Спасибо
begin
..end
в последних двух предложенияхelse
. - person Serge   schedule 05.02.2019