片上系统技术_第1页
片上系统技术_第2页
片上系统技术_第3页
片上系统技术_第4页
片上系统技术_第5页
已阅读5页,还剩232页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

片上系统(SOC)技术

秦华旺

南京理工大学自动化学院主要内容SOC概述硬件描述语言VerilogHDLQuartusII开发环境课程安排24学时的理论课8学时的实验课开卷考试考核内容:PPT中的知识点暂无教材第一章:SOC概述SOC的定义SOC的历史、现状与发展趋势SOC的基本概念SOC的定义SOC:片上系统,或系统级芯片,即在一个芯片上集成一个计算机系统。SOC概述SOC的发展历史电子管晶体管集成电路

工艺:0.25µm以下,进入深亚微米阶段规模:超大规模(VLSI)和特大规模(GSI)SOCSOC概述SOC的特性复杂系统功能超深亚微米工艺内嵌一个或数个CPU或DSP功能可编辑复用IP核SOC概述SOC的国内现状地域分布长江三角洲京津珠江三角洲产业IC设计芯片加工后工序SOC概述SOC的应用无线/有线通信多媒体工业控制交通运输SOC概述SOC的分类CSOC:CPU+可重构处理构件,研究机构主导SOPC:基于FPGA,可编程SOC,小批量ASICSOC:专用集成电路,大批量,主流SOC概述ASIC(专用集成电路)的分类全定制:设计者完成所有电路的设计半定制:利用库里的标准逻辑单元设计SOC概述著名ASIC厂商TIIBMSonySTToshibaNEC(日电)FujitsuRenesas(瑞萨)LSISamsungSOC概述SOPC著名厂商(基于FPGA)XilinxAlteraLatticeActelQuiklogicCypressSOC概述可编程器件PLD(PromrammableLogicDevice)CPLD(ComplexPromrammableLogicDevice)FPGA(FieldProgrammableGateArray)SOC概述CPLD与FPGA的区别FPGA的集成度比CPLD高,FPGA一般是几万~几百万逻辑单元,CPLD一般是几千~几万逻辑单元;CPLD更适合完成各种算法和组合逻辑,FPGA更适合于完成时序逻辑;CPLD的时序延迟是均匀的和可预测的,而FPGA的延迟往往不可预测;在编程上FPGA比CPLD具有更大的灵活性;CPLD是粗粒结构(逻辑块),延迟小,软件编译快;CPLD比FPGA使用起来更方便,不需要EEPROM;CPLD的速度比FPGA快;CPLD保密性更好。SOC概述SOC的关键技术可重用IP核软硬件协同设计时序分析可测试性设计与测试验证深亚微米技术低电压、低功耗技术总线构架技术可靠性设计技术特殊工艺技术SOC概述SOC的IP核IP核,即知识产权IP(IntellectualProperty),是指己验证的、可重利用的、具有某种确定功能的集成电路模块。软核硬核固核SOC概述软核

软核是用硬件描述语言描述的功能块,但是并不涉及用什么具体电路元件实现这些功能。软IP的设计周期短,设计投入少,应用灵活。缺点是在性能上难以获得全面优化,且知识产权保护较难。SOC概述硬核在性能、功率和面积上经过优化,并映射到特定工艺技术的功能模块。硬核具有可预见性,同时还可以针对特定工艺或购买商进行功耗和尺寸上的优化,且更易于实现版权保护。但应用灵活性和可移植性较差。SOC概述固核固核是软核和硬核的折衷,是指在结构和拓扑方面针对性能和面积进行版图规划,甚至可能用某种工艺技术进行过优化的可复用模块。SOC概述软硬件协同设计与传统的嵌入式系统设计方法不同,软/硬件协同设计强调软件和硬件设计开发的并行性和相互反馈,强调利用现有资源(IP核和软件构件),缩短系统开发周期,降低系统成本,提高系统性能。软硬件任务划分软硬件接口定义软硬件协同仿真和验证SOC概述时序分析时钟同步时序预算的分级和分解关键路径的特殊约束SOC概述可测试性设计与测试验证SOC验证工作约占整个设计工作的70%。测试架构测试向量有效传递性测试平行化降低测试占用时间SOC概述深亚微米技术工艺加工线宽的不断减少,给电路的设计、仿真带来了新的挑战,线与线的相互影响将变得不可忽略,必须研究关键电路架构、时序收敛性、信号完整性、天线效应等问题。0.8~0.35μm称为亚微米0.25μm及其以下称为深亚微米0.05μm及其以下称为纳米SOC概述低电压、低功耗技术

