Утверждение для действительного приходит один раз в транзакции req-ack

введите здесь описание изображения

Я хочу написать утверждение, которое проверяет, что «Действительный должен быть высоким только один раз в транзакции req 1, ack 1, req 0, ack 0»

Я думал о следующем, но это дает мне ошибку.

assert property (@(posedge clk_r) req & ~ack |-> (valid [=1]) throughout ((req & ~ack) ##[1:$] (~req & ~ack)));

Может ли кто-нибудь помочь мне здесь?


person Karan Shah    schedule 05.06.2020    source источник
comment
Вы должны явно указать, что означает req-ack транзакция. Картинка — плохая замена описанию, особенно без контекста.   -  person Tudor Timi    schedule 10.06.2020


Ответы (1)


Я предполагаю, что под «ошибкой» вы подразумеваете ошибку компиляции. Левая часть оператора throughout может быть только логическим значением, а не последовательностью. Вы думаете об операторе intersect.

intersect потребует, чтобы последовательности слева и справа имели одинаковое количество циклов.

Последовательность слева от intersect должна указывать, что существует один и только один цикл, где valid равно 1. Оператор непоследовательного повторения — хорошее начало, потому что он говорит, что valid может появиться в любом цикле, начиная с момента начала последовательного совпадения. Не сказано, что происходит после этого; он просто говорит, что могут существовать последующие циклы, но не предъявляет никаких требований к этим циклам.

Вам нужно указать, что происходит после цикла, где valid равно 1. Чтобы убедиться, что существует единственный цикл, где valid равно 1, мы должны проверить, что valid равно 0 для последующих циклов. Делается это с помощью следующей последовательности:

!valid [*] ##1 valid ##1 !valid[*]

Это можно было бы написать несколькими способами, но я считаю код выше наиболее читаемым.

В другой части консеквента вы можете смело отбросить термин (req && !ack) и просто сказать:

##[1:$] (!req && !ack)

Он также не делает того, что, как я думаю, вы хотите (убедитесь, что req остается 1, пока не наступит ack). У вас должно быть другое утверждение, которое проверяет, что req должно оставаться 1. Это упростит отладку, потому что вы разделяете проверки для valid и проверки для req и ack.

Собрав все вместе, утверждение должно выглядеть так:

assert property (@(posedge clk_r)
    req & ~ack |->
        (!valid [*] ##1 valid ##1 !valid [*]) within (##[1:$] (!req && !ack));

Примечание: вы должны использовать логические операторы вместо побитовых логических операторов. Вместо & используйте &&, а вместо ~ используйте !.

person Tudor Timi    schedule 05.06.2020
comment
Последнее untill_with Я запутался. Не могли бы вы поделиться значением последнего? Также оператор not отличается от ~? - person Karan Shah; 05.06.2020
comment
Я тоже пробовал это - req & ~ack |-> (valid) within (##[1:$] (~req & ~ack));. Но это не потерпело неудачу для 0, действительного в транзакции. Для 0 действительной транзакции утверждение не завершается. Итак, нам нужно что-то такое же, но утверждение, которое терпит неудачу, когда req 0, ack 0 и valid не становится 1. - person Karan Shah; 05.06.2020
comment
Для допустимого только один раз случая, я думаю, работает следующее утверждение - assert property (@(posedge clk_r) valid |=> ~valid[*1:$] ##1 ~req & ~ack); - person Karan Shah; 05.06.2020
comment
not похож на логический оператор ! (я бы предложил использовать его вместо побитового отрицания ~), но он применяется к свойствам. - person Tudor Timi; 06.06.2020
comment
Я смущен, почему утверждение within не терпит неудачу для случая no valid. Консеквент должен перестать совпадать, как только req и ack станут низкими. - person Tudor Timi; 06.06.2020
comment
Ваш третий комментарий вдохновил меня, и я думаю, что можно написать одно утверждение. - person Tudor Timi; 06.06.2020
comment
Да, даже я предполагал, что within должен дать сбой, когда произойдет req 0, ack 0. Я не уверен, является ли это конкретной проблемой инструмента или нет. Теперь valid only once случай можно проверить с помощью моего нового утверждения, тогда valid not 0 можно проверить с помощью - assert property (@(posedge clk_r) req & ~ack |-> valid [->1] ##[1:$] ~req & ~ack ) - person Karan Shah; 07.06.2020
comment
Я переписал ответ, так как думаю, что людям, которые его читают, не будут интересны первоначальные версии. Их будет заботить то, как должен выглядеть окончательный код, чтобы они могли реализовать подобное решение. - person Tudor Timi; 10.06.2020