Предполагая, что вы намерены следующее:
genvar i;
generate
for(i=0; i<45; i=i+1) begin : gen_asrt
bind dut assertion a1(.a(in_bus[i]), .b(out_bus[i]), .*);
end
Это не будет работать по 2 причинам:
имя экземпляра a1
сбрасывается на каждый цикл. Каждое имя экземпляра в модуле должно быть уникальным. Цитируя IEEE std 1800-2012 § 23.11 «Binding вспомогательный код прицелы или экземпляры»:
Это законно более чем один bind
заявление связать bind_instantiation в той же целевой области. Однако для bind_instantiation должно быть ошибкой ввести имя экземпляра, которое сталкивается с другим именем в пространстве имен модулей целевой области (см. 3.13). Это относится как к уже существующим именам, так и именам экземпляров, введенным другими операторами bind
. Последняя ситуация возникнет, если в проекте содержится более одного экземпляра модуля, содержащего оператор bind
.
i
в операторе привязки ссылается на i
имя переменной в пределах объема dut
, а не genvar i
. Опять же, цитата из IEEE std 1800-2012 § 23.11 «Binding вспомогательного кода для областей или экземпляров»:
Когда экземпляр связан в целевой область видимости, эффект будет, как если экземпляр присутствовал в самом конце мишени объем. Другими словами, все объявления, присутствующие в целевой области или импортируемые в целевую область, видны связанному экземпляру. Импортируемые в область видимости кандидаты на импорт подстановочных знаков видны, но оператор привязки не может вызвать импорт кандидата подстановочного знака. Объявления, представленные или импортированные в $unit
, не отображаются в инструкции привязки.
Как связать этот вид проверки:
Вы можете создать один модуль, который обрабатывает генерировать заявления, а затем создать экземпляр этого модуля с привязкой заявлением. Пример:
module bind_assertions #(parameter SIZE=1) (input clock, input [SIZE-1:0] a,b);
genvar i;
generate
for(i=0; i<SIZE; i=i+1) begin : gen_asrt
assertion a1_even(.a(a[i]), .b(b[i]), .*);
end
endgenerate
endmodule
bind dut bind_assertions#(45) a1(.a(in_bus), .b(out_bus), .*);
Технически вы можете связать массив экземпляров. Это юридический синтаксис в соответствии с & секция 23.11's Синтаксис 23-9 плюс Приложение A.4.1.1 «Создание экземпляра модуля». Однако это кажется неудачным на всех симуляторах, к которым у меня есть доступ.Пример (если он работает на вашем тренажере):
bind dut assertion a1[44:0](.a(in_bus[44:0]), .b(out_bus[44:0]), .*);
Может bind
существовать в generate
блоке?
IEEE std 1800-2012 § 27.3 «Генерировать синтаксис конструкции» упоминает bind_directive
в синтаксисе генерации конструкций, приведенном в синтаксисе 27-1. Подобно привязке массива экземпляров, все симуляторы еще не поддерживают эту функцию. IEEE std 1800-2009 § 27.3 также упоминает bind_directive
, но IEEE std 1800-2005 (первая версия IEEE SystemVerilog) нет. Пример (если он работает на вашем тренажере):
parameter DO_BIND=1;
generate
if(DO_BIND==1) begin
bind dut bind_assertions#(45) a1(.a(in_bus), .b(out_bus), .*);
end
endgenerate
Спасибо @Greg, я подумаю о вашем решении и попробую несколько небольших примеров для моего симулятора, я сообщу о своих выводах – wisemonkey