Відповіді:
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 працює з ідеальними компонентами.