随着线宽不断缩小,电源电压也相应缩小。同时随着集成度的提高,电路功耗也会相应提高,所以必须采取相应措施,以降低功耗。芯片的功耗主要由跳变功耗、短路功耗和泄漏功耗三部分组成。降低功耗的措施包括:电路实现工艺、输入向量控制(IVC)技术、多电压技术、功耗管理技术以及软件(算法)低功耗利用技术等。SOC概述总线构架技术IBM公司的CoreConnect总线ARM公司的AMBA总线Altera公司的Avalon总线Silicore公司的Wishbone总线SOC概述可靠性设计技术防死锁和解锁机制容错机制故障恢复机制SOC概述特殊工艺技术SOC概述对于要求较高的电路,PN结隔离和挖槽还不能达到要求,需要特殊的噪声降低和隔离技术。一些特殊工艺的相互兼容性,如DRAM、Flash与Logic工艺的兼容、数字与模拟的相互兼容等。EDA(电子设计自动化)EDA(ElectronicDesignAutomation)是以计算机为工作平台,以EDA软件工具为开发环境,以硬件描述语言为设计语言,以可编程器件为实验载体,以ASIC、SOC芯片为设计目标器件,以电子系统设计为应用方向的电子产品自动化设计过程。SOC概述EDA的作用随着芯片规模的不断扩大,芯片内线路的复杂程度不断增加,IC设计者必须在先进的EDA工具的基础上,采用自上至下、结构化设计、软硬件协同设计等方法来完成SOC的系统功能设计。SOC概述EDA工具的主要供应商Cadence(美国)Synopsys(美国)Avant(美国,已被Synopsys收购)Magma(美国)SOC概述EDA工具的芯片开发步骤前端设计后端设计设计验证SOC概述前端设计完成从芯片逻辑的概念化设计到芯片逻辑门级表示的工作。系统级设计和分析寄存器传输级(RTL)设计和分析逻辑综合和优化SOC概述后端设计描述了如何使设计结构在芯片上进行物理实现,尤其是芯片的硅内核和库单元的布局和布线。芯片布局布线SOC概述设计验证保证芯片满足功能、时序、功率和其他指标的要求。验证占用了整个设计时间的大约70%。系统级验证RTL级验证逻辑门级验证物理级验证SOC概述第二章:SOC设计SOC设计流程SOC设计原则设计流程SOC设计设计复用的一般原则同步设计存储器和混合信号设计片上总线时钟分配清零/置位/复位信号物理设计可交互模块SOC设计同步设计数据只在时钟沿变化,因此指令和数据的管理更容易,具体措施:随机逻辑中使用寄存器,不用锁存器避免使用内部脉冲发生电路避免使用直接组合逻辑通道SOC设计存储器设计

SOC中存储器一般占芯片面积的60%以上,存储器设计的注意事项:存储器周边加虚拟单元,以减小其边界和中心阵列的寄生参数诧异;大规模存储器放在芯片的边或角上;小存储器分散放置;小存储器用到的金属层比工艺允许的布线层少1~2层,留下的金属层用来进行芯片级布线。SOC设计混合信号设计

SOC中混合信号一般不超过芯片面积的5%,如锁相环、数/模转换器、模/数转换器、温度传感器等,混合信号一般对噪声和工艺非常敏感,设计的注意事项:尽量将混合信号模块放在芯片角上周围加上保护环和虚拟单元SOC设计片上总线片上总线在SOC设计中起着极其重要的作用,由于片上总线提供了各种核都可以连接的通用接口,因此基于总线的设计有利于管理。片上总线的设计和数据传输协议的制定应该在选定核之前就予以考虑。若在核开发完成后再设计片上总线,则容易导致数据传输机制的混乱。SOC设计时钟分配尽可能使用同步设计不同时钟域的数量越少越好尽可能避免使用锁存尽可能减小时钟偏斜(在系统内不同元件处检测到有效的时钟跳变沿所需的时间差异)SOC设计清零/置位/复位信号尽可能使用同步复位文档中应对这些信号作详细说明SOC设计物理设计版图规划综合时序输入/输出端口确认与测试SOC设计版图规划芯片设计之初的版图规划有助于估算芯片的大小,以及确定是否能达到面积、时序、性能和成本的目标。SOC设计综合(synthesis

)综合:将电路的高级语言描述编译生成出细节更加丰富的低级描述。在设计之初,要对综合后的面积、时序和功耗制定明确的目标。SOC设计时序在版图设计之前,应对版图规划后的块进行时序分析,在版图设计完成后,再进行时序验证。SOC设计输入/输出端口要对I/O端口进行详细定义,并合理规划其摆放位置,一些经验法则有:所有的电源/地引脚应该排列在同一边信号I/O排列在两个边上SOC设计可交互模型设计的复用在很大程度上依赖于可交互模块的质量,这些模块包括:行为模型、功能模型、仿真模型、时序模型、版图规划模型等。尽量提高可交互模型的质量对模型进行加密,防止逆向工程SOC设计第三章:IP核设计软核/固核的设计硬核的设计软核/固核特点软核和固核是RTL形式的产品,易于复用且具有较高的灵活性;但是,由于没有确定的版图,它们的面积、功耗和性能没有经过优化。

RTL:寄存器传输级,用硬件描述语言描述预期的功能。与之相对应的门级则是用具体的逻辑单元来描述一定的功能。RTL和门级是设计上的不同阶段,RTL经过逻辑综合后就得到门级。之所以有RTL,是因为集成电路可以看作由一组寄存器以及寄存器之间的逻辑操作构成。软核/固核设计软核/固核设计流程软核/固核设计有阴影的框表示固核所需的附加步骤设计说明文档功能要求:指定核的用途和操作物理要求:指定封装、面积、功耗、工艺库等设计要求:指定结构和带数据流的框图接口要求:指定信号名称和功能、时序图和交直流参数测试与调试要求:指定生产测试、可测性设计方法、测试向量产生方法、故障分级等软件要求:指定硬件模块的软件驱动程序软核/固核设计产品RTL代码功能测试平台测试向量文件综合的脚本文件描述核功能的文档工作特性仿真结果门级网表(固核)(网表:雏形的电路,描述器件的连接)工艺库说明(固核)时序模型(固核)面积和功耗估计(固核)原型样片(固核)软核/固核设计硬核设计特点需要物理设计在面积和时序上要对特定的工艺进行优化用版图数据(GDSII)交付硬核设计硬核设计中的特有问题时钟和复位信号布线通道疏松度、引脚排列和宽长比全定制电路测试硬核设计时钟和复位信号具有独立于SOC系统的时钟和复位信号硬核中的时钟和复位信号要使用缓冲器和最小的连线负载硬核输出端口也应有经过缓冲的时钟,用于和其他时钟的同步硬核设计布线通道疏松度SOC集成时,通常布线从核的上方或内部穿过,为此:硬核中的布线应该有一定的疏松度限制核中使用的金属线层数,使之比工艺允许的少一层或两层硬核设计引脚排列总线信号相邻输入的时钟和复位信号要引出电源和地引脚尽量放在一边基本的I/O引脚(USB、PCI)尽量放在一边核内部的公共电源和地线应尽量短硬核设计宽长比尽量使硬核的宽长比接近1:1或1:2,以此尽量减小对SOC级布局的影响。硬核设计全定制电路有时因为性能或面积的需要,硬核内包含有全定制电路模块,这种电路需要在晶体管级进行仿真,这些电路的性能对工艺参数高度敏感,需要良好的文档来描述这种电路的功能和实现。硬核设计测试硬核中必须有可测试性设计DFT(DesignForTest)

