搜档网
当前位置:搜档网 › VHDL 和 Verilog HDL 的区别

VHDL 和 Verilog HDL 的区别

VHDL 和 Verilog HDL 的区别
VHDL 和 Verilog HDL 的区别

VHDL 和Verilog HDL 的区别

1. VHDL语言的特点:

a.VHDL是强类型语言:

不同数据类型之间不能赋值(可用转换函数实现赋值)

不同数据类型之间不能运算(可调用程序包重载操作符)

b.VHDL不区分大小写(连保留字也不区分大小写)

Verilog HDL则没有数据类型匹配要求(自动转换),区分大小写(大小写含义不同)

2. 输入、输出端口:

VHDL中有in out inout buffer四种,端口默认为内部信号(有寄存器端口)

buffer端可以反馈,但不能连接其他元件端口,实际使用时常用内部signal来代替buffer端口

Verilog HDL中只有input output inout,默认为wire类型(无寄存器端口)

verilog HDL中的reg类型数据可以代替VHDL的内部signal(内部寄存器)

VHDL 与Verilog HDL 硬件设计语言的较量!

当前最流行的硬件设计语言有两种,即VHDL 与Verilog HDL,两者各有优劣,也各有相当多的拥护者。VHDL 语言由美国军方所推出,最早通过国际电机工程师学会(IEEE)的标准,在北美及欧洲应用非常普遍。而Verilog HDL 语言则由Gateway 公司提出,这家公司辗转被美商益华科技(Cadence)所购并,并得到美商新思科技(Synopsys)的支持。在得到这两大EDA 公司的支持后,也随后通过了IEEE 标准,在美国、日本及中国台湾地区使用非常普遍。两者的比较如下:(1)数据类型:VHDL 允许使用者自定义数据类型,如抽象数据类型,这种特性使得系统层级的建模较为容易。相比于VHDL,Verilog HDL 语言的主要数据类型就简单许多,其数据类型的定义完全是从硬件的概念出发。对于初学者来说,这可能是其优点,能将思维概念放在电路设计本身。不过,这也使得Verilog HDL 在系统级建模的能力较弱,但新一代的Verilog HDL 语言,如Verilog-2001 及SystemVerilog 等,就针对系统级的部分进行了加强,且完全向下兼容。

(2)可维护性:对于大型设计而言,VHDL 支持如generate package 及generic 的语法,这有助于大型设计的维护。在这方面Verilog HDL 也提供了generate 的语法。

(3)可扩充性:Verilog HDL 语言因其可程序化的接口可以无限扩充而成为功能强大的硬件设计语言。这一点是VHDL 所欠缺的,VHDL 语言以Package 的观念取代。

个人感觉,还是偏好Verilog HDL 硬件设计语言,主要是因为:

(1)精简:在实现同样功能的情况下,比较两者的程序代码,Verilog HDL 仅需几乎VHDL 语言的一半长度。大家也知道,程序的可维护性与程序的长短成反比,越长的程序维护越不容易,且出错的几率也高。

(2)格式自由:自由的格式可能是优点,但也可能成为缺点。例如管脚位数不匹配,在Verilog HDL 里仅为警告(Warning),而在VHDL 里则为严重的错误(Error)。事实上,VHDL 以结构严谨著称。

(3)易于学习:Verilog HDL 的语法与C 语言近似,对于已经很熟悉C 语言的人而言,应该可以快速入门。

(4)方便性:Verilog HDL 定义了许多易于仿真的语法,如信号的提取(Extraction),我们可以在顶层模块中直接提取子模块的信号。如,wire test=top.module1.module2.test,这在仿真时极为有用。在比方说signal 的强制赋值(force)与强制赋值释放(release),这也是常用的功能。而这些功能VHDL 并不具备,必须依靠仿真器提供特殊的工具来辅助。并且,Verilog

HDL 语言能在整个设计阶段甚至是库设计的时候都可以采用,因而免除了不同语言之间转换或联合仿真的问题。

Verilog是一种硬件描述语言,在写Verilog语言时,首先要清楚所要写的module在硬件上如何实现,而不是去想编译器如何去解释这个module。比如在决定是否使用reg定义时,要问问自己物理上是不是真正存在这个register,如果是,它的clock是什么?D端是什么?Q端是什么?有没有清零和置位?同步还是异步?再比如三态输出问题,首先想到的应该是在register的输出后面加一个三态门,而不是如何才能让编译器知道要“赋值”给一个信号为三态。同样,Verilog中没有“编译”的概念,而只有综合的概念。写硬件描述语言的目的是为了综合,所以说要想写的好就要对综合器有很深的了解,这样写出来的代码才有效率。

