2013-12-18 2 views
2

Я просто утверждение: Допустим,Могу ли я использовать привязки внутри генерировать блок

assert @(posedge clk) (a |=> b); 

Я обычно связывают его с проектирования сигналов с использованием отдельного модуля

module bind_module; 
    bind dut assertion a1 (.*); 
endmodule 

связывающую Я ситуацию : dut имеет шину 45 бит, каждый бит генерируется/управляется индивидуально, но все они следуют тому же утверждению.

Могу ли я использовать оператор привязки внутри блока генерации? . (Для диапазона от 0 до 44), а затем вместо * использовать .a (in_bus[i]), .b (out_bus[i])

ответ

2

Предполагая, что вы намерены следующее:

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 причинам:

  1. имя экземпляра a1 сбрасывается на каждый цикл. Каждое имя экземпляра в модуле должно быть уникальным. Цитируя IEEE std 1800-2012 § 23.11 «Binding вспомогательный код прицелы или экземпляры»:

    Это законно более чем один bind заявление связать bind_instantiation в той же целевой области. Однако для bind_instantiation должно быть ошибкой ввести имя экземпляра, которое сталкивается с другим именем в пространстве имен модулей целевой области (см. 3.13). Это относится как к уже существующим именам, так и именам экземпляров, введенным другими операторами bind. Последняя ситуация возникнет, если в проекте содержится более одного экземпляра модуля, содержащего оператор bind.

  2. 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 
+0

Спасибо @Greg, я подумаю о вашем решении и попробую несколько небольших примеров для моего симулятора, я сообщу о своих выводах – wisemonkey

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