,硬核的DFT设计要求在SOC集成时产生最少的约束。硬核设计硬核设计流程硬核设计系统集成使用硬核设计使用软核设计系统验证IP核设计使用硬核设计功能和时序等的验证工程,占整个设计工作量的60%~70%验证环境的鲁棒性/完整性、设计环境的完整性/可维护性时钟分配、电源/地以及信号的布线IP核设计使用软核设计可以通过参数进行配置需要在目标工艺库下验证IP核设计系统验证单独测试叶级(leaf-level)模块的正确性验证核之间的接口软硬件协同仿真制造硬件原型(ASIC或FPGA)IP核设计第四章:硬件描述语言(HDL)硬件描述语言(HDL):用于设计硬件电路的语言。可以通过EDA工具的综合,生成数字逻辑网表,然后在一定的工艺下实现具体的电路。常用的硬件描述语言VerilogHDL(Cadence)VHDL(美国国防部)AHDL(Altera)SystemC(Synopsys)硬件描述语言VerilogHDL在ASIC领域,主要用VerilogHDL;在FPGA/CPLD中,VerilogHDL和VHDL使用均很广泛。本课程主要介绍VerilogHDL。硬件描述语言VerilogHDL基础知识词法数据类型运算符系统任务与系统函数编译指令硬件描述语言VerilogHDL词法间隔符与注释符数值字符串硬件描述语言间隔符与注释符间隔符:空格Tab换行符换页符注释符:/*......*/为多行注释//为单行注释VerilogHDL词法数值数值有四类状态值:0:逻辑0或假状态1:逻辑1或真状态x:未知状态z:高阻态VerilogHDL词法数值两种数值常量:整形数实型数VerilogHDL词法整形数格式:<SIZE>’<base_format><number><SIZE>:位宽,可省略’:固有字符base_format:进制格式,二进制为b或B,十进制为d或D,十六进制为h或H,八进制为o或ONumber:一串数字位宽小于实际位数则高位被忽略;位宽大于实际位数,若最高位是0或1则高位补0,若最高位是x或z,则高位补x或z。659、’h837FF、’o7460、4’b1001、5’D3、12’hx、16’hz、16’b0001_1010_1111_10004af、b001、8’b_0001_1010(非法)VerilogHDL词法实形数十进制和科学计数法两种表示形式:1.8、3.8e10、2.9E-9、3_2387.3398_30473.、.2e6(非法)VerilogHDL词法字符串

字符串是用双引号括起来的字符序列,必须在同一行中,当作为操作数时,看作ASCII值序列。“thisisastring”“printoutamessage\n”VerilogHDL词法VerilogHDL数据类型物理数据类型:与具体的硬件电路对应抽象数据类型:不与具体的硬件电路对应硬件描述语言物理数据类型连线型寄存器型这两种类型的变量定义时均需要设置位宽,缺省时默认为1。变量的每一位可以取0、1、x或z。VerilogHDL数据类型连线型数据连线型数据对应的是硬件电路中的物理信号连线,没有电荷保持作用(trireg除外),必须有驱动源驱动,有两种驱动方式:把它连接到一个门或模块的输出端用连续赋值语句assign对其进行赋值VerilogHDL数据类型连线型数据列表VerilogHDL数据类型连线型数据功能描述wire,tri两种常见类型(wire:连线;tri:三态线,有多个驱动源驱动时一般用tri,二者用法一致)wor,trior多重驱动时具有线或特性wand,triand多重驱动时具有线与特性trireg具有电荷保持特性tri1上拉电阻tri0下拉电阻supply1电源线,逻辑1supply0电源线,逻辑0寄存器型数据寄存器型数据对应的是具有状态保持作用的硬件电路元件,如触发器、锁存器等。关键字为reg未初始化时为未知状态x缺省时为1位数VerilogHDL数据类型寄存器型数据与连线型数据的区别寄存器型数据保持最后一次的赋值,连线型数据需要有持续的驱动寄存器型数据的驱动可以通过过程赋值语句实现VerilogHDL数据类型物理数据类型示例rega;//寄存器变量reg[3:0]v;//4位的寄存器变量tri[15:0]bus;//16位的三态总线tri1[7:0]data_bus;//8位的数据线,处于三态时为上拉电阻tri0[31:0]add_bus;//32位的连线型,处于三态时为下拉电阻regscalared[1:4]b;//4位寄存器,可选择部分位赋值regvectored[1:4]a;//不可部分赋值,缺省为scalaredreg[7:0]RAM[0:1023];//8位宽容量为1k的RAMwire#(2.4,1.8)carry;//具有升降延迟的连线型wire(strong1,pull0)sum=a+b;//指定驱动强度且连续幅值的连线型,supply,strong,pull,weak(强到弱)trireg(small)storeit;//小强度电荷存储线,medium,largeVerilogHDL数据类型存储器用寄存器数组来表示存储器parameter//实时参数

