Есть несколько способов достичь желаемого, хотя ни один из них не является хорошим.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) определите использование этого фрагмента кода в операторе включения, определите имя экземпляра как макрос:
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) лучший способ - организовать тестовый стенд по-разному:
- использовать генерацию блоков для создания экземпляров ваших экземпляров в tb, затем вы можете использовать их в своем коде.
- вы можете переписать ваш TB, чтобы использовать виртуальные интерфейсы или динамические классы вместо экземпляров.