搜档网
当前位置:搜档网 › verilog语言的综合与不可综合

verilog语言的综合与不可综合

verilog语言的综合与不可综合
verilog语言的综合与不可综合

Verilog的综合与不可综合

综合说明编的代码可以对应出具体的电路,不可综合说明没有对应的电路结构。不可综合的代码编译通过,只能看到输出,不能实现电路,就是不能用来制作具体的芯片。

一、基本

Verilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。

二:verilog语句结构到门级的映射

1、连续性赋值:assign

连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。

2、过程性赋值:

过程性赋值只出现在always语句中。

阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。

建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。

过程性赋值的赋值对象有可能综合成wire,latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。

过程性赋值语句中的任何延时在综合时都将忽略。

建议同一个变量单一地使用阻塞或者非阻塞赋值。

3、逻辑操作符:

逻辑操作符对应于硬件中已有的逻辑门

4、算术操作符:

Verilog中将reg视为无符号数,而integer视为有符号数。因此,进行有符号操作时使用integer,使用无符号操作时使用reg。

5、进位:

通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如:

Wire [3:0] A,B;

Wire [4:0] C;

Assign C=A+B;

C的最高位用来存放进位。

6、关系运算符:

关系运算符:<,>,<=,>=

和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg,net还是integer。

7、相等运算符:==,!=

注意:===和!==是不可综合的。

可以进行有符号或无符号操作,取决于数据类型

8、移位运算符:

左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。

9、部分选择:

部分选择索引必须是常量。

10、BIT选择:

BIT选择中的索引可以用变量,这样将综合成多路(复用)器。

11、敏感表:

Always过程中,所有被读取的数据,即等号右边的变量都要应放在敏感表中,不然,综合时不能正确地映射到所用的门。

12、IF:

如果变量没有在IF语句的每个分支中进行赋值,将会产生latch。如果IF语句中产生了latch,则IF的条件中最好不要用到算术操作。Case语句类似。Case的条款可以是变量。如果一个变量在同一个IF条件分支中先赎值然后读取,则不会产生latch。如果先读取,后赎值,则会产生latch。

13、循环:

只有for-loop语句是可以综合的。

14、设计时序电路时,建议变量在always语句中赋值,而在该always语句外使用,使综合时能准确地匹配。建议不要使用局部变量。

15、不能在多个always块中对同一个变量赎值

16、函数

函数代表一个组合逻辑,所有内部定义的变量都是临时的,这些变量综合后为wire。

17、任务:

任务可能是组合逻辑或者时序逻辑,取决于何种情况下调用任务。

18、Z:

Z会综合成一个三态门,必须在条件语句中赋值

19、参数化设计:

优点:参数可重载,不需要多次定义模块

四:模块优化

1、资源共享:

当进程涉及到共用ALU时,要考虑资源分配问题。可以共享的操作符主要有:关系操作符、加减乘除操作符。通常乘和加不共用ALU,乘除通常在其内部共用。

2、共用表达式:

如:C=A+B;

D=G+(A+B);

两者虽然有共用的A+B,但是有些综合工具不能识别.可以将第二句改为:D=G+C;这样只需两个加法器.

3、转移代码:

如循环语句中没有发生变化的语句移出循环.

4、避免latch:

两种方法:1、在每一个IF分支中对变量赋值。2、在每一个IF语句中都对变量赋初值。

5:模块:

综合生成的存储器如ROM或RAM不是一种好方法。最好用库自带的存储器模块。

五、验证:

1、敏感表:

在always语句中,如果敏感表不含时钟,最好将所有的被读取的信号都放在敏感表中。

2、异步复位:

建议不要在异步时对变量读取,即异步复位时,对信号赎以常数值。欢迎进入超前MCU 技术论坛对关于verilog综合-个人小结进行讨论!

1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。

2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。

3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。

建立可综合模型的原则:要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:

1)不使用initial。

2)不使用#10。

3)不使用循环次数不确定的循环语句,如forever、while等。

4)不使用用户自定义原语(UDP元件)。

5)尽量使用同步方式设计电路。

6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。

7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。

8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。

9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。

10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。

11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。

