在verilog中声明的导线问题会生成块

时间:2014-03-05 14:31:46

标签: declaration verilog

generate块中,我有多个if语句。当我在第一个if语句中声明一个连线时 - 我不能在其他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

来自VCS和nLint的错误消息是尚未声明标识符x1和y1。

但是它们已在之前生成的if语句中声明 - 这里有什么问题?

1 个答案:

答案 0 :(得分:7)

电线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为假时存在,那么您必须遵循第一个示例。

有关生成的更多信息,请参阅IEEE Std 1800-2012§27生成构造