wordsize=16; memsize=256;//申明16位256字的存储器与寄存器reg[wordsize-1:0] mem[memsize-1:0], writereg, readreg;VerilogHDL数据类型抽象数据类型integer整型time时间型real实型parameter参数型VerilogHDL数据类型integer整型常用于定义循环控制变量寄存器型数据被当作无符号数,整型数据为32位有符号数integercountintegerk[1:64];//数组VerilogHDL数据类型time时间型主要用于对模拟时间的存储与计算处理为64位的无符号数timestart,stop;//两个64位时间变量VerilogHDL数据类型real实型浮点型数值reals;VerilogHDL数据类型parameter参数型被命名的常量在仿真开始时对其赋值,仿真过程中保持不变数据的具体类型由所赋的值来决定增加描述的可读性,为以后的修改带来方便parametermsb=7;parametere=25,f=9;parameteraverage=(r+f)/2;parameterr=5.7;VerilogHDL数据类型VerilogHDL运算符算术运算符逻辑运算符关系运算符相等运算符按位运算符归约运算符移位运算符条件运算符连接运算符硬件描述语言算术运算符+加-减*乘/除%取模VerilogHDL运算符逻辑运算符!逻辑非&&逻辑与||逻辑或结果只能为0或1。VerilogHDL运算符关系运算符<小于>大于<=小于等于>=大于等于如果比较关系成立,则返回逻辑1,否则返回逻辑0。VerilogHDL运算符相等关系运算符==相等:返回1或0或x!=不等:返回1或0或x===全等:只返回1或0,不返回x!==非全等:只返回1或0,不返回xVerilogHDL运算符按位运算符~按位非&按位与|按位或^按位异或~^按位异或非^~按位异或非不能将逻辑运算符与按位运算符相混淆VerilogHDL运算符归约运算符&归约与|归约或^归约异或~&归约与非~|归约或非~^归约异或非^~归约异或非先将操作数的第1位与第2位进行归约运算,然后将运算结果与第3位进行归约运算,依次类推,直至最后一位。VerilogHDL运算符移位运算符<<左移位>>右移位a=4’b1010a<<1//结果为4’b0100a>>2//结果为4’b0010VerilogHDL运算符条件运算符?:条件运算符有三个操作然,若第一个操作数是逻辑1则返回第二个操作数,若第一个操作数为逻辑0则返回第三个操作数。result=(c==d)?a+b:a-bVerilogHDL运算符连接运算符{}:连接运算符{{}}:复制运算符a=1’b1b=2’b00c={a,b}//c=3’b100d={4{a}}//d=4’b1111VerilogHDL运算符运算符的优先级VerilogHDL运算符运算符描述[]位选择或部分选择()圆括号!~逻辑非和按位非&|~&~|^~^^~归约运算符+-单目算术运算符{}连接运算符*/%算术运算符+-双目算术运算符<<>>移位运算符>>=<<=关系运算符==!=相等运算符&按位与^^~~^按位异或和异或非|按位或&&逻辑与||逻辑或?:条件运算符VerilogHDL系统任务与系统函数用于对仿真过程的控制和对仿真结果的分析以

“$”开头系统任务可以没有返回值,或有多个返回值,而系统函数只有一个返回值系统任务可以带延迟,而系统函数不允许带延迟,在0时刻执行硬件描述语言VerilogHDL系统任务与系统函数标准输出任务文件管理任务仿真控制任务时间函数其他硬件描述语言标准输出任务$display:可以自动换行$write:不会自动换行$display(“Thecountis%b”,counter)%d:十进制;%b:二进制;%h:十六进制;%o:八进制;%t:时间格式;%f:浮点格式;%s:字符串;\n:换行。VerilogHDL系统任务与系统函数文件管理任务$fopen:打开文件integerhandleA;handleA=$fopen

“myfile.out”VerilogHDL系统任务与系统函数文件管理任务$fdisplay:可以自动换行$fwrite:不会自动换行输出到文件integerhandleA;handleA=$fopen

“myfile.out”;$fdisplay(handleA,“Hello”);VerilogHDL系统任务与系统函数文件管理任务$freadmemb:二进制读取$freadmemh:十六进制读取从文件中读取数据到存储器reg[7:0]memory[9:0];$freadmemb(“myfile.dat”,memory);VerilogHDL系统任务与系统函数仿真控制任务$monitor:监控,信号发生变化时输出$monitoron:打开监控任务$monitoroff:关闭监控任务$monitor(“a=%d,b=%d”,a,b);VerilogHDL系统任务与系统函数仿真控制任务$finish:结束仿真,返回操作系统$stop:暂时挂起仿真,返回Verilog界面VerilogHDL系统任务与系统函数时间函数$timeformat:控制%t格式如何显示时间信息$printtimescale:给出指定模块的时间单位和精度$time:返回64位的整数,指定当前的仿真时间$stime:返回32位的仿真时间$realtime:以实数形式返回当前的仿真时间VerilogHDL系统任务与系统函数其他函数$random:随机函数,产生一个随机数$rtoi:通过截断小数值将实数变换成整数$itor:将整数变换成实数$realtobits:将实数变换成64位的实数向量$bitstoreal:将位模式变换为实数VerilogHDL系统任务与系统函数编译指令编译指令以字符“`”开头编译指令末尾不需要分号编译指令不受模块与文件的限制,已定义的编译指令一直有效,直到其他编译指令修改它或将该编译指令关闭硬件描述语言宏编译指令`define:定义宏`undef:取消宏`definecycle20VerilogHDL编译指令文件包含指令`include:包含需要用到的文件`includefile1.vVerilogHDL编译指令条件编译指令`ifdefTEST

modulecounter;......endmodule`elsemodulecounter_test;......endmodule`endif当且仅当宏TEST定义时编译模块counter,否则编译模块counter_testVerilogHDL编译指令时间定标指令`timescale:用于设定时延的时间单位`timescale1ns/10psVerilogHDL编译指令工作库定义指令`uselib:定义工作库 file=库文件名的路径 dir=库目录名的路径libext=.文件扩展`uselibfile=/models/udp.lib`uselibdir=/models/gate_liblibext=.vVerilogHDL编译指令用户自定义元件(UDP)基本门级元件(BasicGate-levelPrimitives)基本开关级元件(BasicSwitch-levelPrimitives)用户自定义元件(UDP)硬件描述语言UDP的定义primitive<元件名称>(<输出端口名>,<输入端口名1>,<输入端口名2>,...,<输入端口名n>);

