1、硬件描述语言及通信系统设计硬件描述语言及通信系统设计 相关安排相关安排8个学时理论(个学时理论(40分)分)+24学时设计(学时设计(60分)分)内容:内容:1 Verilog HDL 4学时学时 (20分)分)2 VHDL 4学时学时 (20分)分)3 设计设计24学时学时 4个课题(每个个课题(每个15分)分)1引言引言 嵌入式?嵌入式?顾名思义,嵌入式系统指的是嵌入到系统内部的计算顾名思义,嵌入式系统指的是嵌入到系统内部的计算机系统,是面向特定应用设计的专用计算机系统。机系统,是面向特定应用设计的专用计算机系统。早期的嵌入式系统一般是以通用处理器或单片机为核心早期的嵌入式系统一般是以通用
2、处理器或单片机为核心,在外围电路中加入存储器、功率驱动器、通信接口、显示,在外围电路中加入存储器、功率驱动器、通信接口、显示接口、人机输入接口等外围接口,再加上应用软件,有些还接口、人机输入接口等外围接口,再加上应用软件,有些还加上了嵌入式操作系统,从而构成完整的系统。加上了嵌入式操作系统,从而构成完整的系统。随着微电子技术的进步,随着微电子技术的进步,SoC已经在很多应用中取代了已经在很多应用中取代了传统的以单片机为中心的架构,将很多外设和存储器集成在传统的以单片机为中心的架构,将很多外设和存储器集成在一个芯片中,使系统的功耗和体积越来越小,而功能却越来一个芯片中,使系统的功耗和体积越来越小
3、,而功能却越来越强。越强。引言引言 FPGA在嵌入式系统中的应用前景在嵌入式系统中的应用前景 现在的现在的MCU和和DSP的功能已经非常强了,但处理能力的功能已经非常强了,但处理能力毕竟还是有限的,厂商在推出一款器件的时候,其性能就已毕竟还是有限的,厂商在推出一款器件的时候,其性能就已经固定了。当某一款产品的性能无法满足要求时,就必须选经固定了。当某一款产品的性能无法满足要求时,就必须选用新的处理器,常常意味着重新进行用新的处理器,常常意味着重新进行PCB的设计,重新进行的设计,重新进行各项软硬件的验证测试,所导致的工程资源的浪费是非常惊各项软硬件的验证测试,所导致的工程资源的浪费是非常惊人的
4、。人的。FPGA是通过逻辑组合来实现各种功能的器件,几乎可是通过逻辑组合来实现各种功能的器件,几乎可以进行任何类型的处理;对于常用的数字信号处理,有些以进行任何类型的处理;对于常用的数字信号处理,有些FPGA专门还提供了专门还提供了DSP模块来实现加速;模块来实现加速;FPGA的并行处理架构非常适合图像处理、数字信号处的并行处理架构非常适合图像处理、数字信号处理等运算密集的应用;用某款芯片无法满足要求时,还可以理等运算密集的应用;用某款芯片无法满足要求时,还可以通过使用同样封装且容量更大的通过使用同样封装且容量更大的FPGA芯片来提供更高的处芯片来提供更高的处理能力,这样就可以保持管脚的兼容性
5、,从而无须对理能力,这样就可以保持管脚的兼容性,从而无须对PCB板板进行修改;进行修改;FPGA的可编程性使设计工程师可以随时对设计进行修的可编程性使设计工程师可以随时对设计进行修改,即使在产品部署后也能对设计错误进行更正;改,即使在产品部署后也能对设计错误进行更正;FPGA不但可以完成不但可以完成MCU和和DSP的各种功能,还可以根的各种功能,还可以根据需要生成新的功能,或者调配各项功能之间的资源配比,据需要生成新的功能,或者调配各项功能之间的资源配比,使同一个硬件电路设计可以满足不同的应用需求;使同一个硬件电路设计可以满足不同的应用需求;FPGA还可以利用现成的处理器内核,直接生成软处理还
6、可以利用现成的处理器内核,直接生成软处理器,并在其上运行操作系统。器,并在其上运行操作系统。由于由于FPGA是通过逻辑组合来实现功能的,所以其功耗是通过逻辑组合来实现功能的,所以其功耗和成本一般高于和成本一般高于MCU和和DSP。在几年前,。在几年前,FPGA给人的印象给人的印象一直是高高在上的价格,除了通信、航天、军工、工业等少一直是高高在上的价格,除了通信、航天、军工、工业等少数行业,数行业,FPGA更多地是在扮演原型验证开发的角色,在消更多地是在扮演原型验证开发的角色,在消费类电子等更广大的市场中迟迟未打开局面。费类电子等更广大的市场中迟迟未打开局面。随着随着Xilinx和和Altera
7、竞相采用新的制造工艺,其单位门电竞相采用新的制造工艺,其单位门电路的价格下降得比路的价格下降得比ASIC还要快,价格在很多应用中已不再还要快,价格在很多应用中已不再是障碍了。特别是在一些需要特定功能的应用中,设计师在是障碍了。特别是在一些需要特定功能的应用中,设计师在市场上找不到可以满足要求的器件,他们就必须自己开发市场上找不到可以满足要求的器件,他们就必须自己开发ASIC芯片,或者用芯片,或者用FPGA进行设计。但开发进行设计。但开发ASIC的成本和的成本和风险在不断提高,甚至超过了未来的收益,用风险在不断提高,甚至超过了未来的收益,用FPGA就成了就成了一个非常实际的选择一个非常实际的选择
8、。VHDL 还是还是 Verilog HDL 硬件描述语言硬件描述语言HDL是一种用形式化方法描述数字电路和是一种用形式化方法描述数字电路和系统的语言。利用这种语言,数字电路系统的设计可以从上系统的语言。利用这种语言,数字电路系统的设计可以从上层到下层(从抽象到具体)逐层描述自己的设计思想,用一层到下层(从抽象到具体)逐层描述自己的设计思想,用一系列分层次的模块来表示极其复杂的数字系统。然后,利用系列分层次的模块来表示极其复杂的数字系统。然后,利用电子设计自动化(电子设计自动化(EDA)工具,逐层进行仿真验证,再把其)工具,逐层进行仿真验证,再把其中需要变为实际电路的模块组合,经过自动综合工具
9、转换到中需要变为实际电路的模块组合,经过自动综合工具转换到门级电路网表。接下去,再用专用集成电路门级电路网表。接下去,再用专用集成电路ASIC或现场可或现场可编程门阵列编程门阵列FPGA自动布局布线工具,把网表转换为要实现自动布局布线工具,把网表转换为要实现的具体电路布线结构。的具体电路布线结构。目前,这种高层次目前,这种高层次(high-level-design)的方法已被广泛的方法已被广泛采用。据统计,目前在美国硅谷约有采用。据统计,目前在美国硅谷约有90%以上的以上的ASIC和和FPGA采用硬件描述语言进行设计采用硬件描述语言进行设计 。20世纪世纪80年代后期,年代后期,VHDL和和V
10、erilog HDL语言适应了语言适应了这种趋势的要求,先后成为这种趋势的要求,先后成为IEEE标准。标准。现在,随着系统级现在,随着系统级FPGA以及系统芯片的出现,软硬件以及系统芯片的出现,软硬件协调设计和系统设计变得越来越重要。传统意义上的硬件设协调设计和系统设计变得越来越重要。传统意义上的硬件设计越来越倾向于与系统设计和软件设计结合。硬件描述语言计越来越倾向于与系统设计和软件设计结合。硬件描述语言为适应新的情况,迅速发展,出现了很多新的硬件描述语言为适应新的情况,迅速发展,出现了很多新的硬件描述语言,像,像Superlog、SystemC、Cynlib C+等等。等等。如何选择:如何选
11、择:对于特大型的系统级数字电路设计,对于特大型的系统级数字电路设计,VHDL是较为合适的。是较为合适的。对于一个系统芯片设计项目,可以采用的方案有多种:对于一个系统芯片设计项目,可以采用的方案有多种:最传统的办法是,在系统级采用最传统的办法是,在系统级采用VHDL,在软件级采用,在软件级采用C语言,在实现级采用语言,在实现级采用Verilog。目前,。目前,VHDL与与Verilog的的互操作性已经逐步走向标准化,但软件与硬件的协调设计还互操作性已经逐步走向标准化,但软件与硬件的协调设计还是一个很具挑战性的工作,因为软件越来越成为是一个很具挑战性的工作,因为软件越来越成为SOC设计的设计的关键
12、。该方案的特点是:风险小,集成难度大,与原有方法关键。该方案的特点是:风险小,集成难度大,与原有方法完全兼容,有现成的开发工具;但工具集成由开发者自行负完全兼容,有现成的开发工具;但工具集成由开发者自行负责完成。责完成。108 8 循环语句循环语句9 9 结构说明语句结构说明语句10 10 编译预处理语句编译预处理语句11 11 语句的顺序执行与并行执行语句的顺序执行与并行执行12 12 不同抽象级别的不同抽象级别的VerilogVerilog HDL HDL模型模型13 13 设计技巧设计技巧1 1 引言引言2 2 VerilogVerilog HDL HDL基本结构基本结构3 3 数据类型
13、及常量、变量数据类型及常量、变量4 4 运算符及表达式运算符及表达式5 5 语句语句6 6 赋值语句和块语句赋值语句和块语句7 7 条件语句条件语句硬件描述语言硬件描述语言VerilogVerilog HDL HDL11 1 1 引言引言一、什么是一、什么是VerilogVerilog HDL HDL二、二、VerilogVerilog HDL HDL的发展历史的发展历史三、不同层次的三、不同层次的VerilogVerilog HDL HDL抽象抽象 四、四、VerilogVerilog HDL HDL的特点的特点12 1 1 引言引言一、一、什么是什么是Verilog HDL Verilog
14、 HDL是一种用于是一种用于数字数字逻辑电路设计的硬件描述逻辑电路设计的硬件描述语言(语言(Hradware Description Language),可以用来进,可以用来进行数字电路的仿真验证、时序分析、逻辑综合。行数字电路的仿真验证、时序分析、逻辑综合。用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。Verilog HDL 既是一种行为描述语言也是一种结构描述语言。既可以用电路的功能描述,也可以用元器件及其之间的既可以用电路的功能描述,也可以用元器件及其之间的连接来建立连接来建立VerilogVerilog HDL HDL模型。模型。13 1 1 引言引言二
15、、二、VerilogVerilog HDL HDL的发展历史的发展历史 1983年,由年,由GDA(GateWay Design Automation)公)公司的司的Phil Moorby首创;首创;1989年,年,Cadence公司收购了公司收购了GDA公司;公司;1990年,年,Cadence公司公开发表公司公开发表Verilog HDL;1995年年,IEEE制定并公开发表制定并公开发表Verilog HDL1364-1995标准;标准;1999年,模拟和数字电路都适用的年,模拟和数字电路都适用的Verilog标准公开标准公开发表发表14 1 1 引言引言三、不同层次的三、不同层次的Ve
16、rilogVerilog HDL HDL抽象抽象 VerilogVerilog HDL HDL模型可以是实际电路的不同级别的抽象。模型可以是实际电路的不同级别的抽象。抽象级别可分为抽象级别可分为五五级:级:系统级系统级(system level):(system level):用高级语言结构(如case语句)实现的设计模块外部性能的模型;算算法级法级(algorithmic level):(algorithmic level):用高级语言结构实现的设计算法模型(写出逻辑表达式);RTLRTL级级(register transfer level):(register transfer level
17、):描述数据在寄存器之间流动和如何处理这些数据的模型;门级门级(gate level):(gate level):描述逻辑门(如与门、非门、或门、与非门、三态门等)以及逻辑门之间连接的模型;开关级开关级(switch level):(switch level):描述器件中三极管和储存节点及其之间连接的模型。返回返回3.1215 1 1 引言引言四、四、VerilogVerilog HDL HDL的特点的特点 语法结构上的主要语法结构上的主要特点特点:形式化地表示电路的行为和结构;借用C语言的结构和语句;可在多个层次上对所设计的系统加以描述,语言对设计规模不加任何限制;具有混合建模能力:一个设计
18、中的各子模块可用不同级别的抽象模型来描述;基本逻辑门、开关级结构模型均内置于语言中,可直接调用;易创建用户定义原语(UDP,User Designed Primitive)。易学易用,功能强易学易用,功能强与与C C语言语言非常相非常相似似!16 2 2 VerilogVerilog HDL HDL基本结构基本结构一、简单的一、简单的VerilogVerilog HDL HDL例子例子二、二、VerilogVerilog HDL HDL模块的结构模块的结构三、逻辑功能定义三、逻辑功能定义四、关键字四、关键字五、标识符五、标识符六、编写六、编写VerilogVerilog HDL HDL源代码的
19、标准源代码的标准17 2 2 VerilogVerilog HDL HDL基本结构基本结构一、简单的一、简单的VerilogVerilog HDL HDL例子例子 例例3.2.1 8 8位全加器位全加器module adder8(cout,sum,a,b,cin);output cout;/输出端口声明输出端口声明 output 7:0 sum;input 7:0 a,b;/输入端口声明输入端口声明 input cin;assign cout,sum=a+b+cin;endmodule assign语句:无论右边表达式操作数何时发生变化,右边表达式都语句:无论右边表达式操作数何时发生变化,右边
20、表达式都会重新计算,并且在指定的延迟后给左边表达式赋值。会重新计算,并且在指定的延迟后给左边表达式赋值。I/O说明说明端口定义端口定义功能描述功能描述模块名(文件名)整个整个VerilogVerilog HDL HDL程序嵌套在程序嵌套在modulemodule和和endmoduleendmodule声明语句中。声明语句中。每条语句相对每条语句相对modulemodule和和endmoduleendmodule最好缩进最好缩进2 2格或格或4 4格!格!/表示注释部分,一般只占据表示注释部分,一般只占据一一行。对编译不起作用!行。对编译不起作用!单行注释符18 2 2 VerilogVeril
21、og HDL HDL基本结构基本结构 例例3.2.2 8 8位计数器位计数器module counter8(out,cout,data,load,cin,clk);output 7:0 out;output cout;input 7:0 data;input load,cin,clk;reg7:0 out;always(posedge clk)begin if(load)out=data;/同步预置数据同步预置数据 else out =out+1+cin;/加加1计数计数 end assign cout=&out&cin;/若若out为为8hFF,cin为为1,则,则cout为为1endmod
22、uleI/O说明说明端口定义端口定义功能描述功能描述信号类型声明信号类型声明缩减运算符位运算符19 2 2 VerilogVerilog HDL HDL基本结构基本结构 例例3.2.3 2 2位比较器位比较器module compare2(equal,a,b);output equal;input 1:0 a,b;assign equal=(a=b)?1:0;/*如果如果a等于等于b,则,则equal 为为1,否则为,否则为0*/endmodule“=”非阻塞过程性赋值:将想要赋给左式的值安排在未来时刻。不等上一个赋值非阻塞过程性赋值:将想要赋给左式的值安排在未来时刻。不等上一个赋值完成执行下
23、个赋值语句。完成执行下个赋值语句。“=”阻塞过程性赋值:按照顺序执行,前一个赋值结束才执行下边的赋值语句。阻塞过程性赋值:按照顺序执行,前一个赋值结束才执行下边的赋值语句。连续赋值语句连续赋值语句条件运算符条件运算符/*/内表示注释部分,一般可占据内表示注释部分,一般可占据多多行。行。对编译不起作用!对编译不起作用!多行注释符多行注释符20 2 2 VerilogVerilog HDL HDL基本结构基本结构 例例3.2.4 三态驱动器三态驱动器module trist2(out,in,enable);output out;input in,enable;bufif1 mybuf(out,in
24、,enable);endmodule例化元件名门元件关键字门元件例化门元件例化程序通过调用一程序通过调用一个在个在VerilogVerilog语言库中现存的实例语言库中现存的实例门元件来实现某逻辑门功能。门元件来实现某逻辑门功能。Inputs|OutputIN ENABLE|OUTX0|Z11|101|0bufif1bufif1的真值表的真值表门元件例化门元件例化21module trist1(out,in,enable);output out;input in,enable;mytri tri_inst(out,in,enable);endmodulemodule mytri(out,in,
25、enable);output out;input in,enable;assign out=enable?in:bz;/*如果如果enable为为1,则,则out=in,否则为高阻态,否则为高阻态*/endmodule 2 2 VerilogVerilog HDL HDL基本结构基本结构 例例3.2.5 三态驱动器三态驱动器例化元件名子模块名顶层模块顶层模块子模块子模块模块元件例化模块元件例化模块元件例化模块元件例化顶层模块(顶层模块(trist1trist1)调用由某子模块)调用由某子模块(mytrimytri)定义的实例元件()定义的实例元件(tri_insttri_inst)来实现某功能
26、。)来实现某功能。返回返回逻辑逻辑功能定义功能定义22 2 2 VerilogVerilog HDL HDL基本结构基本结构Verilog HDL程序是由程序是由模块模块构成的。每个模块嵌套在构成的。每个模块嵌套在module和和endmodule声明语句中。模块是可以进行层次嵌套的。声明语句中。模块是可以进行层次嵌套的。每个每个Verilog HDL源文件中只准有一个顶层模块,其他为子模块。源文件中只准有一个顶层模块,其他为子模块。每个模块要进行端口定义,并说明输入输出端口,然后对模块的每个模块要进行端口定义,并说明输入输出端口,然后对模块的功能进行行为逻辑描述。功能进行行为逻辑描述。程序书
27、写格式自由,一行可以写几个语句,一个语句也可以分多程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写。行写。除了除了endmodule语句、语句、begin_end语句和语句和fork_join语句外,每个语语句外,每个语句和数据定义的最后必须有分号。句和数据定义的最后必须有分号。可用可用/*.*/和和/.对程序的任何部分作注释。加上必要的注释,以对程序的任何部分作注释。加上必要的注释,以增强程序的可读性和可维护性。增强程序的可读性和可维护性。23 2 2 VerilogVerilog HDL HDL基本结构基本结构二、二、VerilogVerilog HDL HDL模块的结构模块的
28、结构 VerilogVerilog的基本设计单元是的基本设计单元是“模块模块 (block)(block)”。Verilog Verilog 模块的结构由在模块的结构由在modulemodule和和endmoduleendmodule关键词关键词之间的之间的4 4个主要部分组成:个主要部分组成:module block1(amodule block1(a,b b,c c,d)d);input ainput a,b b,c c;output doutput d;wire xwire x;assign d=a|xassign d=a|x;assign x=(b&assign x=(b&c)c);e
29、ndmoduleendmoduleI/O说明说明端口定义端口定义功能描述功能描述信号类型声明信号类型声明123424 2 2 VerilogVerilog HDL HDL基本结构基本结构三、逻辑功能定义三、逻辑功能定义 在在Verilog Verilog 模块中有模块中有3 3种方法可以描述电路的逻辑功能种方法可以描述电路的逻辑功能:(1 1)用用assign 语句语句 assign x=(b&c);连续赋值语句连续赋值语句常用于描述组合组合逻辑门元件例化门元件例化模块元件例化模块元件例化例化元件名门元件关键字(2 2)用元件例化(用元件例化(instantiate)and myand3(f,
30、a,b,c);v 注注1 1:元件例化即是调用:元件例化即是调用VerilogVerilog HDL HDL提供的元件;提供的元件;v 注注2 2:元件例化包括:元件例化包括门门元件例化和元件例化和模块模块元件例化;元件例化;v 注注3 3:每个实例元件的名字必须每个实例元件的名字必须唯一唯一!以避免与其!以避免与其它调用元件的实例相混淆。它调用元件的实例相混淆。v 注注4 4:例化元件名也可以省略!例化元件名也可以省略!25 2 2 VerilogVerilog HDL HDL基本结构基本结构(3 3)用用 “alwaysalways”块语句块语句 always(posedge clk)/每
31、当时钟上升沿到来时执行一遍块内语句每当时钟上升沿到来时执行一遍块内语句 begin if(load)out=data;/同步预置数据同步预置数据 else out=data+1+cin;/加加1计数计数 end结构说明语句结构说明语句v注注1 1:“alwaysalways”块语句块语句常用于描述常用于描述时序时序逻辑,也逻辑,也可描述可描述组合组合逻辑。逻辑。v注注2 2:“alwaysalways”块块可用多种手段来表达逻辑关系可用多种手段来表达逻辑关系,如用,如用if-elseif-else语句或语句或casecase语句。语句。v注注3 3:“alwaysalways”块语句与块语句与
32、assignassign语句是并发执行语句是并发执行的,的,assignassign语句一定要放在语句一定要放在“alwaysalways”块语句之外块语句之外!26 2 2 VerilogVerilog HDL HDL基本结构基本结构v Verilog Verilog HDLHDL模块的模板(仅考虑用于逻辑综合的部分)模块的模板(仅考虑用于逻辑综合的部分)module ();output 输出端口列表;输出端口列表;input 输入端口列表输入端口列表;/(1)使用)使用assign语句定义逻辑功能语句定义逻辑功能 wire 结果信号名;结果信号名;assign =表达式表达式;/(2)使用
33、)使用always块定义逻辑功能块定义逻辑功能 always()begin /过程赋值语句过程赋值语句 /if语句语句 /case语句语句 /while,repeat,for循环语句循环语句 /task,function调用调用 end27 2 2 VerilogVerilog HDL HDL基本结构基本结构/(3)元件例化)元件例化 ();/模块元件例化模块元件例化 ();/门元件例化门元件例化endmodule例化元件名例化元件名也可以省略!也可以省略!28 2 2 VerilogVerilog HDL HDL基本结构基本结构四、关键字四、关键字 关键字关键字事先定义好的确认符,用来组织语
34、言结构;事先定义好的确认符,用来组织语言结构;或者用于定义或者用于定义VerilogVerilog HDL HDL提供的门元件(如提供的门元件(如andand,notnot,oror,bufbuf)。)。用用小写小写字母定义!字母定义!如如always,assign,begin,case,casex,else,end,for,function,if,input,output,repeat,table,time,while,wire 见见数字系统设计与数字系统设计与Verilog HDL P285附录附录A。用户程序中的用户程序中的变变量、节点等量、节点等名称名称不能与不能与关键字关键字同同名!
35、名!29 2 2 VerilogVerilog HDL HDL基本结构基本结构Verilog HDL关键字关键字edgeelseendendcaseendfunctionendprimitiveendmoduleendspecifyendtableendtaskeventforforceforeverforkfunction highz0highz1 ififnoneinitialinoutinputintegerjoinlargemacromodulemediummodulenandnegedgenor notnotif0notif1nmosoroutputparameterpmospose
36、dgeprimitivepulldownpulluppull0pull1andalwaysassignbeginbufbufif0bufif1casecasexcasezcmosdeassigndefaultdefparamdisable30 2 2 VerilogVerilog HDL HDL基本结构基本结构Verilog HDL关键字关键字(续)(续)tri0tri1 vectoredwaitwandweak0weak1whilewireworxnorxorrcmosrealrealtimeregreleaserepeatrnmosrpmosrtranrtranif0rtranif1sca
37、laredsmallspecifyspecparamstrengthstrong0 strong1supply0supply1tabletasktrantranif0tranif1timetritriandtriortrireg31 2 2 VerilogVerilog HDL HDL基本结构基本结构五、标识符五、标识符 任何用任何用Verilog Verilog HDLHDL语言描述的语言描述的“东西东西”都通过其名字来识别,都通过其名字来识别,这个名字被称为这个名字被称为标识符标识符。如源文件名、模块名、端口名、变量名、常量名、实例名等。如源文件名、模块名、端口名、变量名、常量名、实例名等
38、。标识符可由字母、数字、下划线和标识符可由字母、数字、下划线和$符号构成;符号构成;但第一个字符但第一个字符必须是字母或下划线,不能是数字或必须是字母或下划线,不能是数字或$符号符号!在在Verilog Verilog HDLHDL中变量名是区分大小写的!中变量名是区分大小写的!合法合法的名字:的名字:A_99_ZReset_54MHz_Clock$Module 不合法不合法的名字:的名字:123a$datamodule7seg.v标识符标识符不能与不能与关键字关键字同名!同名!32 2 2 VerilogVerilog HDL HDL基本结构基本结构六、编写六、编写VerilogVerilo
39、g HDL HDL源代码的标准源代码的标准 编写编写VerilogVerilog HDL HDL源代码的标准源代码的标准分为两类:分为两类:(1 1)语汇语汇代码的编写标准代码的编写标准 规定了文本布局、命名和注释的约定,以提高源代码的规定了文本布局、命名和注释的约定,以提高源代码的可读性可读性和和可维护性可维护性。(2 2)综合综合代码的编写标准代码的编写标准 规定了规定了VerilogVerilog风格,尽量保证能够风格,尽量保证能够综合综合,以避免常见的不能综合,以避免常见的不能综合及综合结果存在缺陷的问题,并在设计流程中及时发现综合中存在的及综合结果存在缺陷的问题,并在设计流程中及时发
40、现综合中存在的错误。错误。v综合综合:将用:将用HDLHDL语言或图形方式描述的电路设计转换为语言或图形方式描述的电路设计转换为实际门级电路(如触发器、逻辑门等),得到一个网表实际门级电路(如触发器、逻辑门等),得到一个网表文件,用于进行适配(在实际器件中进行布局和布线)文件,用于进行适配(在实际器件中进行布局和布线)。33 2 2 VerilogVerilog HDL HDL基本结构基本结构(1 1)每个每个VerilogVerilog HDL HDL源文件中只准编写一个顶层模块,源文件中只准编写一个顶层模块,也不能把一个顶层模块分成几部分写在几个源文件中也不能把一个顶层模块分成几部分写在几
41、个源文件中。(2 2)源文件名字应与文件内容有关,源文件名字应与文件内容有关,最好与顶层模块同名最好与顶层模块同名!源文件名字的第一个字符必须是字母或下划线,!源文件名字的第一个字符必须是字母或下划线,不能不能是数字或是数字或$符号符号!(3 3)每行只写一个声明语句或说明。每行只写一个声明语句或说明。(4 4)源代码用源代码用层层缩进层层缩进的格式来写。的格式来写。1 1 语汇代码的编写标准语汇代码的编写标准34 2 2 VerilogVerilog HDL HDL基本结构基本结构(5 5)定义变量名的大小写应自始至终保持一致(如变量名第一定义变量名的大小写应自始至终保持一致(如变量名第一个
42、字母均大写)。个字母均大写)。(6 6)变量名应该有意义,而且含有一定的有关信息。局部变量变量名应该有意义,而且含有一定的有关信息。局部变量名(如循环变量)应简单扼要。名(如循环变量)应简单扼要。(7 7)通过注释对源代码做必要的说明,尤其对通过注释对源代码做必要的说明,尤其对接口接口(如模块参(如模块参数、端口、任务、函数变量)做必要的数、端口、任务、函数变量)做必要的注释注释很重要。很重要。(8 8)常量尽可能多地使用常量尽可能多地使用参数定义参数定义和和宏定义宏定义,而不要在语句中,而不要在语句中直接使用字母、数字和字符串。直接使用字母、数字和字符串。参数定义(用一个标识符来代表一个常量
43、)的格式:参数定义(用一个标识符来代表一个常量)的格式:parameterparameter 参数名参数名1=1=表达式,参数名表达式,参数名2=2=表达式,表达式,;宏定义(用一个简单的宏名来代替一个复杂的表达式)的格式:宏定义(用一个简单的宏名来代替一个复杂的表达式)的格式:definedefine 标志符(即宏名)字符串(即宏内容)标志符(即宏名)字符串(即宏内容)1 1 语汇代码的编写标准(续)语汇代码的编写标准(续)35 2 2 VerilogVerilog HDL HDL基本结构基本结构(1 1)把设计分割成较小的功能块,每块用行为风格设计。除设计中对速把设计分割成较小的功能块,每
44、块用行为风格设计。除设计中对速度响应要求比较临界的部分外,都应度响应要求比较临界的部分外,都应避免门级描述避免门级描述。(2 2)建立一个好的建立一个好的时钟策略时钟策略(如单时钟、多相位时钟,经过门产生的时(如单时钟、多相位时钟,经过门产生的时钟、多时钟域等)。保证源代码中时钟和复位信号是干净的(即不是钟、多时钟域等)。保证源代码中时钟和复位信号是干净的(即不是由组合逻辑或没有考虑到的门产生的)。由组合逻辑或没有考虑到的门产生的)。(3 3)建立一个好的建立一个好的测试策略测试策略,使所有触发器都是可复位的,使测试能通,使所有触发器都是可复位的,使测试能通过外部管脚进行,又没有冗余的功能。过
45、外部管脚进行,又没有冗余的功能。(4 4)所有源代码都必须遵守并符合在所有源代码都必须遵守并符合在alwaysalways块语句的块语句的4 4种可综合标准模板种可综合标准模板之一之一。(5 5)描述组合和锁存逻辑的描述组合和锁存逻辑的alwaysalways块,必须在块,必须在alwaysalways块开头的控制事件块开头的控制事件列表中列出列表中列出所有所有的的输入输入信号。信号。2 2 综合代码的编写标准综合代码的编写标准always块语句模板块语句模板36 2 2 VerilogVerilog HDL HDL基本结构基本结构(6 6)描述组合逻辑的描述组合逻辑的alwaysalways
46、块,一定块,一定不能有不完全赋值不能有不完全赋值,即所有输出变,即所有输出变量必须被各输入值的组合值赋值,不能有例外。量必须被各输入值的组合值赋值,不能有例外。(7 7)描述组合和锁存逻辑的描述组合和锁存逻辑的always块块一定不能包含反馈一定不能包含反馈,即在,即在always块块中已被定义为输出的寄存器变量绝对不能再在该中已被定义为输出的寄存器变量绝对不能再在该always块中读进来作块中读进来作为输入信号。为输入信号。(8 8)时钟沿触发的时钟沿触发的always块必须是块必须是单时钟单时钟的,且任何异步控制输入(通的,且任何异步控制输入(通常是复位或置位信号)必须在控制事件列表中列出
47、。常是复位或置位信号)必须在控制事件列表中列出。例例:always(posedge clk or negedge set or negedge reset)(9 9)避免生成不想要的锁存器避免生成不想要的锁存器。在无时钟的。在无时钟的always块中,若有的输出变块中,若有的输出变量被赋了某个信号变量值,而该信号变量并未在该量被赋了某个信号变量值,而该信号变量并未在该always块的电平敏块的电平敏感控制事件中列出,则会在综合中生成不想要的锁存器。感控制事件中列出,则会在综合中生成不想要的锁存器。2 2 综合代码的编写标准(续综合代码的编写标准(续1 1)37 2 2 VerilogVeril
48、og HDL HDL基本结构基本结构(1010)避免生成不想要的触发器避免生成不想要的触发器。在时钟沿触发的在时钟沿触发的alwaysalways块中,如果用非阻塞赋值语句对块中,如果用非阻塞赋值语句对regreg型变量赋值;或者当型变量赋值;或者当regreg型变量经过多次循环其值仍保持不型变量经过多次循环其值仍保持不变,则会在综合中生成触发器。变,则会在综合中生成触发器。用用regreg型变量生成型变量生成触发器触发器举举例例:module rw2(clk,d,out1);input clk,d;output out1;reg out1;always(posedge clk)/沿沿触发触发
49、 out1=d;endmodule2 2 综合代码的编写标准(续综合代码的编写标准(续2 2)非阻塞赋值语句dclkout1D QDFF38 2 2 VerilogVerilog HDL HDL基本结构基本结构若不想生成触发器,而是希望用若不想生成触发器,而是希望用regreg型变量生成组合逻型变量生成组合逻辑,则应使用辑,则应使用电平电平触发触发:module rw2(clk,d,out1);input clk,d;output out1;reg out1;always(d)/电平电平触发触发 out1=d;endmodule2 2 综合代码的编写标准(续综合代码的编写标准(续3 3)dou
50、t1BUFF39 2 2 VerilogVerilog HDL HDL基本结构基本结构(1111)所有内部状态寄存器必须是可复位的,这是为了使所有内部状态寄存器必须是可复位的,这是为了使RTLRTL级和门级描述级和门级描述能够被复位成同一个已知的状态,以便进行门级逻辑验证。能够被复位成同一个已知的状态,以便进行门级逻辑验证。(1212)对存在无效状态的有限状态机和其他时序电路(如对存在无效状态的有限状态机和其他时序电路(如4 4位十进制计数器位十进制计数器有有6 6个无效状态),必须明确描述所有的个无效状态),必须明确描述所有的2 2的的N N次幂种状态下的行为(包次幂种状态下的行为(包括无效