12)避免混合使用上升沿和下降沿触发的触发器。

13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。

14)避免在case语句的分支项中使用x值或z值。

不可综合语句:

1)initial 只能在test bench中使用,不能综合。

2)events event在同步test bench时更有用,不能综合。

3)real 不支持real数据类型的综合。

4)time 不支持time数据类型的综合。

5)force 和release 不支持force和release的综合。

6)assign 和deassign 不支持对reg 数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。

7)fork join 不可综合,可以使用非块语句达到同样的效果。

8)primitives 支持门级原语的综合,不支持非门级原语的综合。

9)table 不支持UDP 和table的综合。

10)敏感列表里同时带有posedge和negedge

如:always @(posedge clk or negedge clk) begin...end

这个always块不可综合。

11)同一个reg变量被多个always块驱动

12)延时以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。如:a=#10 b;这里的#10是用于仿真时的延时,在综合的时候综合工具会忽略它。也就是说,在综合的时候上式等同于a=b;

13)与X、Z的比较

可能会有人喜欢在条件表达式中把数据和X(或Z)进行比较,殊不知这是不可综合的,综合工具同样会忽略。所以要确保信号只有两个状态:0或1。

来自:人人网日志

可综合指那些可以综合成FPGA(ASIC)中某种结构的语言要素。而不可综合则主要用于设计的验证、仿真。比如流行的quartusII或xinlinx软件只支持可综合的verilog语言。

因为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是常常用它在testbench中来产生一个clock信号。再比如常常用到的大容量memory, 一般是不会在片上实现的,这个时候也需要一个unsynthesizable module. mengxy所言切中肯罄。

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

我想,用过verilog_xl的兄弟应该深有体会。verilog_xl里的操作,可以用verilog 里的系统命令来完成。通过最近的应聘我也深有体会,很多公司看中你在写code时,是否考虑到timing,architecture,DFT等,这也说明verilog中的任何语句都是非常重要的。

要写代码前必须对具体的硬件有一个比较清晰的概念。但是想一次完成可综合代码就太夸张了,verilog的自顶向下设计方法就是从行为建模开始的,功能验证了以后再转向可综

合模型.太在意与可综合令初期设计变得太累

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

VerilogHDL经典程序非常适合新手

一、2线-4线译码器 module counter4(q1,q0,ncr,cp); input cp,ncr; output q1,q0; reg q1,q0; always@(posedge cp or negedge ncr) begin if(~ncr){q1,q0}<=2'b00; else{q1,q0}<={q1,q0}+1'b1; end endmodule 二、4选1数据选择器 module selector4_1(i0,i1,i2,i3,a1,a0,y); input i0,i1,i2,i3,a1,a0; output y; reg y; always@(a1or a0) begin case({a1,a0}) 2'b00:y=i0; 2'b01:y=i1; 2'b10:y=i2; 2'b11:y=i3; default:y=0; 一、2线-4线译码器 module counter4(q1,q0,ncr,cp); input cp,ncr; output q1,q0; reg q1,q0; always@(posedge cp or negedge ncr) begin if(~ncr){q1,q0}<=2'b00; else{q1,q0}<={q1,q0}+1'b1; end endmodule 二、4选1数据选择器 module selector4_1(i0,i1,i2,i3,a1,a0,y); input i0,i1,i2,i3,a1,a0; output y; reg y; always@(a1or a0) begin case({a1,a0}) 2'b00:y=i0;

Verilog语言基础知识

