Câu trả lời:
HDL là tên bắt tất cả cho tất cả các ngôn ngữ định nghĩa phần cứng (Verilog, VHDL, v.v.) theo cùng một cách mà Hướng đối tượng có thể tham chiếu đến C ++, Java, v.v.
RTL mặt khác là một cách để mô tả một mạch.
Bạn viết mã cấp độ RTL bằng ngôn ngữ HDL, sau đó được dịch (bằng các công cụ tổng hợp) sang mô tả cấp độ cổng trong cùng ngôn ngữ HDL hoặc bất cứ điều gì thiết bị / quy trình mục tiêu của bạn sẽ thực hiện.
Tôi sẽ cho bạn một ví dụ. Dưới đây là một dòng Verilog (HDL) mô tả một mux trong RTL:
assign mux_out = (sel) ? din_1 : din_0;
Công cụ tổng hợp của bạn có thể lấy nó và chuyển đổi nó thành một tập hợp các cổng logic hoặc chỉ là một macro mux được thiết bị cuối của bạn hỗ trợ. Ví dụ, nó có thể khởi tạo một macro mux
mux u3 (mux_out, din_1, din_0);
Trong cả hai trường hợp, bạn có thể cung cấp cùng một đầu vào cho khối (RTL hoặc mức cổng) và đầu ra của bạn phải giống nhau. Trong thực tế, có những công cụ kiểm tra đầu ra của tổng hợp so với mã RTL của bạn để đảm bảo công cụ không vô tình tối ưu hóa hoặc thay đổi một cái gì đó trong quá trình tổng hợp gây ra sự không khớp. Điều này được gọi là Xác minh chính thức.
Vì nhiều lý do, khả năng tương tác, dễ thay đổi, dễ hiểu, bạn viết mô tả của bạn về mạch kỹ thuật số là RTL, thay vì cấp độ cổng.
HDL (Ngôn ngữ mô tả phần cứng) là loại ngôn ngữ được sử dụng, Verilog / VHDL so với javascript không phải HDL.
RTL (Cấp độ chuyển đổi đăng ký) là một mức độ trừu tượng mà bạn đang viết. Ba cấp độ tôi đề cập đến là Hành vi, RTL, Cấp độ cổng.
Hành vi có lớp trừu tượng cao nhất mô tả hành vi tổng thể và thường không tổng hợp được, nhưng rất hữu ích để xác minh.
RTL mô tả phần cứng bạn muốn bằng cách ngụ ý logic. xác định flip-flop, chốt và cách dữ liệu được chuyển giữa chúng. Đây là tổng hợp, tổng hợp có thể thay đổi / tối ưu hóa logic được sử dụng nhưng không phải hành vi. Chuyển đổi mux cho cổng vv một số lần đảo ngược tín hiệu để tối ưu hóa thiết kế tốt hơn.
Verilog RTL ngụ ý một flip-flop:
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
Toán tử kết hợp bitwise:
logic [1:0] n;
logic [1:0] m;
logic [1:0] result;
assign result = n & m ;
Cấp độ cổng là một thiết kế sử dụng các cổng logic cơ sở (NAND, NOR, AND, OR, MUX, FLIP-FLOP). Nó không cần phải được tổng hợp hoặc là đầu ra từ tổng hợp. Điều này có mức độ trừu tượng thấp nhất. đó là cổng logic mà bạn sẽ sử dụng trên chip, nhưng nó thiếu thông tin vị trí.
Cổng cấp Verilog (cùng chức năng như trên):
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
);
Kết hợp
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;
(một thanh ghi dịch chuyển tải song song không đồng bộ có thể được thực hiện trên CPilin Xilinx 9536 bằng cách sử dụng các khối với thiết lập lại / đặt trước không đồng bộ) thì có thể được coi là RTL hoặc mức cổng không?
AND(.a(),.b()) OR(.a(),.b())
các cổng logic đơn thuần được nối lên. Tôi có ấn tượng rằng RTL là bất cứ thứ gì bạn định tổng hợp, thậm chí cả các mạch tổ hợp vì bạn vẫn đang mô tả sự thay đổi trong dữ liệu, nhưng không phải là cổng logic trực tiếp.
MyLatch
nó là một tế bào cơ sở khởi tạo hoặc một chốt ngụ ý. Nếu bạn khởi tạo cổng thì đó là cấp độ cổng Nếu bạn ngụ ý nó, đó là RTL. Thư viện cấp độ cổng sẽ có thời gian liên quan đến nó để mô hình hóa các điều kiện cuộc đua / trục trặc, vv Mô phỏng RTL chạy với các thành phần lý tưởng.