Я читал кулинарную книгу UVM и запутался в виртуальном интерфейсе между монитором, драйвером и их BFM. Означает ли это, что может быть несколько драйверов или мониторов, или это не зависит от интерфейса, который не знает ни своего монитора, ни драйвера. Кто-нибудь может помочь?
Виртуальный интерфейс между монитором/водителем и их BFM ??? Что они собой представляют, может кто-нибудь объяснить?
Ответы (2)
Ключевое слово virtual
повторно используется несколько раз в SystemVerilog. Интерфейс является виртуальным в том смысле, что его иерархический путь задается во время выполнения путем передачи его через переменную. Все остальные соединения в Verilog/SystemVerilog являются фиксированными путями.
Это действительно позволяет вам иметь несколько экземпляров одного и того же кода драйвера, подключаемых к нескольким экземплярам интерфейса. Это также помогает в повторном использовании блоков в системе, поэтому вы можете изменить иерархический путь по мере того, как интерфейс углубляется на уровень вашей системы.
Verilog создавался не как язык программирования, более того, он не подходил для объектно-ориентированного программирования. С другой стороны, язык испытательного стенда System Verilog создавался как объектно-ориентированный язык программирования.
Одна из проблем заключается в том, чтобы семантически связать HDL verilog с TB. Все объекты Verilog HDL/RTL компилируются статически и не могут управляться динамически (что необходимо в TB). Вы не можете получить указатели на модули, переменные и т. д. (ну, кроме как через какой-то черный механизм PLI).
Итак, System Verilog придумал конструкцию interface
, которая была задумана как объект подключения в мире RTL. Он похож на module
в том смысле, что это статический объект времени компиляции. Но SV также добавил трюк, который позволяет вам иметь ссылку на interface
. Трюк называется virtual interface
.
С точки зрения программиста вы можете думать об этом как о ссылке или указателе на объект статического интерфейса. Это дает вам возможность передать эту ссылку другому классу TB или создать несколько ссылок на один и тот же интерфейс.
Вот схематический пример:
class Transaction;
virtual dut_if trans; // <<< virtual interface
function new(virtual dut_if t);
trans = t; // <<<< assign it to trans
endfunction // new
endclass // Transaction
// definition of the interface
interface dut_if import trans_pkg::*;
(input trans_t trans);
endinterface
// instantiate the interface in module 'rtl'
bind rtl dut_if dut_if(data);
program tb;
// pass it to the constructor as a virtual interface pointer.
Transaction trans1 = new (rtl.dut_if);
Transaction trans2 = new (rtl.dut_if);
endprogram // tb