Verilog HDL语言基础知识 先来看两个Verilog HDL程序。 例一个8位全加器的Verilog HDL源代码 module adder8(cout,sum,ina,inb,cin); output[7:0] sum; output cout; input[7:0] ina,inb; input cin; @ assign {cout,sum}=ina+inb+cin; 模块的端口声明了模块的输人和输出口。其格式如下: module 模块名(口1,口2,口3,口4,……); 2.模块内容 模块内容包括I/O说明,信号类型声明和功能定义。 (1) I/O说明的格式如下: ; 输人口: input端口名1,端口名2,……端口名N; 输出口: output端口名l,端口名2,……端口名N; I/O说明也可以写在端口声明语句里。其格式如下: module module_name(input portl,input port2,…output portl,output port2,…); (2)信号类型声明: 它是说明逻辑描述中所用信号的数据类型及函数声明。如 ( reg[7:0] out; 数字 (1)整数

在Verilog HDL中,整数型常量(即整常数)有以下4种进制表示形式: ◇二进制整数(b或B); ◇十进制整数(d或D); ◇十六进制整数(h或H); ◇八进制整数(o或O)。 ) 完整的数字表达式为: <位宽>'<进制> <数字>, 位宽为对应二迸制数的宽度,如: 8'b nets型变量wire nets型变量指输出始终根据输入的变化而更新其值的变量,它一般指的是硬件电路中的各种物理连接。Verilog HDL中提供了多种nets型变量,具体见表。 这里着重介绍wire型变量。wire是一种常用的nets型变量,wire型数据常用来表示assign语句赋值的组合逻辑信号。Verilog HDL模块中的输入/输出信号类型缺省时自动定义为wire型。Wire型信号可以用作任何方程式的输入,也可以用作assign语句和实例元件的输出,其取值为0,1,x,z。 wire型变量格式如下: & ⑴.定义宽度为1位的变量: wire 数据名1,数据名2,……数据名n; 例如:wire a,b; register型变量reg register型变量对应的是具有状态保持作用的电路元件,如触发器、寄存器等。register

verilog语言的综合与不可综合

Verilog的综合与不可综合 综合说明编的代码可以对应出具体的电路,不可综合说明没有对应的电路结构。不可综合的代码编译通过,只能看到输出,不能实现电路,就是不能用来制作具体的芯片。 一、基本 Verilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。 二:verilog语句结构到门级的映射 1、连续性赋值:assign 连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。 2、过程性赋值: 过程性赋值只出现在always语句中。 阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。 建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。 过程性赋值的赋值对象有可能综合成wire,latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。 过程性赋值语句中的任何延时在综合时都将忽略。 建议同一个变量单一地使用阻塞或者非阻塞赋值。 3、逻辑操作符: 逻辑操作符对应于硬件中已有的逻辑门 4、算术操作符: Verilog中将reg视为无符号数,而integer视为有符号数。因此,进行有符号操作时使用integer,使用无符号操作时使用reg。 5、进位: 通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如: Wire [3:0] A,B; Wire [4:0] C; Assign C=A+B; C的最高位用来存放进位。 6、关系运算符: 关系运算符:<,>,<=,>= 和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg,net还是integer。

Verilog语言的特点

一、第一章 1.几个英文缩写: PLA(Programmable Logic Array)可编程逻辑阵列 FPGA(Field Programmable Gate Array)现场可编程逻辑门阵列 CPLD(Complex Programmable Logic Device)复杂可编程逻辑器件 CAD(Computer Aided Design) 计算机辅助设计 CAE(computer aided engineering) EDA(electronic design automation) 电子设计自动化 2.EDA定义:以计算机为工作平台,以EDA软件为开发环境,以PLD器件或者ASIC专用 集成电路为目标器件设计实现电路系统的一种技术。 3.现代EDA技术的特征【简答】 (1)采用硬件描述语言(HDL)进行设计 HDL语言更适合于描述规模大、功能复杂的数字系统,使设计者在比较抽象的层次上对所设计系统的结构和逻辑功能进行描述。 (2)逻辑综合与优化 目前EDA工具最高只能接受行为级和RTL级描述的HDL文件进行逻辑综合 (3)开放性和标准化 普遍采用标准化和开放性的框架结构,可以与其他的EDA工具一起进行设计工作,实现各种工具的优化组合,集成在一个易于管理的统一环境下,实现资源共享提高工作效率,利于大规模设计。 (4)更完备的库(Library) 在电路设计的各个阶段,EDA系统需要不同层次、不同种类的元器件模型库的支持。EDA 工具要具有更强大的设计能力和更高的设计效率,必须配有丰富的库。各种模型库的功能和规模是衡量EDA工具优劣的一个标志 4.基于EDA技术的设计思路(P4~P5) (1)Top-down设计,即自顶向下的设计 将设计分成几个不同的层次:系统级、功能级、门级、开关级, 按照自上而下的顺序,在不同的层次上对系统进行设计和仿真。 首先从系统设计入手,在顶层进行功能框图的划分和机构设计。 在功能级进行仿真纠错,并用HDL对高层次的系统行为进行描 述,然后用综合工具将设计转化为具体门电路网表。 Top-down的设计须经过“设计—验证—修改设计—再验证”的 过程,不断反复,直到结果能够实现所要求的功能,并在速度、 功耗、价格和可靠性方面实现较为合理的平衡。 (2)Bottom-up设计,即自底向上的设计 设计者选择标准集成电路,或者将各种基本单元做成基本单元库,调用这些基本单元,直到设计出满足需要的系统。缺点:效率低、易出错 5.IP核的一些概念(intellectual property) IP核(IP模块):指功能完整,性能指标可靠,已验证的、可重用的电路功能模块。分为硬核、固核、软核。 (1)软核:如ARM。是指在寄存器级或门级对电路功能用HDL描述,表现为用VHDL 等硬件描述语言描述的功能块,但是并不涉及用什么具体电路元件实现这些功能。 (2)硬核:以版图形式实现的设计模块,基于一定的设计工艺。供设计的最终阶段产品: 掩膜。

