还剩14页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
技术报告名称Verilog代码风格规范编号版本号V
0.3作者项目部门产品中心日期2006-6-9目录TOC\o1-3前言21总则32职责33目的34内容
44.1基本原则
44.
1.1RTL级代码风格
44.
1.2组合时序电路分开原则
44.
1.3复位
54.2命名规则
54.
2.1基本命名标准
54.
2.2命名准则
64.3VERILOGHDL源代码文件结构
104.
3.1VERILOGHDL代码文件文件头
104.
3.2VERILOGHDL代码文件宏定义
134.
3.3VERILOGHDL代码文件模块名及端口信号
134.
3.4VERILOGHDL代码文件信号、变量及参数
134.
3.5VERILOGHDL代码文件设计主体
144.
3.6VERILOGHDL代码文件注释行
164.
3.7VERILOGHDL代码文件独立Include.v175VERILOGHDL代码范例
185.1复用器表达方式18前言为了更好地规范团队成员在研发项目时VERILOG硬件描述语言的撰写,以达到代码规范化和标准化的目的,特制定本规范修订日期版本修订人修订项目1总则本规范规定了IC设计项目开发过程中VERILOGHDL源代码的编写总则、要求及模板文件本规范适用于信息安全团队及IPTV项目各IC产品在设计开发过程中源代码的编写2职责各模块设计成员负责根据本规范的要求编写VERILOGHDL源代码系统组成员负责本规范对各项目的VERILOGHDL源代码进行规范化格式审查及管理3目的制定本规范的目的3.1便于项目组成员之间对源代码的理解、交流及相互检查;3.2便于设计者本人在项目开发之后或产品升级过程中利用源代码很快理解原有设计;3.3便于模块开发过程中不同版本源代码的管理;3.4便于模块仿真过程中很快发现问题的出处;3.5便于模块整合时各子模块的链接4内容
4.1基本原则
4.
1.1RTL级代码风格RTL是指RegisterTransferLevel,即寄存器传输级,代码显式定义每一个DFF,组合电路描述每个DFF之间的信号传输过程当前的主流工具对RTL级的综合、优化及仿真非常成熟不建议采用行为级甚至更高级的语言来描述硬件,代码的可控性,可跟踪性及可移植性难以保证
4.
1.2组合时序电路分开原则�J�Q�Q�K�SETCLR�D�L�S�R�CombinationallogicinputsoutputsCurrentstatebitsregistersnextstatebitsSequentialcircuitmodel图4‑1数字逻辑电路模型acurrentstatebits=↑nextstatebits;bnextstatebits=f1inputscurrentstatebits;coutputs=f2inputscurrentstatebits;DFF和组合逻辑描述分开,DFF在always块中完成,组合逻辑通常采用assign语句完成例如图4‑1中的电路可以描述如下//------------------------------------------------------------------------//通用的数字电路模型描述方式//组合与时序电路分开描述//时序电路在always块中,//组合电路采用assign赋值语句//本代码中的组合电路部分的函数f1f2均代表任意的与或表达式//------------------------------------------------------------------------//时序电路部分,异步复位always@posedgeClkornegedgeResetnbeginif!Resetncurrent_state_bits=0;elsecurrent_state_bits=next_state_bits;end//组合电路部分assignnext_state_bits=f1inputscurrent_state_bits;assignoutputs=f2inputscurrent_state_bits;
4.
1.3复位所有DFF必须加异步低电平有效复位信号,同步复位根据实际情况决定是否添加
4.2命名规则
4.
2.1基本命名标准1)全局异步复位输入信号命名为Resetn/Rstn,多复位域则命名为ResetnXxx/Rstn,Xxx代表复位域含义缩写且首字母大写;同步复位输入信号命名为SReset;2)时钟输入信号单一时钟域则命名为Clk;多时钟域则命名为Clkxxx,xxx代表时钟域含义且首字母大写
4.
2.2命名准则
4.
2.
2.1模块名命名规则
1.模块名命名规则硬件系统负责人先划分好项目模块,并根据此规则命名模块名;采用层次化命名方法,层次之间用下划线“_”隔开;模块名称只允许分段第一个字母大写下面以USB项目举例(下同)Sie_Pkt表示Sie模块中的PktPacket子模块,处于IP模块层次的第三层(包含IP最顶层)第二层模块前缀定义如下SIEmodule Sie_MainControllermodule Mctl_GPIOMultiBusmodule Gpmb_CpuInterfacemodule Citf_McuInterfacemodule Mitf_EndpointBuffermodule Epb_MCUmodule Mcu_
2.IP等特殊模块命名规则例如顶层管脚及Sie模块的UTMI接口部分和Gpmb的GPBUS接口未按上面的规则命名,较为独立,如有约定俗成的命名则采用约定名,如为全新开发的IP,可事先定义好IP模块名
4.
2.
2.2模块间连线模块端口命名规则
1.若连线来自上级模块则保留原名,若直接输出到上级模块则同上级模块端口名;
2.同级模块之间连线的命名格式为“源子模块”+“目的子模块”+“意义(参考后面的缩写表)”;若为多目的连线,则“源子模块”+“意义(参考后面的缩写表)”;各级模块的命名采用上述方法逐级递推注意“源子模块”、“目的子模块”及“意义均可采用缩写例如Sie模块下的Sie_Pkt模块和Sie_Sil模块之间的数据连线可表示为PktSilDat[7:0],如果Sie_Pkt送出的数据给多个其它模块的输入,则命名为PktDat[7:0];而Sie_Pkt模块下的子模块Pa和子模块Ms之间的连线可表示为PaMsStart
3.模块端口命名规则确定上级模块端口已命名,理清不同模块端口间关系,其命名原则如下
(1)若端口与上级模块端口直连,则采用上级模块端口名;
(2)对任意一对一连接的端口,相关模块的对应端口名字均为“源模块”+“目的模块”+“意义(参考后面的缩写表)”;
(3)对于一对多连接的端口,相关模块的对应端口名字均为“源模块”+“意义(参考后面的缩写表)”
(4)IP等特殊模块端口命名规则较为独立,如有约定俗成的命名则采用约定名,如为全新开发的IP,可事先定义好IP模块端口名例如Sie模块下的Sie_Pkt模块和Sie_Sil模块之间的相连的数据端口均可表示为PktSilDat[7:0],如果Sie_Pkt送出的数据给多个其它模块的输入,则Sie_Pkt及相关的接收模块对应端口均命名为PktDat[7:0];USB等IP的端口,采用USBIP定义的端口名
4.为了保证连线名与连线两端端口名的一致性,连线中尽量避免使用OutIn等标志方向的字符,而使用无方向性的字符如DatAdd等
5.常数、参数全部大写
6.同一信号经过寄存器处理的命名规则此规则为推荐级别:同一信号经过寄存器打过一级之后命名加上“Reg”,打过两级之后加上“Reg2”,依次类推;同一信号前一级寄存器的输入命名为信号名加上“Pre”,前两级寄存器的输入命名为信号名加上“Pre2”,依次类推
7.对于低(下降沿)有效信号添加后缀“n”
4.
2.3参考示例下图所示为一芯片的顶层框图,进行如下模块划分
1.时分复用模块(Tdmmodule)包括Tdm_Int,Tdm_Clk,Tdm_Buf,Tdm_MemCtl;
2.外部存储控制器(Emcmodule)包括Emc;
3.发送分段器(TxSarmodule)包括Tx_Memctl,Tx_Proc;
4.接收重组器(RxSarmodule)包括Rx_MemCtl,Rx_Proc;
5.UTOPIA接口模块(Utopiamodule)包括Ut_Ptx,Ut_Prx,Ut_Stx,Ut_TxFifo1,Ut_TxFifo2,Ut_RxFifo;
6.Cpu接口模块(CpuItfmodule)包括CpuItf;
7.时钟恢复模块(ClkRecmodule)包括ClkRec;
8.时钟及复位模块(ClkRstmodule)包括ClkRst;
9.测试模块(JTAGmodule)包括JTAG第二层模块前缀定义如下Tdmmodule Tdm_Emcmodule Emc_TxSarmodule Tx_RxSarmodule Rx_Utopiamodule Ut_CpuIntmodule Cpu_ClkRec Crec_ClkRstmodule Crs_
4.
2.4常用缩写表含义缩写含义缩写含义缩写含义缩写ReadyRdyAddressAddEmptyEptOverOvrDataDatFullFulChipSelectCsEnableEnWriteWrReadRdReadwriteRwWideWidSelectSelSingleSngTwiceTwiRequestReqAcknowledgeAckValidVldPulldownPdPullUpPuEndEndControlCtlReadEndRddWriteEndWrdErrorErrGetGetParityParNumberNumAlmostFullAfulCommandCmdCellCelMarkMarkPointerPtrHeadHdPayloadPyldLeftLftRightRgtResetRstHaltHltMasterMstSlaveSlvCountCntLastLastAlmostEmptyAeptClearClrReceiveRcvTrasmitTxTrasmitdataTxdReceiveddataRxdDifferenceDifPulsePlsValueValBusyBusyStartStrStateSta
4.3VERILOGHDL源代码文件结构VERILOGHDL源代码文件结构包含以下几个部分1)文件头说明2)宏定义3)模块及端口定义4)变量、参数定义说明5)代码主体6)注释行7)独立的Include.v文件
4.
3.1VERILOGHDL代码文件文件头在代码的开始部分必须按以下顺序加注文件头1公司的版权声明;这部分大家直接拷贝范例然后修改COPYRIGHTC后的年份时间即可2项目控制信息
2.1项目名,更改一次即可
2.2本文件基于哪个版本修改的版本号,在模块Release
1.0之后的修改必须每次修改都做记录;不一定只是当前版本减1或者
0.1或者
0.01,如范例是基于版本
2.0修改的,而当前版本已经是版本
2.
22.3本文件当前版本号,在模块Release
1.0之后的修改必须每次修改都做记录
2.4本文件模块名
2.5文件创建者及时间
2.6文件当前版本修改者及时间,在模块Release
1.0之后的修改必须每次修改都做记录
2.7版本修改历史记录,格式如范例修改时间,修改者姓名,修改内容说明;,在模块Release
1.0之后的修改必须每次修改都做记录
2.8如有算法运算模块,最好给出其规模、级数等指标代码文件头范例如下//================ZTEICDESIGNCO.LTD===============////InformationcontainedinthisConfidentialandProprietarywork//hasbeenownedbyZTEICDESIGNCO.LTD.//ThisSoftwaremaybeusedonlyunderLicensingAgreement//fromZTEICDESIGNCO.LTD.////COPYRIGHTC2006ZTEICDESIGNCO.LTD.//ALLRIGHTRESERVED////Theentirenoticeabovemustbedisplayedonallauthorizedcopies.//CopiesmaybemadeonlyunderextendedconsentfromZTEICDESIGNCO.LTD.//----------------------------------------------------------------------------------------------//ProjectandControlInformation//----------------------------------------------------------------------------------------------//ProjectName:Zi1208//LastVersion:
2.0//ThisVersion:
2.2//Thismodulename:Core_Ctl_Fsm//ThisFilegeneratedby:Kangxiaogang2003/11/06//ThisFileupdatedby:XieHua2006/01/13//RevisionHistory://
2004.
3.23LiuJuncorrect`IC_RETEXEC2sbugdecSP--keepSP.//
2004.
3.28LiuJuncorrect`IC_RETEXEC1sbugadddecSP//andchangecodestyleforavoidinglatchgeneration//
2004.
4.5LiuJunaddMOVCaccesscontrolincludingaddportban_movc//
2004.
4.13LiuJuncorrect`IC_CJNE_XXsbugwhenop_a==op_bCY=0//
2004.
4.22LiuJunkeeps_adr_muxwhenMOVAXX//
2004.
4.29LiuJunaddinputportsuspnd_coreforsim_board//
2004.
5.12LiuJunreplaceSIUss_ti/riwith7816sScdInt_i//
2004.
5.21LiuJunaddInstructionFlag//2004/5/27LiuJunchangedesigntofixre-enterEXinterruptservicesubroutine//whenlowleveltrigger//
2004.
6.7LiuJundeletesuspnd_coreport//
2004.
6.10LiuJunfixscdsints_regs_wr_ensbug//
2004.
8.9LiuJunchangeforDIVABcommandadd2clock//cyclestoreginputsandoutputs//
2004.
8.17LiuJunchange3commandsforaludata_ieachaddsonemorestate//
2004.
9.6LiuJuncorrectcjne_a_dsbuganddjnzsbug//2005-5-25XieHuaaddrdx_muxsignal//2005-6-30XieHuareplaceban_movcwithCoreMpu_MovcFlag//2005-8-22XieHuaaddonemorestatebeforestartuptodelayoneclocktostart//2005-10-18LuanchanghaiaddthesixthinterruptionanddefineSIU//2006-1-13XieHuaadddual-dptrsupport;//addmov@dptrAonemorestatefor4bytewr//--===================================================--
4.
3.2VERILOGHDL代码文件宏定义在文件头之后如需要定义宏,则用`define语句添加,每行定义一个宏,尽量添加注释
4.
3.3VERILOGHDL代码文件模块名及端口信号1一个文件只能有一对module/endmodule,且module定义名必须与文件名一致,但文件名含版本号2所有端口信号在定义、声明时都必须是每行只有一个,方便添加注释3声明模块端口信号的时候根据信号的方向按顺序分成输入、双向、输出三大部分;4模块中所有输入、输出和双向端口信号均必须定义;5端口信号定义时应与声明时顺序一致;6端口信号定义、声明时信号名的第一个字母应在同一列(建议利用TAB8键实现模块信号、关键词等的列对齐);
4.
3.4VERILOGHDL代码文件信号、变量及参数1变量与参数分隔的原则;强制2端口信号变量与内部信号变量分隔的原则;强制3不同功能块信号变量分隔的原则;4先wire变量+后reg变量的原则;所有信号必须显式定义,禁止采用缺省定义,包括端口信号,内部寄存器,内部连线等定义方式采用分类定义的方式,模板如下//inputsinputClk;//FromChipPininputResetn;//FromChipPin//outputsoutputCrecRxVClk;//ToTdm//---------------------------------------------------------//wiredeclaretions//---------------------------------------------------------//1Moduleinputsignals//-------------------------wireClk;//SystemClockwireResetn;//HardResetAsychronous//2Moduleinternalsignals//----------------------------wire[11:0]DIVXNRSum;//3Moduleoutputsignal//-------------------------wireCrecRxVClk;//--------------------------------------------------------------//Registerdeclarations//--------------------------------------------------------------//1Moduleinternalsignal//-------------------------reg[13:0]DIVXReg;//2Moduleoutputssignal//-------------------------
4.
3.5VERILOGHDL代码文件设计主体1按模块电路子功能块加以注释行及多个空行分隔代码;2对于子模块引用类子功能块代码,一行一般只能引用一个信号,信号的引用顺序要和子模块的信号声明顺序一致,子模块端口名和应用模块net名都要有且尽量相同,模块调用的Instance名尽量和模块名接近;例如//3instanceofJ0Cal//=================J0CaluJ0Cal.ClkClk_Rsa.ResetnResetn.SResetSReset.StartJ0StartJ
0.N_0N_
0.EndJ0EndJ
0.J0J0;3对于状态机类子功能块代码,首先是简单的State时序逻辑电路always语句描述,其次是next_state组合逻辑电路always+case语句描述,每个状态的输出控制信号尽量不要在next_state组合逻辑电路中出现,而是单独描述;always语句描述组合电路时一定要注意敏感列表的完整性状态机须采用简单的核心状态机,例如//
2.1HState//==============always@posedgeClkornegedgeResetnbeginif!ResetnHState=2’b0;elseHState=NextHState;endalways@HStateorEndSetH1orHCommandorHABCommandorHAECommandorEndHCalorEndJ0begincaseHState2b00:ifHCommand|HABCommand|HAECommandNextHState=2b01;elseNextHState=2b00;2b01:ifEndHCalNextHState=2b10;elseifEndSetH1//ifEndSetH1NextHState=2b10;elseNextHState=2b01;2b10:NextHState=2b11;2b11:ifEndJ0NextHState=2b00;elseNextHState=2b11;endcaseendassignEndHState=EndJ0;assignEndCtl=EndHStateCommand==4b0010|EndABState|EndAEState;assignStartHCal=HCommand|HABCommand|HAECommand~FastMulMode;4对于其他子功能块代码,应以时序子电路及其相关组合电路分组,每个分组必须将组合电路部分与时序电路部分分开描述,并分别加以注释;组合电路采用assign语句例如//4ELen//==============always@posedgeClkornegedgeResetnbeginif!ResetnbeginELenRegL=8b0;ELenRegH=4b0;endelsebeginELenRegL=NextELenL;ELenRegH=NextELenH;endendassignNextELenL=ELenSelLRsaReg_WrRsaReg_Data_w:ELenRegL;assignELenSelL=RsaReg_SelRsaReg_Addr==`ELENLREG;assignNextELenH=ELenSelHRsaReg_WrRsaReg_Data_w[3:0]:ELenRegH;assignELenSelH=RsaReg_SelRsaReg_Addr==`ELENHREG;assignELenReg={ELenRegHELenRegL};assignELen=ELenReg;9位宽对齐运算符号代码特殊处理
4.
3.6VERILOGHDL代码文件注释行1VerilogHDL源代码各部分要有“//---------”和空行隔离;2源代码的功能描述的主体前应有本module的功能简介overview;3各端口信号、变量、参数、子模块引用等尽量多添加注释说明;4不允许使用“/*….*/”的注释方法,提倡使用“//”;5不允许用中文注释6在描述状态机的时候,每一个状态的功能,翻转条件,翻转后进入的状态,和产生的控制信号要作简单的介绍;7每个代码文件的结束的时候要用“//--=======END=====--”进行声明;
4.
3.7VERILOGHDL代码文件独立Include.v不允许在Verilog模块设计代码文件中添加`Include语句说明,必须单独编写独立的XXX_Include.v文件,将本模块包含的所有Verilog源代码用`Include语句说明不能在模块中定义`timescale,而是在include.v中添加5VERILOGHDL代码范例
5.1复用器表达方式ABS01sout2inputMUX图5‑1MUXassignout=SA B;或assignout=!SB A;ABs101sout01s01sCDs2s3cascadedMUX图5‑2多级MUX例1assignout=s1A s2B s3C D;ABs101s01s01sCDs2s3cascadedMUX图5‑3多级MUX例2assignout=s1A!s2B s3C D;文档类型开发文档保密级别机。