RTL против HDL? Какая разница

24

В чем основное различие между RTL и HDL? Честно говоря, я искал / гуглил, но люди разделились во мнениях. Я помню одно высказывание, что HDL - это компьютерный язык, используемый для описания цифровой схемы, и когда он является синтезируемым, он считается RTL.

Хочу это
источник

Ответы:

18

HDL - это универсальное имя для всех языков определения оборудования (Verilog, VHDL и т. Д.), Точно так же, как объектно-ориентированный может ссылаться на C ++, Java и т. Д.

RTL, с другой стороны, является способом описания схемы.

Вы пишете свой код уровня RTL на языке HDL, который затем переводится (с помощью инструментов синтеза) в описание уровня шлюза на том же языке HDL или на любом другом устройстве / процессе, которое вы примете.

Позвольте привести пример. Вот строка Verilog (HDL), описывающая мультиплексирование в RTL:

assign mux_out = (sel) ? din_1 : din_0;

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

mux u3 (mux_out, din_1, din_0);

В обоих случаях вы можете подавать одни и те же входы на блок (RTL или уровень шлюза), и ваш вывод должен быть одинаковым. Фактически есть инструменты, которые проверяют вывод вашего синтеза по сравнению с вашим кодом RTL, чтобы убедиться, что инструмент случайно не оптимизировал или не изменил что-то во время синтеза, что вызвало несоответствие. Это называется формальной проверкой.

По ряду причин, функциональной совместимости, простоты изменения, понятности вы пишете свое описание цифровой схемы как RTL, а не на уровне шлюза.

EEToronto
источник
3
Хороший ответ, просто дальнейшее уточнение ... RTL предполагает заданный стиль проектирования - логическое облако, регистр, логическое облако, регистр и т. Д., Что подразумевает синхронный (синхронизированный) дизайн. Если бы вы кодировали в своем hdl для часового (асинхронного) дизайна, ваш инструмент синтеза мог бы использовать что-то отличное от RTL.
заполнитель
На самом деле, существуют инструменты, которые проверяют вывод вашего синтеза по отношению к вашему RTL-коду, чтобы убедиться, что инструмент случайно не оптимизировал или не изменил что-то во время синтеза, что вызвало несоответствие. Это называется формальной проверкой. '' Нет, это не так. Это называется проверкой логической эквивалентности или формальной проверкой эквивалентности. Формальная проверка - это скорее процесс доказательства (с использованием математических методов, без моделирования / стендов), что ваше аппаратное описание действительно описывает поведение, которое оно должно было описать.
Аль Банди
14

HDL (Описание аппаратного языка) - это тип используемого языка, Verilog / VHDL, в отличие от JavaScript, не являющегося HDL.

RTL (уровень регистрации-передачи) - это уровень абстракции, на котором вы пишете. Я имею в виду три уровня: Поведенческий, RTL, Уровень шлюза.

Поведенческий имеет самый высокий уровень абстракции, который описывает общее поведение и часто не синтезируется, но полезен для проверки.

RTL описывает аппаратное обеспечение, которое вы хотите, подразумевая логику. определение триггеров, защелок и как данные передаются между ними. Это можно синтезировать, синтез может изменить / оптимизировать используемую логику, но не поведение. Переключение мультиплексоров для ворот и т. Д. Иногда инвертирование сигналов для лучшей оптимизации дизайна.

Verilog RTL подразумевает триггер:

logic a;              //logic is SystemVerilog, could be a 'reg'
logic k;              // Driven by RTL not shown
always @(posedge clk or negede rst_n) begin
  if (~rst_n) begin
    a <= 'b0 ;
  end
  else begin
    a <= k ;
  end
end

Комбинаторные побитовые операторы:

logic [1:0] n;
logic [1:0] m;
logic [1:0] result;

assign result = n & m ;

Уровень шлюза - это конструкция с использованием логических элементов (NAND, NOR, AND, OR, MUX, FLIP-FLOP). Он не нуждается в синтезе или является результатом синтеза. Это самый низкий уровень абстракции. это логические элементы, которые вы будете использовать на чипе, но в нем отсутствует позиционная информация.

Уровень ворот Verilog (та же функция, что и выше):

wire a;
wire k;
DFFRX1 dffrx1_i0 (
  .Q (a),   //Output
  .QN( ),   //Inverted output not used
  .D (k),   //Input
  .CK(clk), //Clk
  .RN(rst_n)// Active Low Async Reset
);

комбинаторный

wire [1:0] n;
wire [1:0] m;
wire [1:0] result;

AND2X1 and2x1_i0 (
  .Y( result[0]),
  .A( n[0]     ),
  .B( m[0]     )
);
AND2X1 and2x1_i1 (
  .Y( result[1]),
  .A( n[1]     ),
  .B( m[1]     )
);
pre_randomize
источник
Если проектировать схему как MyReg[7..1] := MyReg[6..0]; MyReg[0] := SerInput; MyReg.Clk = SerClk; MyReg[7..0].AR = !InBus[7..0] & Load; MyReg[7..0].AP = InBus[7..0] & Load;(асинхронный сдвиговый регистр с параллельной нагрузкой, который может быть реализован на CPLD Xilinx 9536 с использованием блоков с асинхронным сбросом / предустановкой), это будет считаться RTL или уровнем шлюза?
суперкат
RTL, уровень гейта выглядел бы как AND(.a(),.b()) OR(.a(),.b())чисто логические ворота, подключаемые. У меня сложилось впечатление, что RTL - это то, что вы намереваетесь синтезировать, даже комбинаторные схемы, поскольку вы все еще описываете изменение данных, но не логические элементы непосредственно.
pre_randomize
1
Извините, я не следую, Попробую уточнить. RTL подразумевает триггер. Уровень ворот создает триггер. Для простых цепей подключение нескольких логических элементов может быть простым. но не может быть эффективным в области питания. Процессор Atom имеет 47 миллионов транзисторов, что составляет около 10 миллионов эквивалентов NAND2. Хотите определить и отладить 10 миллионов ручных проводных ворот? В этом преимущество того, что мы можем немного абстрагироваться от изучения и отладки предполагаемого поведения.
pre_randomize
1
Предположим, кто-то пытался указать 74HC74 в HDL. Существует множество способов, с помощью которых можно синтезировать такое устройство, используя комбинацию комбинаторной логики, только синхронизирующих флопов и прозрачных защелок, но я не могу представить себе какую-либо реализацию, которая не затрагивает условия гонки или создает поведенческие аномалии, которые могли бы не существует с аппаратными примитивами (например, если D и Q высоки, импульс запуска на CP или / SD не должен иметь никакого эффекта, но в реализациях я могу предположить, что такие импульсы могут вызвать метастабильность и / или выходной сбой).
суперкат
1
Как вы создаете MyLatch, это базовая ячейка, созданная вами, или подразумеваемая защелка? Если вы создаете экземпляр шлюза, это уровень шлюза. Если вы подразумеваете это, это RTL. С библиотекой уровня ворот будет связано время для моделирования условий гонки / сбоев и т. Д. Моделирование RTL выполняется с идеальными компонентами.
pre_randomize