在可综合的verilog中,我们可以在generate块中使用assign语句吗?

时间:2014-01-13 03:22:38

标签: verilog

例如,我有下面的代码。我们可以在可合成的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

3 个答案:

答案 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]是位选择。