For loop 在Verilog循环中使用多个genvar

For loop 在Verilog循环中使用多个genvar,for-loop,syntax,syntax-error,verilog,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

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

我喜欢这个问题,因为除非对generates非常熟悉,否则它看起来应该可以工作,但是有一个genvar试图使用额外的genvar

不允许使用该语法,因为生成的内容是如何展开的。整数只能在always/initial进程内使用

如果只是组合布线而不是参数化实例化,您可能只需要使用整数就可以完成所需的操作(我通常不建议这样做):

整数i;
整数j;
整数k;
localparam N=2;
注册号[N*N:0]a;
注册号[N*N:0]in;
注册号[N*N:0]p;
总是开始
k=0;
for(i=0;ii)开始
a[i+j*N]=in[i]&p[k];
k=k+1;
结束
结束
结束
结束

不确定合成会是什么样子,但赋值是静态的,它可能会工作。

当你想对
genvar
循环进行更高级的数学运算时,可以避免
总是@*
。使用
localparam
函数

使
k
a
localparam
从带有函数的genvars派生,并按照最初的意图使用
k

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

(请注意,原始示例也可以使用
j=i+1
进行优化,但派生
k
仍然存在问题)

moduletop();
localparam N=4;
函数自动整数getk;
输入整数istop;
输入整数jstop;
整数i,j,k;
开始
k=0;

对于(i=0;i@Morgan我修改了问题Morgan——我只是在这里添加了一个答案。我在创建Verilog方面缺乏经验,不知道避免
总是@*
——除了“嘿,整洁的技巧”之外还有什么实际意义。这有必要/有用吗?我认为这是一个更好的解决方案,用于生成静态值(localparam)。如果你想创建一个赋值映射,即组合逻辑,你需要
赋值
始终@*
@Morgan-谢谢。我大部分都做过图解->结构verilog工作。我玩
生成
,因为我有一种图解导向的思维方式。但我觉得我过度使用了它,并且创建了太多的elabo组合功能的费率结构(层次结构+线路),通过
始终
和特定的灵敏度列表可以更简单。
Syntax error near "=". (k=k+1)
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 
module top();

localparam N=4;

function automatic integer getk;
  input integer istop;
  input integer jstop;
  integer i,j,k;
  begin
    k=0;
    for (i=0; i<=istop; i=i+1) begin: firstfor
      for (j=i+1; j<((i==istop)? jstop : N); j=j+1) begin: secondfor
        k=k+1;
      end
    end
    getk=k;
  end
endfunction

genvar i,j;
generate
  for (i = 0; i < N; i = i + 1) begin: firstfor
    for (j = i+1; j < N; j = j + 1) begin: secondfor
      localparam k = getk(i,j);           
      initial $display("Created i=%0d j=%0d k=%0d",i,j,k);
    end
  end
endgenerate

endmodule
$ 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