什么是Verilog?

什么是 Verilog?

        Verilog 是一种以代码形式来描述数字系统和电路的硬件描述语言 (HDL)。它由 Gateway Design Automation 在 20 世纪 80年代中期开发,后来被Cadence Design Systems 收购。

        Verilog 广泛用于数字和混合信号系统的设计和验证,包括专用集成电路 (ASIC) 和现场可编程门阵列 (FPGA)。它支持从结构级到行为级的一系列抽象层级,并用于基于仿真的设计和基于综合的设计。
        该语言分层次级来描述数字电路,从逻辑门和触发器等最基本的元素开始,到构建更复杂的功能模块和系统。它还支持一系列建模技术,包括门级、RTL 级和行为级的建模。

在Verilog之前用什么语言?

        在Verilog发展之前,用于数字电路设计和验证的主要硬件描述语言(HDL)是VHDL(VHSIC硬件描述语言)。VHDL 是美国国防部于 20 世纪 80 年代开发的,作为超高速集成电路(VHSIC) 计划的一部分,用于设计和测试高速数字电路。
        VHDL 是一种复杂的语言,它使设计人员能够使用一系列抽象层级来描述数字系统,从低级晶体管和门级到复杂的层次级系统。它比早期的HDL(例如 ABEL(高级布尔表达式语言)、ISP(集成系统综合过程)和 CUPL(通用可编程逻辑编译器))更具可描述性和灵活性。

        尽管 Verilog 自 20 世纪 80 年代以来不断发展且日益普及,但VHDL 仍然是一种广泛使用的 HDL,特别是在欧洲以及军事和航空航天工业中。如今,Verilog 和 VHDL 都广泛应用于数字电路设计和验证,许多公司和组织都在同时使用这两种语言。

为什么说Verilog 比它之前的语言更好?

        相对于前辈语言,Verilog 进行了多项重要改进,这有助于使其成为数字电路设计和验证方面更流行、更有效的 HDL。以下是Verilog 被认为优于其前辈语言的几个原因:

  • 更简单的语法:与 VHDL 相比,Verilog 具有更简单的语法,这使得设计人员能够更快地编写代码,并且错误更少。
  • 更好地支持行为建模:Verilog 能构更好地描述数字设计的行为和功能。它支持从门级建模到行为级建模的一系列建模技术,这让描述复杂数字电路的行为变得更加容易。
  • 更高的抽象层次:更高的抽象层级使设计人员能够使用模块和端口等概念来描述数字电路,从而使设计过程更加高效。
  • 更好的工具支持:由于Verilog 的日益流行,使其拥有更好的工具支持(开发生态环境)。Verilog 拥有一系列可用的集成开发环境 (IDE) 和仿真工具,这使得设计和验证数字电路变得更加容易。

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 与 C 和 Java 等软件语言有何不同?

        Verilog 是一种用于描述数字电路和系统的硬件描述语言(HDL),而 C 和 Java 是用于编写在通用计算机上运行的代码的软件编程语言。以下是 Verilog 与 C 和 Java 等编程语言之间的一些主要区别:

  • 目的:Verilog用于描述数字电路和数字系统,而C和Java则用于编写在计算机上运行的软件程序。
  • 语法:Verilog 的语法与 C 和 Java 不同,因为它旨在描述数字电路的行为而不是软件指令的执行。例如,Verilog 描述了线、寄存器和逻辑门的属性,而 C 和 Java 则定义了变量、函数和控制循环。
  • 执行:Verilog 用于描述数字电路的行为方式,但它不直接执行代码。Verilog 代码被编译成可以在物理电路或FPGA 中实现的硬件配置。另一方面,C 和 Java 代码被编译成可以由计算机处理器直接执行的机器代码。
  • 测试和验证:Verilog 通常用于在物理实现之前模拟数字系统的行为,而 C 和 Java 程序通常通过基于软件的模拟或代码审查进行测试和验证。
  • 设计嵌套:在 Verilog 中,设计可以创建为模块并且可以重用,而 C 和 Java 等编程语言则不然,它们的代码是为特定目的而编写的。

        总的来说,Verilog 是一种专门为数字电路设计而设计的专用语言,并不具备像 C 和 Java 那样的通用编程能力。虽然这些语言之间的语法和编程概念有一些相似之处,但 Verilog 的主要重点和应用是数字电路的设计、仿真和实现。

