Verilog Generate if语句无法计算为常量值
我试图生成一个可变长度的路由器网格(每个路由器都是一个模块),可以使用两个参数指定。虽然模块的i/o端口数量是固定的,但连接是在内部生成的,并适当地连接到i/o。我已成功生成所有端口,但无法生成路由器。Verilog编译器引发错误: 无法将条件表达式解析为常量 错误在于路由器的产生。无法计算两个for循环中的表达式,因此无法计算条件。我试着把所有的东西都放在一个总是阻塞的地方,但是没有运气 代码如下:Verilog Generate if语句无法计算为常量值,verilog,vivado,Verilog,Vivado,我试图生成一个可变长度的路由器网格(每个路由器都是一个模块),可以使用两个参数指定。虽然模块的i/o端口数量是固定的,但连接是在内部生成的,并适当地连接到i/o。我已成功生成所有端口,但无法生成路由器。Verilog编译器引发错误: 无法将条件表达式解析为常量 错误在于路由器的产生。无法计算两个for循环中的表达式,因此无法计算条件。我试着把所有的东西都放在一个总是阻塞的地方,但是没有运气 代码如下: `timescale 1ns / 1ps `define n ((i-1)*NUMBER_
`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
`时间刻度为1ns/1ps
`定义n((i-1)*路由器的数量\u COLS+j)
模块顶部路由器(参数行数=2,路由器列数=2)(
输入时钟,clr,
输入[7:0]当前地址\u r1、当前地址\u r2、当前地址\u r3、当前地址\u r4,
输入[31:0]核心r1中的数据,核心r2中的数据,核心r3中的数据,核心r4中的数据,
在核心vc1中输入完整,核心vc2中输入完整,核心vc3中输入完整,核心vc4中输入完整,
在核心vc1中输入完整,核心vc2中输入完整,核心vc3中输入完整,核心vc4中输入完整,
在堆芯vc1中输入完整堆芯,在堆芯vc2中输入完整堆芯,在堆芯vc3中输入完整堆芯,在堆芯vc4中输入完整堆芯,
在核心vc1\U r4中输入完整,核心vc2\U r4中输入完整,核心vc3\U r4中输入完整,核心vc4中输入完整,
输出复位,
输出[31:0]数据输出核心r1,数据输出核心r2,数据输出核心r3,数据输出核心r4,
输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出,
输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出,
输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出,
输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出完整输出
);
localparam路由器数=路由器行数*路由器列数;
导线接地;
导线vdd;
分配gnd=0;
分配vdd=1;
genvarⅠ,j,k,n;
生成
for(i=1;i我解决了问题。显然,宏工作不正常(不知道为什么),文本“n”没有被替换。因此,由于未定义的符号,for循环中的表达式无法计算。只需将n
的所有实例替换为((i-1)*NUMBER\u of_ROUTER\u COLS+j)
而且它的效果很好
不过,有人能解释为什么宏不起作用吗
编辑:
多亏了@Oldfart,“+”周围的空格导致了问题。我解决了问题。显然,宏工作不正常(不知道为什么)而且文本“n”没有被替换。因此,由于未定义的符号,for循环中的表达式无法计算。只需将n
的所有实例替换为((i-1)*NUMBER\u of_ROUTER\u COLS+j)
,效果非常好
不过,有人能解释为什么宏不起作用吗
编辑:
多亏了@Oldfart.“+”周围的空格导致了问题。您是如何模拟的?没有测试台。不确定这是否有任何区别,但您在最后2个else
子句中有额外的开始
。结束
块。生成错误的行号是什么?@Oldfart在第二个生成bl中ock,两个for循环(带i和j的嵌套循环)中的表达式无法计算为常量。@Serge我没有使用测试台。我只是单击了“运行模拟”在vivado中。它过去打开空白窗口时没有错误,但现在抛出错误。您是如何模拟的?没有测试台。不确定这是否有任何区别,但您在最后2个else
子句中有额外的begin
。end
块。生成错误的行号是什么?@Oldfart在se中cond generate block,两个for循环(带i和j的嵌套循环)中的表达式无法计算为常量。@Serge我没有使用测试台。我只是单击了“运行模拟”在vivado中。它过去打开空白窗口时没有错误,但现在抛出错误。因为其中有空格?@Oldfart否,宏文本与其值之间应该有空格。我指的是“+”周围的空格,因为其中有空格?@Oldfart否,宏文本与其值之间应该有空格。我指的是空格ar环绕“+”键