您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 汽车理论 > SystemVerilog硬件设计及建模—第12章
HMECMicroElectronicsCenter电子设计自动化基础大纲1.基于SystemVerilog的硬件设计2.基于SystemVerilog的验证3.逻辑综合专题4.时序分析专题5.自动物理设计专题6.……09硕微电子公共邮箱:hit09S021@163.comPasswd:09S021HMECMicroElectronicsCenter参考书:1.SauartSutherland,SimonDavidmann.SystemVerilog硬件设计及建模.科学出版社,2007年2.JanickBergeron,EduardCerny.SystemVerilog验证方法学.北京航空航天大学出版社,2007年3.IEEEStd1800-2005,SystemVerilogLanguageReferenceManualLRM4.J.Bhasker著,徐振林译.VerilogHDL—硬件描述语言(AVerilogHDLPrimer).机械工业出版社,2000年HMECMicroElectronicsCenterSystemVerilogHardwareDesignandModelingWangJinxiangMicroelectronicsCenterofHITHMECMicroElectronicsCenter主要内容:1.简介2.声明的位置3.文本值和数据类型4.用户自定义和枚举数据类型5.数组、结构体和联合体6.过程块、任务和函数7.过程语句8.层次化设计9.接口10.设计实例:状态机、ATM开关11.行为级和交易级建模HMECMicroElectronicsCenter为什么要学习SystemVerilog?SystemVerilog起源SystemVerilog针对硬件设计关键增强第1章SystemVerilog简介HMECMicroElectronicsCenter1.1为什么要学?Verilog,VHDL,SystemC,Elanguage……SystemVerilog优点EDA公司的支持!!!VerificationLanguageHardwareModelingLanguageHighabstractionLevelmodelingHMECMicroElectronicsCenter1.2SystemVerilog起源IEEE1364-2005Verilog标准的扩展整合了SUPERLOG、VERA、C、C++及VHDL特性,同时包括了OVA和PSL断言SystemVerilog是设计与验证的统一的语言SystemVerilog与Verilog向下兼容SystemVerilog是由Accellera标准机构制定SystemVerilog是基于已证明的技术HMECMicroElectronicsCenter1.2.1SystemVerilog标准历程2002年6月:SystemVerilog3.0(可综合结构与抽象建模)2003年5月:SystemVerilog3.1(验证功能)2004年5月:SystemVerilog3.1a(附加建模与验证结构)2004年6月:Accellera捐赠给IEEE2005年11月:IEEE1800—2005IEEE1364—2005(Verilog)HMECMicroElectronicsCenter1.2.2SystemVerilog获得的捐赠SUPERLOG扩展可综合子集—CoDesignAutomationOpenVERA验证语言—SynopsysPSL断言—IBMOpenVERA断言—SynopsysDirectC和适用的应用程序设计接口—Synopsys单独编辑和$readmem扩展—MentorGraphics标签联合体和高层次语言特征—BlueSpecHMECMicroElectronicsCenter1.3SystemVerilog关键增强设计内部的封装通信和协议检查的接口类似C语言中的数据类型,如int用户自定义类型(typedef)枚举类型、结构体和联合体类型转换package外部编译单元区域++、--、+=等赋值操作显式过程块priority和unique修饰符通过引用传送到任务、函数和模块HMECMicroElectronicsCenterpackage定义及从package中导入定义$unit编译声明空间未命名块中的声明增强的时间单位定义第2章SystemVerilog声明的位置logic、enum、typedef、structHMECMicroElectronicsCenter2.1package在Verilog中,变量、线网、任务和函数的声明必须在module和endmodule关键字之间,如果一个任务在多个模块中被引用,如何处理?Verilog采用include编译指令和其它编码技巧来解决问题,但同时引入了其它的问题,如设计维护等。SystemVerilog借鉴了VHDL中package的概念,很好地解决了这个问题!HMECMicroElectronicsCenter2.1.1package内容package中的内容在package和endpackage之间定义,可以包含的可综合结构有:1.parameter和localparam常量定义2.const变量定义3.typedef用户自定义类型4.全自动task和function定义5.import语句6.操作符重载定义HMECMicroElectronicsCenter2.1.1package内容packagedefinitions;parameterVERSION=“1.1”;typedefenum{ADD,SUB,MUL}opcodes_t;typedefstruct{logic[31:0]a,b;opcodes_topcode;}instruction_t;functionautomatic[31:0]multiplier(input[31:0]a,b);returna*b;endfunctionendpackageHMECMicroElectronicsCenter2.1.2package内容的引用四种引用方式:1.用范围解释操作符直接引用2.将package中特定子项导入到模块或接口中3.用通配符导入package中的子项到模块或接口中4.将package中子项导入到$unit中HMECMicroElectronicsCenter2.1.2package内容的引用方法1:moduleALU(inputdefinitions::instruction_tIW,inputlogicclock,outputlogic[31:0]result);always_ff@(posedgeclock)begincase(IW.opcode)definitions::ADD:result=IW.a+IW.b;definitions::SUB:result=IW.a–IW.b;definitions::MUL:result=definitions::multiplier(IW.a,IW.b);endcaseendendmoduleHMECMicroElectronicsCenter2.1.2package内容的引用方法2:moduleALU(inputdefinitions::instruction_tIW,inputlogicclock,outputlogic[31:0]result);importdefinitions::ADD;importdefinitions::SUB;importdefinitions::MUL;importdefinitions::multiplier;always_ff@(posedgeclock)begincase(IW.opcode)ADD:result=IW.a+IW.b;SUB:result=IW.a–IW.b;MUL:result=multiplier(IW.a,IW.b);endcaseend//importdefinitions::opcodes_t;?endmoduleHMECMicroElectronicsCenter2.1.2package内容的引用方法3:moduleALU(inputdefinitions::instruction_tIW,inputlogicclock,outputlogic[31:0]result);importdefinitions::*;always_combbegincase(IW.opcode)ADD:result=IW.a+IW.b;SUB:result=IW.a–IW.b;MUL:result=multiplier(IW.a,IW.b);endcaseendendmodule通配符导入并不自动导入整个package,只是相当于添加了一条搜索路径!!HMECMicroElectronicsCenter2.1.3package综合指导package中的的任务和函数必须说明为自动的才能被综合,并且不能包括静态变量。自动任务或函数的存储区在每次调用时才会分配,引用自动package中的自动任务或函数的每个模块看到的是不被其它模块共享的唯一副本,保证了综合前后行为相同。package中的变量声明是不可综合的!为什么package中的静态函数和变量不可综合?!HMECMicroElectronicsCenter2.2$unit编译单元声明内容:1.时间单位和精度声明2.变量、常量声明3.net声明4.用户定义数据类型,使用typedef、enum和class5.任务和函数编译单元是同时编译的所有源文件。编译单元为软件工具提供了一种对整个设计的各个子块单独编译的方法。SystemVerilog可以在package,模块、接口和程序块的外部进行声明,这些外部声明在“编译单元域”中,对所有同时编译的模块都是可见的。(与后面的例子似乎有些矛盾!)HMECMicroElectronicsCenter2.2$unit编译单元声明parameterVERSION=“1.2a”;regresetN=1;typedefstructpacked{reg[31:0]address;reg[31:0]data;reg[31:0]opcode;}instruction_word_t;functionautomaticintlog2(inputintn);if(n1)return(1);log2=0;while(n1)beginn=n/2;log2++;endreturn(log2);endfunction本例子不可综合!!!HMECMicroElectronicsCenter2.2$unit编译单元声明moduleregister(outputinstruction_word_tq;inputinstruction_word_td;inputwireclock);always@(posedgeclock,negedgeresetN)if(!resetN)q=0;elseq=d;endmoduleHMECMicroElectronicsCenter2.2$unit编译单元声明编译单元域只作用于同时编译的源文件。每次编译源文件就创建一个唯一仅针对此次编译的编译单元域!假定模块CPU和模块controller都引用外部声明的变量reset,考虑以下两种情况:(1)如果两个模块同时编译(2)如果每个模块分别编译第(2)种情况第二次编译时看不到第一次编译中的reset声明,可能编译失败,也可能使reset成为隐式的net,如果是后一种情况,那么就有了两个叫reset的不同信号!HMECMicroElectronicsCenter2.2.1编码指导(1)不要在$unit空间进行任何声明,所有共享的声明都要在package中进行(2)需要时可以将package导入到$unit中(3)如果声明分散在多个文件中,会使代码结构混乱、逻辑性差、难于调试
本文标题:SystemVerilog硬件设计及建模—第12章
链接地址:https://www.777doc.com/doc-3969587 .html