使用相同的代码访问两个实例,而无需为每个实例重复

时间:2018-12-10 12:54:47

标签: verilog system-verilog

我有两个名为(inst_1和inst_2)的实例,我想用相同的代码对两个实例进行操作,而不必为每个实例重复执行该代码。

那么我该怎么做(用于循环或条件)或做任何事情呢? 下一张照片中的instance_1被标记为黄色。 我想将其更改为instance_2而不重复代码。

这是我的代码的图像 enter image description here

2 个答案:

答案 0 :(得分:1)

您不能在Verilog / SystemVerilog中遍历标识符名称。如果您使用generate-for循环实例化了两个实例,那么您可能已经可以在此代码中使用类似的generate-for

我能想到的最好的选择是将您的代码变成一个巨大的宏,然后为每个实例调用该宏。

有多种方法可以使用PLI / VPI C接口通过字符串查找来访问标识符,但是这种方法太复杂了,无法在这里找到。

答案 1 :(得分:1)

有几种方法可以实现您的期望,尽管它们都不是一件好事。 Verilog并非旨在做到这一点。

1)使用dave_59的建议:制作一个巨大的宏并将实例名称作为参数传递。它将起作用,但是调试此怪物时会遇到问题。

`define MONSTER(INST_NAME) ... tb.INST_NAME.....\
    ...tb.INST_NAME...\
    ...

module top1;
`MONSTER(inst_1)
endmodule
module top2;
`MONSTER(inst_2)
endmodule

2)定义在include语句中使用这段代码,将实例名称定义为宏:

module top1;
`define INSTANCE inst_1
`include "monster_piece.v"
endmodule
module top2;
`define INSTANCE inst_2
`include "monster_piece.v"
endmodule

其中monster_piece.v包含您的代码,其中带有`INSTANCE'。此方法存在维护问题,某些工具可能存在调试问题。

3)最好的方法是对测试台进行不同的组织:

  • 使用generate块在tb中实例化实例,然后可以在代码中使用它们。
  • 您也许可以重写您的TB以使用虚拟接口 或动态类而不是实例。