For loop 在Verilog循环中使用多个genvar
是否可以在循环中使用不同的“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 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
alocalparam
从带有函数的genvars派生,并按照最初的意图使用k
getk
函数基本上从generate
块重新创建循环,这似乎违反了代码重用的原则,但是getk
允许每个展开的循环迭代从genvarsi
和j
派生不可变的localparamk
。没有在所有展开的循环中跟踪的单独累积变量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