Я новичок в проверке на основе утверждений, пытаюсь понять, как это должно быть сделано правильно. Я нашел много информации о структуре и технических деталях утверждений systemverilog +, но до сих пор не нашел что-то вроде «кулинарной книги» о том, как на самом деле все делается в реальном мире.
Вопрос и ограничения:
- В проекте есть шина ввода данных с входами data, valid и id.
- Один "пакет" данных - 3 образца.
- After channel n there will always be data from channel n+1
- channel IDs will wrap after the largest ID has been sent
- Между байтами данных может быть любое количество тактов clk.
Ниже представлена простая и, надеюсь, правильная временная диаграмма с идентификаторами каналов:
Итак, как этого добиться с наименьшим количеством кода? Красиво и чисто. Раньше я создавал фиктивные модули Verilog для работы с данными. Но, конечно, можно было бы просто использовать какое-нибудь свойство accept, чтобы просто ограничить идентификаторы каналов, но в противном случае оставить свободные руки для формального инструмента, чтобы попытаться помешать моему дизайну?
Простым шаблоном для начинающих может быть:
data_in : assume property (
<data with some ID>[=3]
|=>
<data with the next id after any clk tick>
);
Я предполагаю, что проблема в том, что предположения / утверждения, подобные приведенным выше, имеют тенденцию срабатывать для каждого образца данных и создавать параллельные потоки, которые перекрываются во времени.