在Verilog循环中使用多个genvar

时间:2013-12-23 22:38:49

标签: for-loop syntax syntax-error verilog

是否可以在循环中使用不同的“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)

2 个答案:

答案 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。使用localparamfunction

使k使用函数从genvars派生localparam,并按原定使用k

getk函数似乎违反了代码重用的原则,基本上是从generate块重新创建循环,但是getk允许每个展开的循环迭代派生出不可变的localparam {{来自genvars ki的1}}。在所有展开的循环中没有跟踪单独的累积变量jkiverilog都对此感到满意。

(请注意,原始示例也可以使用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