2014-12-19 5 views
0

Скажем, у меня есть чекер, который достигает $ root.i_dut и проверяет там некоторые сигналы. Тривиальный пример:Как подключить контролер к произвольному экземпляру?

module CheckOverflow(input logic clk); 
    assert property (@(posedge clk) $root.i_dut.overflow == 1'b0); 
endmodule 

Что делать, если я хочу использовать эту проверку в испытательном стенде, где вещь, которую я хочу, чтобы проверить, не обязательно инстанцирован как «$ root.i_dut»? Есть ли способ, скажем, передать ссылку на экземпляр на экземпляр проверки?

Кажется, что UVM решает эту проблему, используя интерфейсы. Мне интересно знать, есть ли способ сделать это, просто используя ссылки, а не интерфейсы.

ответ

2

В этом случае вы можете использовать bind. Это позволяет создать экземпляр вашей проверки в любом месте иерархии.

Прежде всего, необходимо сделать переливной сигнал входа вместо того, чтобы полагаться на иерархическом пути:

module CheckOverflow(input bit clk, input logic overflow); 

В вашем верхнем тестбенче уровня вы бы добавить:

bind dut_module_name CheckOverflow assertions(
    .clk(<name of the clock signal in the DUT>), 
    .overflow(overflow) 
); 

Это приведет к тому, который должен быть создан в модуле DUT с именем утверждениями и подключиться к указанным сигналам DUT без необходимости изменения кода DUT.

Рабочий стол можно найти на EDAPlayground.

+0

Я попробую, хотя синтаксис выглядит наоборот по сравнению с примерами в SystemVerilog LRM 3.1a, раздел 17.15 (который довольно тонкий). Любые указатели на лучшую документацию, описывающие правильное использование «привязки»? –

+0

@JonathanMayer Это может быть неправильно, я не знаю его наизусть, и я не открыл LRM. Не стесняйтесь исправить это после того, как вы заработаете. Обычно я ищу такие вещи в Google, и я заканчиваю сайтами asicworld.com или testbench.in –

Смежные вопросы