Motorola设计中心的一位资深工程师,他对硬件描述语言总结了这么一句:就是用Verilog描述电路的时候,一定要清楚它实现的电路,很多人只顾学习verilog语言,而不熟悉它实现的电路,这是设计不出好电路来的。

一般写Verilog code时,对整个硬件的架构应该是很清楚了,最好有详细的电路图画出,时序问题等都应该考虑清楚了。可以看着图直接写code。最初Verilog是为了实现仿真而发明的,当然,不可综合的Verilog语句也是很重要的。因为在实际设计电路时,除了要实现一个可综合的module外,你还要知道它的外围电路是怎样的,以及我的这个电路与这些外围电路能否协调工作。这些外围电路就可以用不可综合的语句来实现而不必管它是如何实现的。因为它们可能已经实际存在了,我仅是用它来模拟的。所以,在写Verilog的时候应该要先明确我是用它来仿真的还是综合的。要是用来综合的话,就必须要严格地使用可综合的语句,而且不同的写法可能产生的电路会有很大差别,这时就要懂一些Verilog综合方法的知识。就像前面说的,脑子里要有一个硬件的概念。特别是当综合报错时,就要想一想我这种写法能不能用硬件来实现,verilog毕竟还不是C,很多写法是不可实现的。要是这个module仅是用来仿真的,就要灵活得多了,这时你大可不必太在意硬件实现。只要满足它的语法,实现你要的功能就行了。

如#10 clk=~clk,虽然这种语句是不可综合的,但是在做Simulation和Verification时常常用它在Test Bench中来产生一个clock信号。再比如常常用到的大容量memory,一般是不会在片上实现的,这个时候也需要一个unsynthesizable module。

我们设计module的目的是为了可以综合出功能正确,符合标准的电路来。我想这是个反复的过程,就像我们在写design flow中总要注明前仿真、综合后的仿真、以及后仿真等。仿真是用来验证我们设计的非常重要的手段。而Verilog里那些看似无聊的语句这个时候就会发挥很大的作用。

在做逻辑结构设计时,综合的因素是要考虑的,但是有很多东西不能考虑的过于细致,就是在设计的时候不能过于紧卡时延,面积等因素,因为这样以来综合后优化的余量就会很小,反而不利与设计的优化,如果在时延和面积要求不是很紧张的情况下,其实代码写的行为级,利用综合工具进行优化也是一种方法。当然,如果面积和时延的要求很高,最好还是把代码写的底层一点,调用库单元时,也要充分考虑其面积和时延的因素。

Verilog 和VHDL各有千秋,只是看个人爱好和应用领域罢了!在中国台湾省、美国、日本等使用Verilog 较多,而在欧洲VHDL 发展得比较好。国内大多数集成电路设计公司基本都采用Verilog。Verilog 在其门级描述的底层,也就是晶体管开关级的描述方面比VHDL 更强一些,所以即使是VHDL 的设计环境,在底层实质上也会由Verilog 描述的器件库所支持。Verilog 较为适合系统级、算法级、RTL级、门级和电路开关级的设计,而对于特大型(千万门级以上)的系统级设计,则VHDL 更为适合。

两种HDL 语言都处在不断发展完善的过程中,对于初学者,可以考虑先掌握Verilog,随着对HDL 语言设计的深入理解,再进行VHDL 语言的学习也是有必要的!

VerilogHDL复习题与答案

VerilogHDL硬件描述语言复习 一、 1.VerilogHDL是在哪一年首次被IEEE标准化的? 答:VerilogHDL是在1995年首次被IEEE标准化的。 2.VerilogHDL支持哪三种基本描述方式? 答:VerilogHDL可采用三种不同方式或混合方式对设计建模。这些方式包括:行为描述方式—使用过程 化结 构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述 建模 3.VerilogHDL是由哪个公司最先开发的? 答:VerilogHDL是由GatewayDesignAutomation公司最先开发的 4.VerilogHDL中的两类主要数据类型什么? 答:线网数据类型和寄存器数据类型。线网类型表示构件间的物理连线,而寄存器类型表示 抽象的数据存储元件。 5.UDP代表什么? 答:UDP代表用户定义原语 6.写出两个开关级基本门的名称。答: pmosnmos 7.写出两个基本逻辑门的名称。答: andor 8.在数据流描述方式中使用什么语句描述一个设计? 答:设计的数据流行为使用连续赋值语句进行描述 9.采用结构描述方式描述1位全加器。 答: modulefull_add(a,b,cin,s,co); inputa,b,cin; outputs,co; wireS1,T1,T2,T3; xor X1(S1,a,b), X2(s,S1,cin); and A1(T3,a,b), A2(T2,b,cin), A3(T1,a,cin); or O1(co,T1,T2,T3); endmodule 10.initial语句与always语句的关键区别是什么? 答:1)initial语句:此语句只执行一次。 2)always语句:此语句总是循环执行,或者说此语句重复执行。 11.采用数据流方式描述2-4译码器。 答: 'timescale1ns/ns moduleDecoder2×4(A,B,EN,Z); inputA,B,EN; output[0:3]Z; 1

