Может кто-нибудь сказать мне, в чем разница между RTL и поведенческим кодом Verilog? Есть ли четкое разграничение между проектами на этих двух уровнях?
Может кто-нибудь сказать мне, в чем разница между RTL и поведенческим кодом Verilog? Есть ли четкое разграничение между проектами на этих двух уровнях?
Ответы:
Поведенческий код более высокого уровня и обычно не может быть синтезирован. Такие конструкции, как циклы, задержки и «начальные» операторы являются поведенческими.
Код RTL является низкоуровневым и предназначен для синтеза. Он определяет схему как комбинацию взаимосвязанных регистров и операций, выполняемых над сигналами между этими регистрами.
Взято с Yahoo Ответы и найдено сразу с Google!
Код «Уровень передачи регистра» - это код, описанный в терминах регистров и комбинаторной логики, который расположен между ними и предназначен для использования в качестве входных данных для инструмента синтеза. Код придерживается синтезируемого подмножества [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