输出端口类型说明(output); 输入端口类型说明(input);

输出端寄存器变量说明(reg);

元件初始状态说明(initial); table <table表项1>;

<table表项2>;

... <table表项n>; endtable endprimitive用户自定义元件(UDP)UDP的定义primitivemux4_1(out,in1,in2,in3,in4,ctrl1,ctrl2); outputout;

inputin1,in2,in3,in4,ctrl1,ctrl2; table //in1in2in3in4ctrl1ctrl2:out 0???00:0; 1???00:1; ?0??01:0; ?1??01:1; ??0?10:0; ??1?10:1; ???011:0; ???111:1;

endtable endprimitive用户自定义元件(UDP)UDP的定义UDP定义模块不能出现在其他模块定义之内只能有一个输出端口,而且必须为第一项只有时序逻辑元件才能将输出端口定义成寄存器类变量初始状态为电路上电时刻的状态,只能为0、1、xtable表项中只能出现0、1、x三种逻辑值用户自定义元件(UDP)组合逻辑电路UDP直接把电路的逻辑真值表搬到UDP的table表中完全由输入决定输出用户自定义元件(UDP)时序逻辑电路UDP时序逻辑电路元件的输出除了与当前的输入状态有关,还与时序元件本身的内部状态有关table表中多了一个内部状态必须将输出端口定义为寄存器类型往往需要对元件的初始状态值加以指定用户自定义元件(UDP)时序逻辑电路UDP电平触发时序电路UDP边沿触发时序电路UDP用户自定义元件(UDP)电平触发时序逻辑电路UDP内部状态改变由某一输入信号电平触发用户自定义元件(UDP)电平触发锁存器真值表d_inclkcurrent_statenext_state(q)000或1或x0100或1或x10或1或x1110或1或x100电平触发时序逻辑电路UDP用户自定义元件(UDP)primitivelatch(q,clk,d_in); outputq; regq;

inputclk,d_in; initialq=1’b0;//初始状态 table //clkd_in:cunrent_state:next_state(q) 01:? :1; 00:?:0; 1?:?:-;//输出不变

endtable endprimitive边沿触发时序逻辑电路UDP内部状态改变由某一输入时钟(只能有一个)的边沿触发用户自定义元件(UDP)上升沿T触发器真值表clkt_incurrent_statenext_state(q)(01)000(01)011(01)101(01)110(10)000(10)011(10)100(10)1110或1或x(??)000或1或x(??)11边沿触发时序逻辑电路UDP用户自定义元件(UDP)primitivet_trigger(q,clk,t_in); outputq; regq;

inputclk,t_in; table //clkt_in:cunrent_state:next_state(q) (01)0:?:-; (01)1:0:1; (01)1:1:0; (10)?:?:-; ?(??):?:-;

endtable endprimitiveVerilogHDL中的模块及其描述方式VerilogHDL语言是模块化的模块(Module)是VerilogHDL中的基本单元硬件描述语言模块的概念及结构module<模块名>(<端口列表>) 端口说明(input,output,inout)

参数定义(可选)(关键字parameter)

数据类型定义 连续赋值语句(assign)

过程块(initial和always) -行为描述语句 底层模块实例 任务(task)和函数(function) 延时说明块endmoduleVerilogHDL中的模块及其描述方式模块的概念及结构moduleMUX2_1(out,a,b,sel);

outputout; inputa,b,sel; not(sel_,sel);

and(a1,a,sel_); and(b1,b,sel); or(out,a1,b1);endmoduleVerilogHDL中的模块及其描述方式模块的描述方式数据流描述方式行为描述方式结构描述方式VerilogHDL中的模块及其描述方式数据流描述方式主要用来描述组合逻辑用assign连续赋值语句实现VerilogHDL中的模块及其描述方式assign语句assign(赋值驱动强度)[连线型变量的位宽]#(延时量)连线型变量名=赋值表达式当赋值表达式中变量的值发生变化时,重新计算赋值表达式的值,并在指定延时后将得到的结果赋给连线型变量inputin1,in2;outputout;assignout=~(in1&in2);VerilogHDL中的模块及其描述方式行为描述方式通过行为语句实现initial语句:只执行一次always语句:循环执行只适用于寄存器类型数据VerilogHDL中的模块及其描述方式initial和always语句inputA,B,Cin;outputSum,Count;regSum,Count;regT1,T2,T3;always@(AorBorCin) begin Sum=(A^B)^Cin; T1=A&Cin; T2=B&Cin; T3=A&B; Cout=(T1|T2)|T3; endVerilogHDL中的模块及其描述方式initial和always语句initial begin inputs=‘b000000;//初始值 #10inputs=‘b011001;10个时间单位后的值 #20inputs=‘b011011;20个时间单位后的值 #50inputs=‘b001000;50个时间单位后的值 endVerilogHDL中的模块及其描述方式语句组合begin-end语句组:顺序执行fork-join语句组:并行执行VerilogHDL中的模块及其描述方式结构描述方式通过实例进行描述,将预定义的基本元件实例嵌入到语言中,包括:用户自定义的模块用户自定义元件UDP内置门级元件内置开关级元件not(a,a1);and(a,b,c);VerilogHDL中的模块及其描述方式时间控制延时控制边沿触发事件控制电平敏感事件控制硬件描述语言延时控制#<延时时间>行为语句;或#<延时时间>;#10clk=1;#10;//处于等待状态时间控制边沿触发事件控制@(<事件表达式>)行为语句;@(<事件表达式>);@(<事件表达式1>or...or<事件表达式n>)行为语句;@(<事件表达式1>or...or<事件表达式n>);一般用于时序逻辑,不要求所有信号都出现在敏感事件列表中时间控制事件表达式<信号名>;//信号发生变化posedge<信号名>;//信号发生正跳变negedge<信号名>;//信号发生负跳变时间控制正跳变posedge0-->x0-->z0-->1x-->1z-->1时间控制负跳变negedge1-->x1-->z1-->0x-->0z-->0时间控制边沿触发控制@(reg_a)reg_b=reg_a;@(posedgereg_a)reg_b=reg_a;@(negedgereg_a);//等待@(posedgeclk1ornegedgeclk2orb)a=b;@(posedgeclk1ornegedgeclk2);//等待时间控制电平触发事件控制wait(条件表达式)语句块;//条件为真执行语句块wait(条件表达式)行为语句;wait(条件表达式);时间控制电平触发事件控制wait(enable==1)begin