Verilog HDL语言的描述语句

第4节Verilog HDL语言的描述语句Verilog HDL 描述语句 2.4.1 结构描述形式 通过实例进行描述的方法,将Verilog HDL预先定义的基本单元实例嵌入到代码中,监控实例的输入。Verilog HDL中定义了26个有关门级的关键字,比较常用的有8个。 在实际工程中,简单的逻辑电路由逻辑门和开关组成,通过门元语可以直观地描述其结构。 基本的门类型关键字如下所述: ?and ?nand ?nor ?or ?xor ?xnor ?buf ?not Verilog HDL支持的基本逻辑部件是由该基本逻辑器件的原语提供的。其调用格式为: 门类型<实例名> (输出,输入1,输入2,……,输入N) 例如,nand na01(na_out, a, b, c ); 表示一个名字为na01的与非门,输出为na_out,输入为a, b, c。 例2-5 一个简单的全加器例子: module ADD(A, B, Cin, Sum, Cout); input A, B, Cin; output Sum, Cout; // 声明变量 wire S1, T1, T2, T3; xor X1 (S1, A, B), X2 (Sum, S1, Cin); and A1 (T3, A, B), A2 (T2, B, Cin), A3 (T1, A, Cin); or O1 (Cout, T1, T2, T3);

endmodule 在这一实例中,模块包含门的实例语句,也就是包含内置门xor、and和or的实例语句。门实例由线网型变量S1、T1、T2和T3互连。由于未指定顺序,门实例语句可以以任何顺序出现。 门级描述本质上也是一种结构网表。在实际中的使用方式为:先使用门逻辑构成常用的触发器、选择器、加法器等模块,再利用已经设计的模块构成更高一层的模块,依次重复几次,便可以构成一些结构复杂的电路。其缺点是:不易管理,难度较大且需要一定的资源积累。 2.4.2 数据流描述形式 数据流型描述一般都采用assign连续赋值语句来实现,主要用于实现组合功能。连续赋值语句右边所有的变量受持续监控,只要这些变量有一个发生变化,整个表达式被重新赋值给左端。这种方法只能用于实现组合逻辑电路。其格式如下: assign L_s = R_s; 例2-6 一个利用数据流描述的移位器 module mlshift2(a, b); input a; output b; assign b = a<<2; endmodule 在上述模块中,只要a的值发生变化,b就会被重新赋值,所赋值为a左移两位后的值。 2.4.3 行为描述形式 行为型描述主要包括过程结构、语句块、时序控制、流控制等4个方面,主要用于时序逻辑功能的实现。 1.过程结构 过程结构采用下面4种过程模块来实现,具有强的通用型和有效性。 ?initial模块 ?always模块 ?任务(task)模块 ?函数(function)模块

Verilog HDL常用的行为仿真描述语句(一)

Verilog HDL常用的行为仿真描述语句(一) 一、循环语句 1、forever语句 forever语句必须写在initial模块中,主要用于产生周期性波形。 2、利用for、while循环语句完成遍历 for、while语句常用于完成遍历测试。当设计代码包含了多个工作模式,那么就需要对各个模式都进行遍历测试。其典型的应用模板如下:[c-sharp:nogutter] view plaincopy? parameter mode_num = 5; initial begin // 各种不同模式的参数配置部分 for(i=0; i<mode_num-1; i=i+1) begin case (i) 0: begin . . end

1: begin . . end . . endcase end // 各种模式共同的测试参数 . . end 3、利用repeat语句来实现有次数控制的事件,其典型示例如下: [c-sharp] view plaincopy? initial begin

// 初始化 in_data = 0; wr = 0; // 利用repeat语句将下面的代码执行10次 repeat(10) begin wr = 1; in_data = in_data + 1; #10; wr = 0; #200; end end 4、用disable实现循环语句的异常处理,其典型示例如下:[c-sharp] view plaincopy? begin : one_branch for(i=0; i<n; i=i+1) begin : two_branch if (a==0) disable one_branch; if (a==b)

veriloghdl的行为语句

