是否可以在循环中使用不同的“genvar”?是否有其他模式可以实现它?
我尝试这个例子:
genvar i;
genvar j;
genvar k;
generate
k=0;
for (i = 0; i < N; i = i + 1)
begin: firstfor
for (j = 0; j < N; j = j + 1)
begin: secondfor
if(j>i)
begin
assign a[i+j*N] = in[i] && p[k];
k=k+1;
end
end
end
endgenerate
当我运行“检查语法”时,显示以下错误:
Syntax error near "=". (k=k+1)
答案 0 :(得分:1)
我喜欢这个问题,因为除非非常熟悉生成它看起来应该有效,但是有a similar question尝试使用额外的genvar。
由于生成的展开方式,不允许使用语法。整数只能在always / initial进程中使用。
如果它只是组合布线而不是参数化实例化,那么你可能只需要使用整数来做你需要的东西(我通常不建议这样做):
integer i;
integer j;
integer k;
localparam N = 2;
reg [N*N:0] a ;
reg [N*N:0] in ;
reg [N*N:0] p ;
always @* begin
k=0;
for (i = 0; i < N; i = i + 1) begin: firstfor
for (j = 0; j < N; j = j + 1) begin: secondfor
if(j>i) begin
a[i+j*N] = in[i] && p[k];
k=k+1;
end
end
end
end
不确定综合会如何,但分配是静态的,它可能会有效。
答案 1 :(得分:1)
当您想要使用always @*
循环进行更高级的数学运算时,可以避免genvar
。使用localparam
和function
。
使k
使用函数从genvars派生localparam
,并按原定使用k
。
getk
函数似乎违反了代码重用的原则,基本上是从generate
块重新创建循环,但是getk
允许每个展开的循环迭代派生出不可变的localparam {{来自genvars k
和i
的1}}。在所有展开的循环中没有跟踪单独的累积变量j
。 k
和iverilog
都对此感到满意。
(请注意,原始示例也可以使用ncvlog
进行优化,但导出j=i+1
仍然存在问题。)
k
输出:
$ iverilog tmptest.v $ ./a.out Created i=0 j=1 k=0 Created i=0 j=2 k=1 Created i=0 j=3 k=2 Created i=1 j=2 k=3 Created i=1 j=3 k=4 Created i=2 j=3 k=5
我发现了使用函数从genvars中获取值的'技巧': https://electronics.stackexchange.com/questions/53327/generate-gate-with-a-parametrized-number-of-inputs