VHDL语言的主要描述语句

VHDL语言的主要描述语句 按照语句的执行顺序对VHDL语言进行分类,包含两类语句: 并行描述语句该语句的执行与书写顺序无关,总是同时被执行 顺序描述语句从仿真的角度,该语句是顺序执行的 进程语句(PROCESS)是最典型的并行语句,一个构造体内可以有几个进程语句同时存在,而且并发执行。但是进程内部的所有语句都是顺序语句。 一、顺序描述语句 顺序描述语句只能用在进程和子程序中,它和其他高级语言一样,其语句是按照语句的出现的顺序加以执行的。如下分别介绍有关的顺序描述语句. 1.WAIT语句 进程在执行过程中总是处于两种状态:执行或挂起,进程的状态变化受等待语句的控制,当进程执行到等待语句,就被挂起,并等待再次执行进程. 等待语句的格式: *WAIT 无限等待 *WAIT ON 敏感信号变化 *WAIT UNTIL 条件满足 *WAIT FOR 时间到 (1)WAIT ON 格式:WAIT ON 信号[,信号] 例5-1 PROCESS(a,b) BEGIN y<=a AND b;

END PROCESS; 该例中的进程与下例中进程相同: 例5-1 PROCESS BEGIN y<=a AND b; WAIT ON a,b; END PROCESS; 例5-2 PROCESS(a,b) BEGIN y<=a AND b; WAIT ON a,b; END PROCESS; (2)WAIT UNTIL 直到条件满足 格式: WAIT UNTIL 布尔表达式 当进程执行到该语句时,被挂起;若布尔表达式为真时,进程将被启动.例: WAIT UNTIL ((x*10)<100) (3)WAIT FOR等到时间到 格式: WAIT FOR 时间表达式 当进程执行到该语句时,被挂起;等待一定的时间后,进程将被启动.例: WAIT FOR 20 ns; WAIT FOR (a*(b+c);

Verilog语言基础教程

Verilog HDL Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象 设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 =============================== 中文版Verilog HDL简明教程:第1章简介 Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 历史 Verilog HDL语言最初是于1983年由Gateway Design Automation公司为其模

verilog语言编写8位全加器

8位全加器 一、实验目的 用verilog语言编写一个8位全加器,并在modelsim软件上进行仿真。 二、代码 1、源代码: module add8(sum,cout,in1,in2,cin); input [7:0] in1,in2; input cin; output [7:0] sum; output cout; assign {cout,sum}=in1+in2+cin; endmodule 2、激励: `timescale 1ns/100ps module add8_tb; reg[7:0] A,B; reg CIN; wire [7:0] SUM; wire COUT; add8 ul( .sum(SUM), .cout(COUT), .in1(A), .in2(B), .cin(CIN)

); initial begin A=8'd0;B=8'd0;CIN=1'b0; #10 A=8'd20;B=8'd129;CIN=1'b1; #10 A=8'd27;B=8'd19;CIN=1'b0; #10 A=8'd157;B=8'd29;CIN=1'b0; #10 A=8'd37;B=8'd68;CIN=1'b0; #10 A=8'd11;B=8'd69;CIN=1'b0; #10 A=8'd54;B=8'd67;CIN=1'b1; #10 A=8'd211;B=8'd0;CIN=1'b0; #10 A=8'd87;B=8'd43;CIN=1'b1; #10 A=8'd23;B=8'd171;CIN=1'b0; #10 A=8'd12;B=8'd12;CIN=1'b1; #10 A=8'd112;B=8'd115;CIN=1'b0; end endmodule 三、实验过程 1、上机过程 2、仿真波形 3、波形说明 波形图中,从上至下依次为:输入加数A、输入加数B、输入进位CIN、输出进位COUT、输出和SUM。该程序实现的是A+B+CIN=SUM+COUT。 0+0+0=0; 20+129+1=150;

VHDL经典教程(精简快速入门版)

3 VHDL语言 VHDL: VHSIC Hardware Description Language. 3.1 VHDL语言基础 3.2 VHDL基本结构 3.3 VHDL语句 3.4 状态机在VHDL中的实现 3.5 常用电路VHDL程序 3.6 VHDL仿真 3.7 VHDL综合

HDL----Hardware Description Language 一种用于描述数字电路的功能或行为的语言。目的是提为电路设计效率,缩短设计周期,减小设计成本,可在芯片制造前进行有效的仿真和错误检测。 优点: HDL设计的电路能获得非常抽象级的描述。如基于RTL(Register Transfer Level)描述的IC,可用于不同的工艺。 HDL设计的电路,在设计的前期,就可以完成电路的功能级的验证。HDL设计的电路类似于计算机编程。 常用的HDL语言:VHDL 、Verilog HDL

?VHDL 是美国国防部在20世纪80年代初为实现其高速集成电路硬件VHSIC 计划提出的描述语言; ?IEEE 从1986年开始致力于VHDL 标准化工作,融合了其它 ASIC 芯片制造商开发的硬件描述语言的优点,于93年形成了标 准版本(IEEE.std_1164)。 ?1995年,我国国家技术监督局推荐VHDL 做为电子设计自动化硬件描述语言的国家标准。 VHDL 概述: VHDL VHSIC Hardwarter Description Language Very High speed integrated circuit VHSIC

VHDL优点: ?覆盖面广,系统硬件描述能力强,是一个多层次的硬件描述语言; ?VHDL语言具有良好的可读性,既可以被计算机接受,也容易被人们所理解; ?VHDL语言可以与工艺无关编程; ?VHDL语言已做为一种IEEE的工业标准,便于使用、交流和推广。 VHDL语言的不足之处: 设计的最终实现取决于针对目标器件的编程器,工具的不同会导致综合质量不一样。

最新整理Systemverilog语言简介.doc

SystemVerilog语言简介 SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE 1364-20 xx Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了C语言数据类型、结构、压缩和非压缩数组、接口、断言等等,这些都使得SystemVerilo g在一个更高的抽象层次上提高了设计建模的能力。SystemVerilog由Acceller a开发,它主要定位在芯片的实现和验证流程上,并为系统级的设计流程提供了强大的连接能力。下面我们从几个方面对SystemVerilog所作的增强进行简要的介绍,期望能够通过这个介绍使大家对SystemVerilog有一个概括性的了解。 1. 接口(Interface) Verilog模块之间的连接是通过模块端口进行的。为了给组成设计的各个模块定义端口,我们必须对期望的硬件设计有一个详细的认识。不幸的是,在设计的早期,我们很难把握设计的细节。而且,一旦模块的端口定义完成后,我们也很难改变端口的配置。另外,一个设计中的许多模块往往具有相同的端口定义,在Verilog中,我们必须在每个模块中进行相同的定义,这为我们增加了无谓的工作量。 SystemVerilog提供了一个新的、高层抽象的模块连接,这个连接被称为接口(Interface)。接口在关键字interface和endinterface之间定义,它独立于模块。接口在模块中就像一个单一的端口一样使用。在最简单的形式下,一个接口可以认为是一组线网。例如,可以将PCI总线的所有信号绑定在一起组成一个接口。通过使用接口,我们在进行一个设计的时候可以不需要首先建立各个模块间的互连。随着设计的深入,各个设计细节也会变得越来越清晰,而接口内的信号也会很容易地表示出来。当接口发生变化时,这些变化也会在使用该接口的所有模块中反映出来,而无需更改每一个模块。下面是一个接口的使用实例:interface chip_bus; // 定义接口 wire read_request, read_grant; wire [7:0] address, data; endinterface: chip_bus module RAM (chip_bus io, // 使用接口 input clk); // 可以使用io.read_request引用接口中的一个信号 endmodule module CPU(chip_bus io, input clk); ...

VERILOG语言编写规范

VERILOG语言编写规范 1 目的 本规范的目的是提高书写代码的可读性可修改性可重用性,优化代码综合和仿真 结果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范化公司的ASIC设计输入从而做到 1. 逻辑功能正确 2.可快速仿真 3. 综合结果最优如果是hardware model) 4. 可读性较好。 2 范围 本规范涉及Verilog HDL编码风格,编码中应注意的问题, Testbench的编码等。 本规范适用于Verilog model的任何一级( RTL behavioral, gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。 3 定义 Verilog HDL : Verilog 硬件描述语言 FSM :有限状态机 伪路径:静态时序分析( STA)认为是时序失败,而设计者认为是正确的路径 4 引用标准和参考资料 下列标准包含的条文通过在本标准中引用而构成本标准的条文在标准出版时所示版本 均为有效所有标准都会被修订使用本标准的各方应探讨使用下列标准最新版本的可能性 Actel HDLCoding Style Guider Sun Microsystems Revision VerilogStyle and Coding Guidelines 5 规范内容 Verilog 编码风格 本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级( RTL behavioral,gate_level) 也适用于出于仿真,综合或二者结合的目的而设计的模 块。

命名规范 选择有意义的信号和变量名,对设计是十分重要的。命名包含信号或变量诸如出处,有效状态等基本含义下面给出一些命名的规则。 1. 用有意义而有效的名字 有效的命名有时并不是要求将功能描述出来如 For ( I = 0; I < 1024; I = I + 1 ) Mem[I]<= #1 32’b0; For 语句中的循环指针I 就没必要用loop_index作为指针名。 2. 用连贯的缩写 长的名字对书写和记忆会带来不便,甚至带来错误采用缩写时应注意同一信号在模块中的一致性。缩写的例子如下: Addr address Pntr pointer Clk clock Rst reset 3. 用名字前加小写n表示低电平有效高电平有效的信号不得以下划线表示短暂 的引擎信号建议采用高有效 如 nRst, nTrdy, nIrdy nIdsel. 4. 大小写原则 名字一般首字符大写,其余小写(但parameter, integer 定义的数值名可全部用大写),两个词之间要用下划线连接(或第二个单词首字母大写) 如 :Packet_addr, Data_in, Mem_wr , Mem_ce_ Or: PacketAddr, DataIn, MemWr , MemCe 5.全局信号名字中应包含信号来源的一些信息 如: D_addr[7:2] 这里的 D 指明了地址是解码模块(Decoder module)中的地址. 6. 同一信号在不同层次应保持一致性 7. 自己定义的常数类型等用大写标识 如: parameter CYCLE=100. 8.避免使用保留字 如 in out x z等不能够做为变量端口或模块名

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语言介绍

学院姜小波电子信息学院 电子信息

Verilog的历史 什么是HDL Why HDL Why HDL Verilog程序的基本结构 三种建模方式 测试验证

Verilog的历史 什么是HDL Why HDL Why HDL Verilog程序的基本结构 三种建模方式 测试验证

Verilog HDL的历史 ISP (circa 1977) ‐research Simulation, no synthesis ◆project at CMU Simulation but ◆1983年,GDA(Gateway Design Automation)公司发布了verilog硬件描述语言, 即“verilog HDL”,或简称为“verilog”,以及verilog仿真器。 ◆1985年,这门语言及仿真器得到加强改进;仿真器在新的译本中称为 年这门语言及仿真器得到加强改进仿真器在新的译本中称为“Verilog‐XL”。 ◆1987年,Synopsys开始使用Verilog行为语言作为综合产品的输入。 ◆1989年,Cadence公司收购了GDA公司。 年公司 ◆1990年,Cadence公司成立了Open Verilog International(OVI)组织,以控制 Verilog HDL语言的所有权。几乎所有专有集成电路公司支持Verilog语言,并且将Verilog XL作为黄金仿真器。 ‐ ◆1993年,在提交到ASIC公司的所有设计中,有85%的设计使用了Verilog HDL。 ◆1995年,IEEE制定了Verilog HDL的IEEE标准,即Verilog HDL1364‐1995。 到现在,Verilog与VHDL成为最广泛使用的、具有国际标准支持的硬件描 到现在Verilog与VHDL成为最广泛使用的具有国际标准支持的硬件描述语言,绝大多数的芯片生产厂家都支持这两种描述语言;在工业界由于Verilog HDL的一些优点,应用更加广泛。

用verilog语言设计四位简单计算器

module jsq(clk,keyin,keyout,leda,ledb,num3); input clk; input [3:0]keyin; output [3:0]keyout; reg [3:0]keyout; output [3:0]leda; reg [3:0]leda; output [3:0]ledb; reg [3:0]ledb; integer clk_klv; output [31:0]num3; always @(posedge clk) //分频 clk_klv=clk_klv+1; reg [1:0]keyhang=0; //按键扫描 reg [3:0]keynum=0; //最近按键的值

reg keyen=0; //按键锁定作用,每次都必须重新按下才有效 reg keysign=0; //当前按键的属性,0代表数字,1代表+-*/=复位 reg [7:0]delay=0; //按键消抖 reg order2=0; //作用:延迟一个时钟,keyen跳变输出,确保keynum被赋值 always @(posedge clk_klv[10]) begin if(order2==0) begin case({keyhang,keyin}) 6'b00_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h0; order2=1;end end 6'b00_1101: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h1; order2=1;end end 6'b00_1011: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h2; order2=1;end end 6'b00_0111: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h3; order2=1;end end 6'b01_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h4; order2=1;end end 6'b01_1101: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h5; order2=1;end end 6'b01_1011: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h6; order2=1;end end 6'b01_0111: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h7; order2=1;end end 6'b10_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h8; order2=1;end end 6'b10_1101: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h9; order2=1;end end 6'b10_1011: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'ha; order2=1;end end 6'b10_0111: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hb; order2=1;end end 6'b11_1110: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hc; order2=1;end end 6'b11_1101: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hd; order2=1;end end 6'b11_1011: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'he; order2=1;end end 6'b11_0111: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hf; order2=1;end end default: begin keyhang=keyhang+1;delay=delay+1;if(delay>=100)keyen=0;end endcase

Verilog语言介绍

六.Verilog HDL语言介绍 6.1 Verilog HDL基本结构 6.1.1 简单的Verilog HDL 例子 首先来看两个简单的Verilog HDL程序。 【例6.1】一个8位全加器的 Verilog HDL源代码 module adder8(cout,sum,ina,inb,cin); output[7:0] sum; output cout; input[7:0] ina,inb; input cin; assign {cout,sum}=ina+inb+cin; //全加 endmodule 【例6.2】一个8位计数器的Verilog HDL源代码 module counter8(out,cout,data,load,cin,clk); output[7:0] out; output cout; input[7:0] data; input load,cin,clk; reg[7:0] out; always @(posedge clk) begin if(load) out=data; else out=out+cin; end assign cout=&out&cin; endmodule 从上面的例子可以看出: ① Verilog HDL程序是由模块构成的。每个模块的内容都是嵌在module 和endmodule 两个语句之间,每个模块实现特定的功能,模块是可以进行层次嵌套的。 ②每个模块首先要进行端口定义,并说明输入(input)和输出(output),然后对模块的功能进行逻辑描述。 ③Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分多行

相关主题