d=a&b;

d=d|c;end时间控制电平触发事件控制wait(enable==1)d=(a&b)|c;wait(enable==1);时间控制赋值语句过程赋值语句连续赋值语句硬件描述语言过程赋值语句过程赋值语句只能用于initial和always过程块中在initial和always过程块中只能使用过程赋值语句只能用于对寄存器类型的变量(reg、integer、real、time)进行赋值赋值语句过程赋值语句rega;reg[0:7]b;integeri;reg[0:7]mem_1[0:1023];initialbegin a=0; i=356; b[2]=1’b1; b[0:3]=4’b1111; mem_1[200]=8’hfd; {a,b}=9’b101110110;end赋值语句过程赋值语句的两种延时方式外部时间控制方式内部时间控制方式赋值语句外部时间控制方式#5a=b;或#5;a=b;先等待指定的延时时间量,然后计算右端的表达式并将其赋给左边的变量赋值语句内部时间控制方式a=#5b;先计算右端的表达式,然后等待指定的延时时间量,最后将表达式的值赋给左边的变量赋值语句过程赋值语句的两种类型阻塞型过程赋值:=非阻塞型过程赋值:<=赋值语句阻塞型过程赋值在begin-end串行块中,当前语句的执行会阻塞下一条语句的执行initialbegin A=B; B=A;end赋值语句非阻塞型过程赋值在begin-end串行块中,当前语句的执行不会阻塞下一条语句的执行initialbegin A<=B; B<=A;end赋值语句连续赋值语句assign只能对连线型变量进行赋值,分为两种:显式连续赋值语句隐式连续赋值语句赋值语句显式连续赋值语句连线型变量类型[连线型变量位宽]连线型变量名;assign#(延时量)连线型变量名=赋值表达式;wire[3:0]x,y,z;assign#(1.5,1.0,2.0)z=x&y;赋值语句隐式连续赋值语句连线型变量类型(赋值驱动强度)[连线型变量位宽]#(延时量)连线型变量名=赋值表达式;wire[3:0]x,y;wire[3:0]#(1.5,1.0,2.0)z=x&y;赋值语句隐式连续赋值语句连线型变量不能保存数据只有在被连续驱动后才能取得确定值若没有得到连续驱动则取值为“x”赋值语句连续赋值语句和过程赋值语句的区别连续赋值语句由“assign”关键字识别,而过程赋值语句中不包含这个关键字连续赋值语句只能对连线型变量赋值,过程赋值语句只能对寄存器型变量赋值连续赋值语句不能出现在过程块(initial过程块或always过程块)中,而过程赋值语句只能出现在过程块中连续赋值语句主要用来描述组合逻辑电路以及连线型变量间的连接,而过程赋值语句主要用来描述时序逻辑电路连续赋值语句的赋值是连续的,而过程赋值语句只有被执行时才能赋值赋值语句过程连续赋值语句与连续赋值语句的区别:过程连续赋值语句只能用在过程块中,而连续赋值语句不能出现在过程块中过程连续赋值语句可以对寄存器型变量进行连续赋值,而连续赋值语句只能对连线型变量进行赋值过程连续赋值语句不能对变量的某一位或某几位赋值,而连续赋值语句可以对变量的某一位或某几位赋值赋值语句过程连续赋值语句assign/deassignforce/release赋值语句assign/deassign只能对寄存器型变量进行连续赋值,不能对连线型变量进行连续赋值assign用来对寄存器型变量连续赋值deassign用来撤销连续赋值regout[0:3];initialbegin assignout=a&b; deassignout;end赋值语句force/release既能对寄存器型变量进行连续赋值,也能对连线型变量进行连续赋值force用来对寄存器型或连线型变量进行连续赋值release用来撤销连续赋值regout[0:3];initialbegin forceout=a&b; releaseout;end赋值语句高级程序语句、函数和任务分支语句循环控制语句任务(task)和函数(function)只能出现在过程块内硬件描述语言分支语句if-else条件分支语句case分支控制语句高级程序语句、函数和任务if-else语句if(<条件表达式>) 语句或语句块;if(<条件表达式>) 语句或语句块1;else 语句或语句块2;if(<条件表达式1>)语句或语句块1;eseif(<条件表达式2>)语句或语句块2;...elseif(<条件表达式n>)语句或语句块n;else 语句或语句块n+1;高级程序语句、函数和任务if-else语句always@(selaorselboraorborc)begin if(sela)

