例如,我有下面的代码。我们可以在可合成的verilog中分配生成块内的连线吗?我们可以在可合成的verilog中使用generate块内的assign语句吗?
genvar i;
generate
for (i = 0; i < W; i=i+1) begin:m
wire [2:0] L;
assign L[1:0] = { a[i], b[i] };
end
endgenerate
答案 0 :(得分:1)
是。有可能的。 generate语句只是合成器的代码生成器指令。基本上,它只是循环展开。这是循环可以静态阐述的。也就是说,循环执行的次数应该在编译时可以确定。
genvar i;
generate
for (i = 0; i < 2 ; i++) {
assign x[i] = i;}
endgenerate
unrolls into
assign x[0] = 0;
assign x[1] = 1;
答案 1 :(得分:0)
在可合成的Verilog中,可以在生成块内使用assign语句。所有生成块都模仿多个瞬间。但要小心,因为就像for循环一样,它可能在空间方面非常大。
答案 2 :(得分:0)
您可以在生成参数中使用assign,这有助于参数化挂钩模块
原始代码存在一些问题:L
定义了多次,只分配了3位中的2位
genvar i;
generate
for (i = 0; i < W; i=i+1) begin:m
wire [2:0] L;
assign L[1:0] = { a[i], b[i] };
end
endgenerate
可以更改为:
localparam W = 4;
reg [W-1:0] a;
reg [W-1:0] b;
wire [1:0] L [0:W-1];
genvar i;
generate
for (i = 0; i < W; i=i+1) begin:m
assign L[i] = { a[i], b[i] };
end
endgenerate
此处L[i]
选择L的第i wire [1:0]
部分。a[i]
和b[i]
是位选择。