2014-10-23 3 views
0

Я реализовал модуль SV, который содержит мягкие ограничения. Однако, насколько я знаю, мягкие ограничения поддерживаются только с 1800-х годов. Поэтому я хотел бы добавить альтернативную реализацию в случае использования симулятора, который поддерживает только старые версии.
Есть ли способ, чтобы получить эту информацию с задачей системы или директивой препроцессора таким образом:Есть ли системная задача или предпроцессорная директива в SystemVerilog для извлечения стандартной версии?

if($get_version_specifier == "1800-2012") 
    // do fancy stuff with soft constraints 
else 
    // alternative fancy stuff 

я уже нашел вариант для аналогичной задачи с помощью begin_keywords, end_keywords, но я думаю, что не решит мою проблему, поскольку он определяет только набор ключевых слов для определенного стандарта. И если симулятор не поддерживает эту версию, я предполагаю, что произойдет только ошибка.

Заранее благодарен!
sebs

ответ

2

Проблема, о которой вы просите, сложнее, чем кажется. Различные функции SystemVerilog реализуются различными версиями инструмента; иногда до выпуска стандарта, иногда после. Я знаю, что некоторые инструменты поддерживали мягкие ограничения до выпуска стандарта 1800-2012, и никакого коммерческого инструмента, который, как мне известно, еще не поддержал перегрузка оператора, который был в первом стандарте IEEE 1800-2005.

Лучшим решением было бы определить набор макросов, таких как USE_SOFT_CONSTRAINTS для функций, которые не имеют универсальной поддержки. Затем вы можете включить общий файл featureset.svh, который определяет набор функций, который вы хотите использовать. Другой хорошей практикой является ДОКУМЕНТ Причина, по которой вы добавили конкретный макрос функции (, т. Е. Версия инструмента, которую вы использовали, не поддерживала эту функцию и почему вы решили, что стоило усилий реализовать обе ветви кода) ,

0

Насколько я знаю, нет никакого «стандартного» способа получения версии стандарта, который вы используете. У C++ была аналогичная проблема до выпуска 2011 года (см. here). В одном ответе указывается, что разные компиляторы добавили разные проприетарные определения (что-то вроде макроса INCA для симулятора Incisive). Вы должны спросить своего поставщика симулятора, существует ли определение для версии стандарта SV (что-то вроде SV2012_OR_GREATER).

Каденция, например, имеет что-то подобное для Specman, поэтому, если они согласуются, они могут иметь это и для SystemVerilog. Предполагая, что такая вещь существует, вы могли бы:

`ifdef SV_2012_OR_GREATER 
    // do fancy stuff with soft constraints 
`else 
    // alternative fancy stuff 
`endif 

Bonus: Мягкие ограничения являются декларативной конструкцией, так что я не вижу, как вы могли бы использовать if блок, чтобы решить, следует ли использовать их или нет (если не возможно если это if внутри блока ограничений). Кроме того, я не уверен, действительно ли вы в состоянии по-настоящему подражать мягким ограничениям, но какой бы ни был ваш подход, поэтому я не знаю, действительно ли имеет смысл попробовать.

+0

Возможно, вы могли бы эмулировать мягкое ограничение, вызвав randomize() и проверив результат. Если он возвращает 0 (т. Е. Ему не удалось рандомизировать), вы отключите «мягкое ограничение» и снова вызовите randomize(). – Stan

+0

@stan Да, но как вы знаете, если рандомизация потерпела неудачу, потому что это ограничение, а не другое? –

+0

Настройка будет нарушена, если ваши рандомизации могут выйти из строя по другим причинам. Но в большинстве случаев вы не ожидаете, что рандомизация потерпит неудачу, если что-то пойдет не так. – Stan