Відповіді:
HDL - це найменування для всіх мов визначення апаратних засобів (Verilog, VHDL тощо) точно так само, як об'єктно-орієнтоване може посилатися на C ++, Java тощо.
RTL з іншого боку - це спосіб опису схеми.
Ви пишете свій код рівня RTL мовою HDL, який потім буде переведений (інструментами синтезу) для опису рівня воріт на тій самій мові HDL або будь-якого вашого цільового пристрою / процесу.
Дозвольте навести вам приклад. Ось рядок Verilog (HDL), що описує mux у RTL:
assign mux_out = (sel) ? din_1 : din_0;
Ваш інструмент синтезу може взяти це і перетворити його на набір логічних воріт або просто в мак-макс, який підтримується кінцевим пристроєм. Наприклад, він може створити макрос mux
mux u3 (mux_out, din_1, din_0);
В обох випадках ви можете подавати однакові входи до блоку (RTL або рівень воріт), і ваш вихід повинен бути однаковим. Насправді є інструменти, які перевіряють вихід вашого синтезу на ваш код RTL, щоб переконатися, що інструмент не випадково оптимізував чи змінив щось під час синтезу, що спричинило невідповідність. Це називається формальною верифікацією.
З різних причин, сумісності, простоти змін, зрозумілості ви пишете свій опис цифрової схеми як RTL, а не на рівні воріт.
HDL (Мова опису обладнання) - це тип використовуваної мови, Verilog / VHDL порівняно з не-HDL-javascript.
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] )
);
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;
(асинхронний регістр зсуву паралельного навантаження, який можна було б реалізувати на Xilinx 9536 CPLD з використанням блоків з асинхронним скиданням / попередньою задачею), це вважатиметься RTL або рівнем воріт?
AND(.a(),.b()) OR(.a(),.b())
підключені чисто логічні ворота. Я маю враження, що RTL - це все, що ти маєш намір синтезувати, навіть комбінаторні схеми, оскільки ти все ще описуєш зміну даних, але не логічне введення безпосередньо.
MyLatch
, це копія базової клітини або мається на увазі засувка. Якщо ви інстанціюєте ворота, це рівень воріт. Якщо ви це маєте на увазі, це RTL. Бібліотека рівня воріт матиме пов'язані з нею терміни для моделювання перегонів / глюків тощо. Моделювання RTL працює з ідеальними компонентами.