Verilog 是一种以代码形式来描述数字系统和电路的硬件描述语言 (HDL)。它由 Gateway Design Automation 在 20 世纪 80年代中期开发,后来被Cadence Design Systems 收购。
Verilog 广泛用于数字和混合信号系统的设计和验证,包括专用集成电路 (ASIC) 和现场可编程门阵列 (FPGA)。它支持从结构级到行为级的一系列抽象层级,并用于基于仿真的设计和基于综合的设计。
该语言分层次级来描述数字电路,从逻辑门和触发器等最基本的元素开始,到构建更复杂的功能模块和系统。它还支持一系列建模技术,包括门级、RTL 级和行为级的建模。
在Verilog发展之前,用于数字电路设计和验证的主要硬件描述语言(HDL)是VHDL(VHSIC硬件描述语言)。VHDL 是美国国防部于 20 世纪 80 年代开发的,作为超高速集成电路(VHSIC) 计划的一部分,用于设计和测试高速数字电路。
VHDL 是一种复杂的语言,它使设计人员能够使用一系列抽象层级来描述数字系统,从低级晶体管和门级到复杂的层次级系统。它比早期的HDL(例如 ABEL(高级布尔表达式语言)、ISP(集成系统综合过程)和 CUPL(通用可编程逻辑编译器))更具可描述性和灵活性。
尽管 Verilog 自 20 世纪 80 年代以来不断发展且日益普及,但VHDL 仍然是一种广泛使用的 HDL,特别是在欧洲以及军事和航空航天工业中。如今,Verilog 和 VHDL 都广泛应用于数字电路设计和验证,许多公司和组织都在同时使用这两种语言。
为什么说Verilog 比它之前的语言更好?
相对于前辈语言,Verilog 进行了多项重要改进,这有助于使其成为数字电路设计和验证方面更流行、更有效的 HDL。以下是Verilog 被认为优于其前辈语言的几个原因:
Verilog 创建了一个有助于隐藏其实现和技术细节的抽象层级。
例如,D 触发器的设计需要了解如何布置晶体管才能实现正边沿触发 FF,以及将值锁存到触发器上所需的上升、下降和clk-Q 时间以及许多其他面向技术的细节。功耗、时序以及驱动网络和其他触发器的特性也需要对晶体管的物理特性有更彻底的了解。
Verilog 可以帮助我们专注于行为层级,将其余的事情留到以后解决(指不需要关心晶体管的物理特性)。
Verilog 代码示例
以下 Verilog 代码描述了计数器的行为。 如果up_down 信号为1,则计数器向上计数;反之则向下计数。如果信号 rstn 变为 0,它还会复位计数器,使其成为低电平有效复位。
module ctr (input up_down,
clk,
rstn,
output reg [2:0] out);
always @ (posedge clk)
if (!rstn)
out <= 0;
else begin
if (up_down)
out <= out + 1;
else
out <= out - 1;
end
endmodule
上面的简单示例说明了如何隐藏所有物理实现的细节(NAND 和 NOR 等底层逻辑门的互连),同时仍然提供了计数器是如何工作的清晰思路。
ctr 代表向上/向下计数的计数器module ,它可以从针对面积、功耗和性能进行优化的各种不同类型的触发器中选择设计的实际物理实现。它们通常会被编译成库,供我们在设计过程的后期阶段在 EDA 工具中进行选择。
Verilog 是一种用于描述数字电路和系统的硬件描述语言(HDL),而 C 和 Java 是用于编写在通用计算机上运行的代码的软件编程语言。以下是 Verilog 与 C 和 Java 等编程语言之间的一些主要区别:
总的来说,Verilog 是一种专门为数字电路设计而设计的专用语言,并不具备像 C 和 Java 那样的通用编程能力。虽然这些语言之间的语法和编程概念有一些相似之处,但 Verilog 的主要重点和应用是数字电路的设计、仿真和实现。
很难准确预测未来什么会取代 Verilog,但有几种新兴技术和语言可能会对数字系统设计和验证的未来产生影响。
可能影响数字系统设计未来的一项技术是高级综合 (HLS),它是一种根据 C、C++ 和 SystemC 等语言的高级描述自动生成硬件设计的技术。HLS 允许设计人员在更高的抽象级别表达其设计意图和功能,而不是在 Verilog 或 VHDL 中指定逻辑门和寄存器传输的细节。这可以实现更高效、更快速的数字系统设计,并允许设计人员在更短的时间内探索更多的设计空间。
另一项可能影响数字系统设计未来的技术是机器学习和人工智能(AI),它们有可能显着简化数字系统的设计和验证过程。例如,机器学习算法可用于自动优化和生成硬件设计,从而减少手动设计工作的需要。
还有一些新兴的 HDL 在试图解决 Verilog 和 VHDL 的一些限制,例如Chisel 和 MyHDL,它们基于更现代的编程概念,并能提供更高的抽象层级。
触发器之类的数字元件可以用诸如 NAND 和 NOR 之类的组合门电路来表示。触发器的功能是通过以特定方式连接某组门电路来实现的。通常通过从真值表中求解卡诺图来找出门电路的连接方式。真值表只不过是一个告诉我们什么样的输入组合在一起会给出什么样的输出值的表。下图所示是实现了D 触发器功能电路的和相应的真值表。仅当 rstn 和 d 的值同时为 1时,输出 q才为 1。
硬件原理图是展示了如何连接组合门电路以实现特定硬件功能的图表。在这种情况下,它由一系列与非门构成,如上图左侧所示。然而,如果我们知道哪些输入值有助于使输出值为 1,那么我们基本上可以隐藏连接的内部细节并将其封装到黑盒中。该模块为我们提供了某些输入和输出,类似于由组合门电路组成的硬件原理图。
如果我们能够描述该块的行为方式,然后让软件工具将该行为转换为实际的硬件原理图,(设计)就会变得更容易。描述硬件功能的语言称为 Verilog,为硬件描述语言的一种。
D 触发器的一些典型行为要求是:
我们如何知道 Verilog 中描述的行为是否准确地反映了设计的预期行为?
这是通过不同的方法来检查的,统称为验证。最常见和最广泛应用的验证方法是电路仿真。有一些软件工具可以帮助您了解 Verilog 中描述的硬件应如何运行,并为设计模型提供各种输入激励,然后设计的实际输出对比设计的预期值,以查看设计功能是否正确。
所有仿真均由EDA (电子设计自动化)软件工具执行,Verilog设计 RTL 放置在称为testbench(测试平台)的实体内。在testbench中,不同的测试为设计提供了不同的测试激励。这样的testbench如下图所示。
所 有 行 为 代 码 都 应 在 关 键 字 module 和 endmodule 内 进 行 描 述。其余的设计代码将主要遵循给定的模板。
module [design_name] ( [port_list] );
[list_of_input_ports]
[list_of_output_ports]
[declaration_of_other_signals]
[other_module_instantiations_if_required]
[behavioral_code_for_this_module]
endmodule
示例:
下面的代码构建了 D触发器。前几行声明一个名为 dff 的新module,并定义了输入和输出端口。此设计中使用的唯一的其他信号是 q ,接下来将对其进行声明。由于这是一个非常简单的设计,它不依赖于任何其他模块,因此它没有实例化其他模块。always 块描述了硬件在某些事件期间应如何表现,因此是行为代码。
module dff ( input d,
rstn,
clk,
output q);
reg q;
always @ (posedge clk) begin
if (!rstn)
q <= 0;
else
q <= d;
end
endmodule
testbench是 Verilog 容器模块,它允许使用不同的输入来驱动设计并监视其输出是否符合预期行为。在下面所示的示例中,实例化了上面所示的触发器设计,并将其与 tb_* 表示的测试平台信号连接起来,然后为这些测试台信号分配特定值,并最终作为设计的输入进行驱动。
module tb;
reg tb_clk;
reg tb_d;
reg tb_rstn;
wire tb_q;
dff dff0 ( .clk (tb_clk),
.d (tb_d),
.rstn (tb_rstn),
.q (tb_q));
initial begin
tb_rsnt <= 1'b0;
tb_clk <= 1'b0;
tb_d <= 1'b0;
end
endmodule