Verilog HDL的行为语句 Verilog HDL有许多的行为语句,使其成为结构化和行为性的语言。Verilog HDL语句包括:赋值语句、过程语句、块语句、条件语句、循环语句、编译预处理等,如表5-14 所示。符号“√”表示该语句能够为综合工具所支持,是可综合的。 5.3.1 赋值语句 赋值语句包括持续赋值语句与过程赋值语句。 1. 持续赋值语句assign为持续赋值语句,主要用于对wire 型(连线型)变量赋值。例如:assign c=~(a&b); 在上面的赋值中,a、b、c三个变量皆为wire型变量,a和b 信号的任何变化,都将随时反映到c上来。 2. 过程赋值语句过程赋值语句多用于对reg型变量进行赋值。过程赋值有阻塞赋值和非阻塞赋值两种方式。 a. 非阻塞赋值方式非阻塞赋值符号为“<=”,如:b<=a; 非阻塞赋值在整个过程块结束时才完成赋值操作,即b的值并不是立刻就改变的。 b. 阻塞赋值方式阻塞赋值符号为“=”,如:b=a; 阻塞赋值在该语句结束时就立即完成赋值操作,即b的值在该语句结束时立刻改变。如果在一个块语句中(例如always块语句),有多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不能被执行,仿佛被阻塞了一样,因此称为阻塞赋值方式。

5.3.2 过程语句VerilogHDL中的多数过程模块都从属于以下2种过程语句:initial及always。在一个模块(module)中,使用initial和always语句的次数是不受限制的。initial语句常用于仿真中的初始化,initial过程块中的语句仅执行一次;always块内的语句则是不断重复执行的。1. initial过程语句initial过程语句使用格式如下:initial begin 语句1; 语句2; | 语句n; end intial语句不带触发条件,initial过程中的块语句沿时间轴只执行一次。initial语句通常用于仿真模块中对激励向量的描述,或用于给寄存器变量赋初值,它是面向模拟仿真的过程语句,通常不能被逻辑综合工具所接受。 2. aIways过程语句always 过程语句使用格式如下:always @ (<敏感信号表达式>) begin //过程赋值//if-else,case,casex,casez选择语句//while,repeat,for循环 //task,function调用end always过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中。只有当触发条件满足敏感信号表达式时,其后的“begin-end”块语句才能被执行。 3. 敏感信号表达式所谓敏感信号表达式又称事件表达式,即当该表达式中变量的值改变时,就会引发块内语句的执行,因此敏感信号表达式中应列出影响块内取值的所有信号。若有两个或两个以上信

VerilogHDL及其Testbench编写方法

Verilog HDL及其Testbench总结 (欢迎批评指正:jackhuan@https://www.sodocs.net/doc/2510615699.html,) 1 Verilog HDL的基本观点 1) 观点1:module内每个基本模块之间是并行运行的。 2) 观点2:每个模块相当于一个连续赋值的过程。 3) 观点3:方程和任务是共享代码的最基本方式。 4) 观点4:同语言可用于生成模拟激励和指定测试的验证约束条件。 5) 观点5:库的概念相当于Visual C++中的DLL概念。 6) 观点6:文件与文件之间的关系可以使用C++中的*.h和*.cpp之关系理解。 2 设计建模的三种方式 1) 行为描述方式。过程化结构,每个结构之间是并行的。 2) 数据流方式。连续赋值语句方式,每个赋值语句之间是并行的,且赋值语 句和结构之间是并行的。 3) 结构化方式。门和模块实例化语句。 3 两者数据类型 1) 线网数据类型wire:表示构件间的物理连线; 2) 寄存器数据类型reg:表示抽象的数据存储元件。 4 几个概念 1) 模块(module)。模块是Verilog HDL的基本描述耽误,用于描述某个设计 的功能或结构及其与其它模块通信的外部端口。一个设计的结构可以使用开关级原语、门级原语和用户定义的原语方式描述;数据流行为使用使用连续赋值语句进行描述;时序行为使用过程结构描述。模块的声明部分和语句可以散布在模块中的任何地方,但变量、寄存器、线网和参数说明必须在使用前出现。 2) 只有寄存器类型数据(reg/integer)能够在initial和always语句中被赋值。 3) 阻塞性和非阻塞性赋值。理解这两个概念在学习verilog HDL中非常重要。 决定了时序的正确与否。阻塞性赋值的概念是在该条赋值语句执行完成后再执行后面的语句,也就是说在执行该语句时,后面的语句是挂起的。而非阻塞性赋值的结果在何时执行是不知道的,但是可以预见在某个时间步内该语句一定能够执行完成,从这个意义上来看,非阻塞性赋值的语句类似于并行语句,稍有处理不当,会引发多驱动源问题。关于多驱动源问题,在我的VHDL总结中有所表述,此处不在费墨。 4) 用户定义原语(UDP)。UDP的定义不依赖于模块定义,因此出现在模块定 义之外,也可以在单独的文本文件中定义UDP。UDP只能有一个输出或一个/多个输入端口。UDP的行为以真值表的形式描述。 5) 并行语句块和顺序语句块。并行语句块中的各语句并行执行。当并行语句 块中的最后动作执行完成是,顺序语句块的语句继续执行。也就是说,并行语句块中的所有语句必须在控制转出语句块之前完成执行。并行语句块

相关主题