位于Verilog generate块内声明电线的问题

4

generate块中,我有多个if语句。如果我在第一个if语句中声明了一个wire,我就不能在其他if语句中使用它。

看看我模块的以下简化示例:

module my_module 
#(parameter integer NUM_X_PORTS = 1,
  parameter integer NUM_Y_PORTS = 1)
 (
  // port declarations
 );

generate 

  if (NUM_X_PORTS > 0) begin
    wire [NUM_X_PORTS-1:0] x1;
    // logic filled in here
  end

  if (NUM_Y_PORTS > 0) begin
    wire [NUM_Y_PORTS-1:0] y1;
    // logic filled in here
  end

  if ((NUM_X_PORTS > 0) && (NUM_Y_PORTS > 0)) begin
    for (i=0; i<NUM_Y_PORTS; i=i+1) begin
      assign z[i] = y1[i] & |x1; // I can't use x1 and y1 here
    end

endgenerate

但是它们在之前生成的if语句中已经被声明了——问题出在哪里呢?

1个回答

9

电线x1y1是在作业范围之外定义的。其中一个解决方案是添加并引用作用域标签:

if (NUM_X_PORTS > 0) begin : scope_x1
  wire [NUM_X_PORTS-1:0] x1;
  // logic filled in here
end

if (NUM_Y_PORTS > 0) begin : scope_y1
  wire [NUM_Y_PORTS-1:0] y1;
  // logic filled in here
end

if ((NUM_X_PORTS > 0) && (NUM_Y_PORTS > 0)) begin : scope_z
  for (i=0; i<NUM_Y_PORTS; i=i+1) begin : scopes_z_i_ // loop has unique scope
    // x1 & y1 accessed by scope label found by its parent
    assign z[i] = scope_y1.y1[i] & |scope_x1.x1; 
  end
end

为了使该任务正常工作,x1y1的声明必须存在于scope_2或其父级作用域中。
if ((NUM_X_PORTS > 0) && (NUM_Y_PORTS > 0)) begin  : scope_z
  wire [NUM_X_PORTS-1:0] x1;
  wire [NUM_Y_PORTS-1:0] y1;
  // logic filled in here
  for (i=0; i<NUM_Y_PORTS; i=i+1) begin : scopes_z_i_ // loop has unique scope
    assign z[i] = y1[i] & |x1; // everything is withing scope_z
  end
end

在这两种情况下,x1y1的范围是有限制的。如果您不希望当其相应的NUM_*_PORTS > 0为false时电线存在,则必须遵循第一个示例。
有关生成构造,请参见IEEE Std 1800-2012 § 27。Generate constructs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接