未来什么可能取代Verilog?

        很难准确预测未来什么会取代 Verilog,但有几种新兴技术和语言可能会对数字系统设计和验证的未来产生影响。

        可能影响数字系统设计未来的一项技术是高级综合 (HLS),它是一种根据 C、C++ 和 SystemC 等语言的高级描述自动生成硬件设计的技术。HLS 允许设计人员在更高的抽象级别表达其设计意图和功能,而不是在 Verilog 或 VHDL 中指定逻辑门和寄存器传输的细节。这可以实现更高效、更快速的数字系统设计,并允许设计人员在更短的时间内探索更多的设计空间。

        另一项可能影响数字系统设计未来的技术是机器学习和人工智能(AI),它们有可能显着简化数字系统的设计和验证过程。例如,机器学习算法可用于自动优化和生成硬件设计,从而减少手动设计工作的需要。

        还有一些新兴的 HDL 在试图解决 Verilog 和 VHDL 的一些限制,例如Chisel 和 MyHDL,它们基于更现代的编程概念,并能提供更高的抽象层级。

Verilog 简介

        触发器之类的数字元件可以用诸如 NAND 和 NOR 之类的组合门电路来表示。触发器的功能是通过以特定方式连接某组门电路来实现的。通常通过从真值表中求解卡诺图来找出门电路的连接方式。真值表只不过是一个告诉我们什么样的输入组合在一起会给出什么样的输出值的表。下图所示是实现了D 触发器功能电路的和相应的真值表。仅当 rstn 和 d 的值同时为 1时,输出 q才为 1。

什么是硬件原理图?

        硬件原理图是展示了如何连接组合门电路以实现特定硬件功能的图表。在这种情况下,它由一系列与非门构成,如上图左侧所示。然而,如果我们知道哪些输入值有助于使输出值为 1,那么我们基本上可以隐藏连接的内部细节并将其封装到黑盒中。该模块为我们提供了某些输入和输出,类似于由组合门电路组成的硬件原理图。

什么是硬件描述语言?

        如果我们能够描述该块的行为方式,然后让软件工具将该行为转换为实际的硬件原理图,(设计)就会变得更容易。描述硬件功能的语言称为 Verilog,为硬件描述语言的一种。

设计功能是什么意思?

        D 触发器的一些典型行为要求是:

  • 时钟应该是触发器的输入
  • 如果低电平有效复位为 0,则触发器应复位
  • 如果低电平有效复位为 1,则触发器输出“q”应跟随输入“d”
  • 输出“q”应该仅在时钟边缘得到新值

        我们如何知道 Verilog 中描述的行为是否准确地反映了设计的预期行为?

什么是验证?

        这是通过不同的方法来检查的,统称为验证。最常见和最广泛应用的验证方法是电路仿真。有一些软件工具可以帮助您了解 Verilog 中描述的硬件应如何运行,并为设计模型提供各种输入激励,然后设计的实际输出对比设计的预期值,以查看设计功能是否正确。

        所有仿真均由EDA (电子设计自动化)软件工具执行,Verilog设计 RTL 放置在称为testbench(测试平台)的实体内。在testbench中,不同的测试为设计提供了不同的测试激励。这样的testbench如下图所示。

什么是Verilog?_第1张图片

Verilog 代码部分

        所 有 行 为 代 码 都 应 在 关 键 字 module endmodule 内 进 行 描 述。其余的设计代码将主要遵循给定的模板。

Verilog 部分模板

  1. module(模块)定义和端口列表声明
  2. 输入输出端口列表
  3. 使用允许的Verilog 数据类型声明其他信号
  4. 设计可能依赖于其他 Verilog 模块,因此它们的实例是由模块实例化创建的
  5. 该模块的实际 Verilog 设计描述了其行为
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(测试平台)代码

        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

  • 您有任何问题,都可以在评论区和我交流!
  • 本文由 孤独的单刀 原创,首发于CSDN平台,博客主页:wuzhikai.blog.csdn.net
  • 您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞、评论和收藏⭐!

你可能感兴趣的:(Verilog语法,fpga开发,Verilog,xilinx,altera,IC,VHDL,HDL)