Answers:
HDL是所有硬件定义语言(Verilog,VHDL等)的全称,以面向对象可以引用C ++,Java等的方式表示。
另一方面,RTL是描述电路的一种方式。
您用HDL语言编写RTL级别代码,然后将其翻译(通过综合工具)以使用相同的HDL语言或目标设备/过程所用的任何内容进行门级别描述。
让我给你举个例子。这是一行Verilog(HDL),描述了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仿真使用理想的组件运行。