我正在尝试在verilog中创建一个多阶段比较器,我无法弄清楚如何在单个生成循环中增加多个genvars。我正在尝试以下方法:
genvar i,j;
//Level 1
generate
j=0;
for (i=0;i<128;i=i+1)
begin: level1Comp
assign ci1[i] = minw(tc[j],tc[j+1]);
j = j+2;
end
endgenerate
收到以下错误:
Error-[SE] Syntax error
Following verilog source has syntax error :
"encoder.v", 322: token is '='
j=0;
任何人都知道如何在同一个生成语句中增加多个genvars?或者至少得到相同的功能?
答案 0 :(得分:12)
任何人都知道如何在同一个生成中增加多个genvars 声明?
这是不允许的,因为generate for循环为循环变量创建一个隐式的localparam语句,并仅根据该localparam详细说明循环中的项。这意味着如果genvar被声明为localparam,则循环内的任何项必须在循环外有效。
genvar i,j;
//Level 1
generate
j=0;
for (i=0;i<128;i=i+1)
begin: level1Comp
assign ci1[i] = minw(tc[j],tc[j+1]);
j = j+2;
end
endgenerate
变为
//Done for each value of i
genvar j;
localparam integer i = i_for_each_iteration;
j=0; //Not valid outside a procedural context so modelsim complains
assign ci1[i] = minw(tc[j],tc[j+1]);
j = j+2; //Also not valid outside a procedural context
在这种情况下,你可以创建一个常数&#39;值使用循环内部的显式参数依赖于genvar。
genvar i;
//Level 1
generate
for (i=0;i<128;i=i+1)
begin: level1Comp
localparam integer j = i*2;
assign ci1[i] = minw(tc[j],tc[j+1]);
end
endgenerate
答案 1 :(得分:5)
假设ci1
的深度为tc
的一半,您可以说ci1[0] = min(tc[0], tc[1])
,ci[1] = min(tc[2], tc[3])
等,以下内容应该有效:
module st_genvar();
int ci1 [0:127];
int tc [0:255];
function int minw(int i1, int i2);
if(i1 < i2 )
minw = i1;
else
minw = i2;
endfunction
genvar i;
//Level 1
generate
for (i=0;i<128;i=i+1)
begin: level1Comp
assign ci1[i] = minw(tc[i*2],tc[i*2+1]);
end
endgenerate
endmodule