Как передать переменную в макрос определения, используемый для доступа к пути в системном verilog
Я использую макрос определения, чтобы установить путь для модуля, то есть `define DUT_PATH(CH) dut_top.u_channel_```CH``_mode
и используя этот макрос определения в модуле, где мы передаем номер канала,
модуль channel_oper # (int channel_num = 0) (входная логика addr_base;);
assign addr_base = `DUT_PATH (channel_num).addr_base;
endmodule
В верхнем файле мы называем модуль как
channel_oper(3); //channel_oper(channel_num)
где я ожидаю, что выход addr_base будет dut_top.u_channel_3_mode.addr_base, но я получаю значение, назначенное как dut_top.u_channel_ channel_num _mode.addr_base, и ошибка перекрестной разыменования.
Можете ли вы предоставить мне решение или какие-либо предложения для этого, чтобы использовать параметризованную переменную для определения макроса.
В этом случае не может использоваться genvar или генерировать блок, так как он не используется для каких-либо манипуляций. Это используется для доступа к другому пути для другого номера канала, и мы передаем номер канала из верхнего модуля. Операция канала модуля берет номер канала из параметра и переходит на этот конкретный путь канала и принимает переменный.
1 ответ
Вот пример, который может работать в некоторых случаях (работает в synopsys vcs/system verilog). Он генерирует имя экземпляра для каждого канала, но в несколько иной форме. Он автоматически вставляет [num] из итерации цикла, а также вставляет дополнительную иерархию для оператора 'if', я назвал его 'number'. Вам также необходимо знать максимальное количество каналов, чтобы правильно организовать цикл.
module top;
mod#(1) mod1();
mod#(4) mod2();
endmodule // top
module mod#(int P = 0);
for (genvar i = 0; i < 10; i++) begin: channel
if (i == P) begin:number
mx mx();
end
end
endmodule
module mx;
initial
$display("%m");
initial #2 $finish;
endmodule // mx
Теперь вот списки экземпляров 'mx':
top.mod1.channel[1].number.mx
top.mod2.channel[4].number.mx