q=a; eseif(selb) q=b; else q=c;end高级程序语句、函数和任务if-else语句逻辑表达式或关系表达式为1,则条件成立;不为1(0、x、z),则条件不成立在有多条语句的情况下,要用begin和end将多条语句组成一个语句块if-else还可以嵌套使用,但内层的if-else需要用begin和end封装高级程序语句、函数和任务case语句casecasezcasex高级程序语句、函数和任务case语句case(<控制表达式>)<分支项表达式1>:语句块1;<分支项表达式2>:语句块2;...<分支项表达式n>:语句块n;default:语句块n+1;endcase高级程序语句、函数和任务case语句case(op_code) 2’b00:out=a|b; 2’b01, 2’b10, 2’b11:out=a&b; default:out=0;endcase高级程序语句、函数和任务casez和casex语句casez:如果控制表达式或分支表达式的某位取值为z,则该位在比较时将被忽略casex:如果控制表达式或分支表达式的某位取值为x或z,则该位在比较时将被忽略高级程序语句、函数和任务循环控制语句forever循环语句repeat循环语句while循环语句for循环语句高级程序语句、函数和任务forever循环语句格式:forever语句或语句块;常用于产生周期性的波形forever#25clk=~clk;可用disable语句终止高级程序语句、函数和任务repeat循环语句repeat(<循环次数表达式>)语句或语句块;repeat(num)begin data1=data1<<1; data2=data2>>1;end高级程序语句、函数和任务repeat循环语句特殊用法out=0;pepeat(NUM)@(posedgeclk);out=1;高级程序语句、函数和任务while循环语句while(<条件表达式>)语句或语句块;while(count<100)begin $display(“count=%d”count); #5count=count+1;end高级程序语句、函数和任务for循环语句for(<语句1>;<条件表达式>;<语句2>)循环体语句或语句块;for(count=0;count<100;count=count+1)begin $display(“count=%d”count); #5;end高级程序语句、函数和任务任务task<任务名>; 端口与类型说明; 局部变量说明;

begin <行为语句1;> <行为语句2;> ... <行为语句n;> endendtask高级程序语句、函数和任务任务taskread_mem;

input[15:0]address;

output[31:0]data;

reg[3:0]counter; reg[7:0]temp[1:4];

begin for(counter=1;counter<=4;counter=counter+1) temp[counter]=mem[address+counter-1]; data={temp[1],temp[2],temp[3],temp[4]}; endendtask高级程序语句、函数和任务任务任务中不可以出现initial或always过程块当出现“disable语句时”,终止任务的执行高级程序语句、函数和任务任务的调用reg[7:0]mem[128:0];reg[15:0]a;reg[31:0]b;a=0;read_mem(a,b);高级程序语句、函数和任务任务的调用任务定义只能出现在模块中任务调用只能出现在过程块中只有寄存器变量才能与任务的输出端口相对应高级程序语句、函数和任务函数function<返回值类型或返回值宽度><函数名>; 输入端口说明; 局部变量说明;

begin <行为语句1;> <行为语句2;> ... <行为语句n;> endendfunction

<返回值类型或返回值宽度>为可选项,可以为[msb:lsb]、integer、real高级程序语句、函数和任务函数function[7:0]getbyte;

input[63:0]word;

input[2:0]bytenum;

integerbit; reg[7:0]temp;

begin for(bit=0;bit<=7;bit=bit+1) temp[bit]=word[(bytenum-1)*8+bit]; getbyte=temp; endendfunction高级程序语句、函数和任务函数函数内不可以出现initial或always过程块函数中必须有一个输入端口,不能出现输出端口(output)或输入/输出端口(inout)函数内不能出现任何类型的时间控制描述,也不允许使用disable终止语句高级程序语句、函数和任务函数的调用out=getbyte(input1,input2);assignnet1=getbyte(input1,3);函数的调用不能单独作为一条语句出现,只能作为一个操作数出现函数调用既能出现在过程块中,也能出现在assign连续赋值语句中高级程序语句、函数和任务函数和任务的区别函数至少必须有一个输入端口,而任务可以有0、1或多个输入端口函数不能有输出端口,而任务可以有0、1或多个输出端口函数调用通过函数名传递一个返回值,而任务调用通过输出端口传递返回值函数中不能调用其他任务,而任务中可以调用其他任务或函数函数调用不能单独作为一条语句,而任务调用为一条单独语句函数调用可以出现在过程块或连续赋值语句中,而任务调用只能出现在过程块中函数中不能出现时间控制语句,而任务可以函数不能用disable语句中断,而任务可以高级程序语句、函数和任务模块级建模

调用由用户设计生成的低级模块来对硬件电路结构进行描述硬件描述语言模块的定义module<模块名>(<端口列表>) 申明语句

模块组项

任务和函数定义

