Verilog:在分层路径中循环实例



这是代码片段:我正在尝试在寄存器中加载一个文本文件(256 行,32 个二进制值)。但我的寄存器是分层设计的。所以我正在尝试执行以下循环:

 reg [31:0] data [ 0:255];   
initial $readmemb("vectors.txt", data);
generate
      for ( j=0;j<32;j=j+1) begin: BLOCK
         assign  ITR_MAC_AF.IAF.IREG3_31_.IREG2_7_.IREG[j]=data[0];     
      end
   endgenerate

但它不喜欢循环遍历实例。对此有什么解决方法吗?我有 32 个IREG_3实例,每个 IREG3 有 8 个 IREG2,每个 IREG 内部有 32 个闩锁。

谢谢。

如果网表创建了像 IREG3_0_IREG3_1_ 、...IREG3_31_,没有办法创建访问 _ NNN_ 部分的循环语句。你不妨用IREG3_dog_IREG3_milk_,...以命名索引。

您需要让您的网络列表保留实例数组,以便您可以作为嵌套的 for 循环进行访问。或者,您可能需要手动编写网表。

您可能可以使用生成块实现类似的东西。虽然它看起来会和你所拥有的有点不同。生成块创建包含索引的块名称,这些索引可以从其他生成块引用。

下面的示例分层实例化 regA 和 regB。 后者包含变量 REG。下面的代码以分层方式初始化 REG(使用 initial 块)。初始化和顶部实例化在模块 top 中完成。您可以编译它并查看结果。

顺便说一句,如果您在系统验证模式下编译,则可以摆脱generate/endgenerate关键字并使用i++语法。

module top();
  regTOP regTOP();
  genvar i, j, k;
  generate
    for (i = 0; i < 3; i = i + 1) begin
      for (j = 0; j < 3; j = j + 1) begin
        for (k = 0; k < 3; k = k + 1) begin
          initial regTOP.R[i].regA.R[j].regB.REG[k] = (i << 4) | (j << 2) | k;
        end
      end
    end
  endgenerate
endmodule
module regA();
  genvar i;
  generate
    for(i = 0; i < 3; i = i + 1) begin: R
      regB regB();
    end
  endgenerate
endmodule
module regB();
  integer i;
  reg[6:0] REG[3:0];
  always @*
    for (i=0; i < 3; i = i + 1)
      $display("%m: reg[%0d]=%0d", i, REG[i]);
endmodule
module regTOP();
  genvar i;
  generate
    for (i = 0; i < 3; i = i + 1) begin: R
      regA regA();
    end
  endgenerate
endmodule

相关内容

  • 没有找到相关文章