У меня есть несколько блоков, разработанных другим человеком (core.sv и другие), которые я не могу изменить, и мне нужно значение для двух разных файлов.
Могу ли я создать экземпляр «core.sv» в обоих (riscv_top_tb.sv и tracelog.sv)?
Это мой файл TestBench: riscv_top_tb.sv
genvar r;
generate
for (r = 1; r < 32; r++) begin : gen_mprf_assign
assign rv_vip_rf_if.x[r] = RISK_V.bancoDeRegistros.bancoReg[r];
end : gen_mprf_assign
endgenerate
//------------------------------------------------------------------------------
// Core instance
//------------------------------------------------------------------------------
core #(.RamSize(RamSize)) RISK_V
(
.CLK(CLK),
.RESET_N(RESET_N),
.IMEM_DIR(dir_rom),
.IMEM_DATA(data_rom),
.DMEM_DIR(dir_ram),
.DMEM_DATA_R(dataR_ram),
.DMEM_DATA_W(dataW_ram),
.I_READ(I_READ),
.D_READ(D_READ),
.D_WRITE(D_WRITE)
);
А это мой файл журнала трассировки: tracelog.sv
core #(.RamSize(RamSize)) RISK_V
(
.CLK(CLK),
.RESET_N(RESET_N),
.IMEM_DIR(dir_rom),
.IMEM_DATA(data_rom),
.DMEM_DIR(dir_ram),
.DMEM_DATA_R(dataR_ram),
.DMEM_DATA_W(dataW_ram),
.I_READ(I_READ),
.D_READ(D_READ),
.D_WRITE(D_WRITE)
);
assign mprf_int_alias.INT_00_ZERO = '0;
assign mprf_int_alias.INT_01_RA = RISK_V.bancoDeRegistros.bancoReg[1];
assign mprf_int_alias.INT_02_SP = RISK_V.bancoDeRegistros.bancoReg[2];
Если это невозможно, как мне это сделать?
Кроме того, вы не создаете экземпляры файлов, вы создаете экземпляры модулей. Каждый экземпляр модуля копирует все объявления внутри этого модуля.





Я не уверен, что вы пытаетесь сделать, но очень похоже, что вы пытаетесь скопировать файл как в TB, так и в tracelog. В этом случае вы можете просто сделать
`include "risk_v_instantiation.sv"
где в файле "risk_v_instantiation.sv" есть текст:
core #(.RamSize(RamSize)) RISK_V
(
.CLK(CLK),
.RESET_N(RESET_N),
.IMEM_DIR(dir_rom),
.IMEM_DATA(data_rom),
.DMEM_DIR(dir_ram),
.DMEM_DATA_R(dataR_ram),
.DMEM_DATA_W(dataW_ram),
.I_READ(I_READ),
.D_READ(D_READ),
.D_WRITE(D_WRITE)
);
Вам все еще нужно обрабатывать объявления сигналов, которые вы можете добавить в этот файл.
Вы не можете нигде создать экземпляр файл. Вы можете создать экземпляр модуль. Модуль может быть создан внутри другого модуль. Таким образом вы создаете иерархия модуля экземпляры.
Всегда есть модуль (модули) верхнего уровня, который не создается ничем другим и не определяется другими средствами. Ваша иерархия начинается с этого модуля и разветвляется на другие экземпляры.
Testbench обычно создается как часть этой иерархии (хотя у него может быть и своя вершина).
Вы можете создать экземпляр одного и того же модуля в разных иерархиях или несколько раз в одной и той же иерархии (с разными именами экземпляров).
Из тестового стенда вы можете получить доступ к переменным в любой части иерархии, используя кросс-модульные ссылки (xmr). Вам просто нужно указать иерархический путь к интересующему вас экземпляру.
Итак, отвечая на ваш вопрос: да, вы можете создавать экземпляры одного и того же coreмодуль в разных иерархиях. Однако будет 2 разных экземпляра на разных уровнях иерархии со своими входами, выходами, переменными и параметрами. У них будут разные пути к экземплярам (несмотря на то, что вы называете локальные экземпляры одинаковыми) и потребуются разные пути доступа xmr к их внутренним компонентам.
В чем конкретно проблема с этим кодом? Обычно вы должны иметь возможность создавать столько экземпляров, сколько хотите.