specify块endmodule模块级建模端口列表各个端口表达式按一定次序组成的一个列表模块级建模申明语句parameter:参数申明语句input:输入端口申明语句output:输出端口申明语句inout:双向端口申明语句连线型变量申明语句寄存器型变量申明语句时间型变量申明语句整型变量申明语句实型变量申明语句模块级建模模块组项模块功能的描述,可以包含initial和always过程块,也可以包括模块或元件的实例模块级建模specify块用于对模块输入、输出端口之间的路径延时时间量进行说明模块级建模函数和任务定义用来对模块内使用到的函数和任务进行定义模块级建模模块的端口隐式端口名形式显式端口名形式模块级建模隐式端口名形式(<端口表达式1>...<端口表达式n>)各个<端口表达式>指明了各个模块端口与模块内变量的连接关系moduleex1(a,b,z) inputa,b; outputz; ...模块级建模显式端口名形式(.<端口名1>(<端口表达式1>)...(.<端口名2>(<端口表达式2>))列表中的每一项包含一个端口名和一个端口表达式moduleex2(.in_a(a),.in_b(b),.in_z(z)) inputa,b; outputz; ...模块级建模模块的调用一个复杂电路可以被描述成是由各级模块像搭积木那样一层层组成一个硬件系统中必须有一个“顶级模块”,只有“顶级模块”不被其他模块调用,而其他各级模块都将被上一级模块调用模块被调用后就在上一级模块内生成了一个“模块实例”模块级建模模块的调用<模块名><参数值列表><实例名>(<端口连接表>);moduleNAND(ina,inb,nand_out);

inputina,inb; outputnand_out; assignnand_out=~(ina&inb);endmodulemoduleAND(in1,in2,and_out); inputin1,in2; outputand_out; wirew1; NANDNAND1(in1,in2,w1); NANDNAND2(w1,w1,and_out);endmodule模块级建模模块调用时对参数值的更改使用带有参数值的模块实例语句使用参数重定义语句(defparam)模块级建模使用带有参数值的模块实例语句modulemubtibits_multiplier(data1,data2,out);//4位×4位乘法器

parameterWIDE1=4;

parameterWIDE2=4; input[WIDE1:1]data1; input[WIDE2:1]data2; output[WIDE1+WIDE2:1]out; assignout=data1*data2;endmodulemoduleeight_bits_multiplier(a,b,result);//8位×8位乘法器 input[8:1]a,b; output[16:1]result; mubtibits_multiplier#(8,8)U1(a,b,result);endmodule模块级建模使用参数重定义语句(defparam)modulemubtibits_multiplier(data1,data2,out);//4位×4位乘法器

parameterWIDE1=4;

parameterWIDE2=4; input[WIDE1:1]data1; input[WIDE2:1]data2; output[WIDE1+WIDE2:1]out; assignout=data1*data2;endmodulemoduleeight_bits_multiplier(a,b,result);//8位×8位乘法器 input[8:1]a,b; output[16:1]result; defparamU1.WIDE1=8; defparamU1.WIDE2=8; mubtibits_multiplierU1(a,b,result);endmodule模块级建模门级建模

调用Verilog内部定义的“基本门级元件(BasicGate-LevelPrimitives)”对硬件电路进行描述硬件描述语言内置基本门级元件多输入门:and(与门),nand(与非门),or(或门),nor(或非门),xor(异或门),xnor(异或非门)多输出门:buf(缓冲器),not(非门)三态门:bufif0(低电平使能缓冲器),bufif1(高电平使能缓冲器),notif0(低电平使能非门),notif1(高电平使能非门)上拉、下拉电阻:pullup(上拉电阻),pulldown(下拉电阻)门级建模基本门级元件的调用<门级元件名><驱动强度说明>#(<门级延时量>)<实例名>(端口连接表);门级建模驱动强度说明(<对高电平的驱动强度>,<对低电平的驱动强度>)驱动强度分为:supply,strong,pull,weak,highz由强到弱and(strong0,weak1)AND_1(out,in1,in2);and(weak1,strong0)AND_2(out,in1,in2);门级建模门级延时量说明了信号从输入端到输出端的延时and#10AND_3(out,in1,in2);门级建模多输入门and(与门)nand(与非门)or(或门)nor(或非门)xor(异或门)xnor(异或非门)<元件名><驱动强度说明>#(<门级延时量>)<实例名>(<输出端口>,<输入端口1>,...,<输入端口n>)orO2(a,b,c,d);门级建模多输出门buf(缓冲器)not(非门)<元件名><驱动强度说明>#(<门级延时量>)<实例名>(<输出端口1>,...,<输出端口n>,<输入端口>)notNOT_1(out1,out2,in);门级建模三态门bufif0(低电平使能缓冲器)bufif1(高电平使能缓冲器)notif0(低电平使能非门)notif1(高电平使能非门)<元件名><驱动强度说明>#(<门级延时量>)<实例名>(<输出端口>,<输入端口>,<控制端口>)bufif1BF1(data_bus,mem_data,enable);门级建模上拉、下拉电阻pullup(上拉电阻)pulldown(下拉电阻)<元件名><驱动强度说明>#(<门级延时量>)<实例名>(<输出端口>)上拉输出1,下拉输出0pullup(supply)U1(power);门级建模门级延时上升延时:信号由0、x、z变为1的延时下降延时:信号由1、x、z变为0的延时截止延时:信号由0、1、x变为z的延时到不定态的延时:信号由0、1、z变为x的延时多输入门和多输出门没有截止延时三态门具有全部四种延时上拉和下拉电阻没有门级延时门级建模门级延时的表示方法基本表示方式“最小延时”、“典型延时”和“最大延时”的表示方法门级建模门级延时的基本表示方法包含一个延时值(#d):d同时代表上升延时、下降延时、截止延时、到不定态的延时包含两个延时值(#(d1,d2)):d1代表上升延时,d2代表下降延时,d1和d2中的较小者代表截止延时和到不定态的延时包含三个延时值(d1,d2,d3):d1代表上升延时,d2代表下降延时,d3代表截止延时,d1、d2和d3中的最小者代表到不定态的延时notif1#(10,20,30)U3(out,in,ctrl);门级建模“最小延时”、“典型延时”和“最大延时”门级延时量中的每一项将由“最小延时”、“典型延时”和“最大延时”三个值来表示#(d1_min:d1_typ:d1_max,d2_min:d2_typ:d2_max,d3_min:d3_typ:d3_max)notif1#(2:3:4,5:6:7,1:3:4)U4(out,in,ctrl);门级建模Specify说明块基本门级元件:门级延时说明模块:延时说明块(SpecifyBlock)硬件描述语言示例`timescale1ns/1nsmodulespecify_example(out,a,b,c); outputout; inputa,b,c; wirew1; xor#2X1(w1,a,b); nand#3NA1(out,w1,c); specify specparama_out=6,b_out=5,c_out=1; (a=>out)=a_out; (b=>out)=b_out; (c=>out)=c_out; endspecifyendmo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论