Может кто-нибудь сказать мне, в чем разница между RTL и поведенческим кодом Verilog? Есть ли четкое разграничение между проектами на этих двух уровнях?
digital-logic
verilog
vhdl
hdl
Акаш Сингх
источник
источник
Код «Уровень передачи регистра» - это код, описанный в терминах регистров и комбинаторной логики, который расположен между ними и предназначен для использования в качестве входных данных для инструмента синтеза. Код придерживается синтезируемого подмножества [1] языка. Там нет явных задержек, все сроки в терминах фронта часов. Структуры, представляющие защелки, управляемые уровнем, как правило, избегают. Регистры, как правило, синхронизируются с небольшим количеством часов, подробности которых могут быть переданы анализатору времени. Обычно предполагается, что комбинаторная логика [2] располагается в одном такте, что ограничивает ее сложность. Это более высокий уровень, чем модель уровня затвора, но он все еще определяет, какое значение имеет каждый регистр в каждом такте.
«Поведенческий» код - это, как правило, код, описывающий beviour на более высоком уровне для использования в симуляции, но он не предназначен для синтеза. Он может использоваться для описания среды, окружающей ваш дизайн, в симуляции. Он может использоваться в качестве начального этапа проектирования для создания общего проекта до того, как детальный дизайн RTL отдельных модулей будет пройден.
[1] Точное допустимое подмножество варьируется в зависимости от инструментов синтеза.
[2] Если это не происходит в течение одного цикла, тогда симуляция и синтез могут дать разные результаты, и анализатор синхронизации покажет нарушение, если явно не сказано не делать этого.
источник
Более обобщенное определение.
Поведенческий код: по определению он определяет поведение цифрового компонента. Он не дает информации о том, как он будет реализован в реальном HW (синтез). Он не предоставит информацию о том, как будут реализованы регистры и вентили для выполнения требуемой операции. Это больше похоже на написание алгоритма или FSM на C.
RTL: это более точная форма цифрового компонента. Он дает информацию о том, как код будет реализован как фактическое HW (после синтеза). Также это дает информацию, как данные будут переданы между регистрами и воротами.
источник
Это один и тот же язык, но используются разные стили. С опытом вы можете отличить их быстро, вот несколько особенностей каждого:
Поведенческий код verilog, как правило, больше похож на последовательную компьютерную программу, выполняющуюся сверху вниз в
initial begin
блоке. Вы можете обнаружить, что в поведенческих модулях верхнего уровня не определено никаких портов ввода / вывода, так как выходные данные могут быть в средствах моделирования, таких как консоль$display()
или файловая система с$open
или дампер формы волны с$dumpfile
и$dumpvars
. Следите за задержками между утверждениями, реализованными с использованием, например, длительного времени ожидания моделирования#4000
и вызова задачwishbone_master.checked_read(addr, value)
. Для этих конструкций более высокого уровня не очевидно, каким будет / может быть синтезированный технологический эквивалент.Verilog для синтеза всегда имеет порты ввода / вывода, так как без подключенных портов модуль не имеет побочных эффектов и может быть устранен [1]. Задержки, вероятно, реализуются путем подсчета циклов некоторых конкретных часов. Обратите внимание, что некоторые функции системы Verilog, например,
$clog2(PARAMETER)
могут быть разрешены в коде для синтеза, поэтому присутствие в$function
любом случае не является гарантией. Код для синтеза имеет тенденцию включать в себя множество независимых «процессов», каждый из которых имеет список чувствительности. Некоторые технологии допускаютinitial begin
блоки для инициализации памяти, поэтому это не является гарантией.В конечном счете, разработчик знает цель написанного им кода и будет соответствующим образом вызывать его с помощью набора инструментов для синтеза или в симуляторе.
[1] за исключением некоторых IP-блоков, которые могут подключаться к внутренним микросхемам, например JTAG
источник