华为coding-style

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

海思高校合作——QA培训资料一、RTLCODE规范1.标准的文件头在每一个版块的开头一定要使用统一的文件头,其中包括作者名,模块名,创建日期,概要,更改记录,版权等必要信息。统一使用以下的文件头://**************************************************************//COPYRIGHT(c)2005,HisliconTechnologiesCo,Ltd//Allrightsreserved.////IPLIBINDEX:IPlibindexjustsaUTOPIA_B//IPName:thetopmodule_nameofthisip,usually,issame//asthesmallipclassifiednamejustasUTOPIA//Filename:file_nameofthefilejustas“tx_fifo.v”//Modulename:module_nameofthisfilejustas“TX_FIFO”//Fullname:completeEmglishnmeofthisabbreviated////Author:Athor/ID//Email:Author’semail//Data://Version:V1.0////Abstract://Calledby:FatherModule////Modificationhistory//------------------------------------------------------------------------------------------------------//////$Log$////*********************************************************************2.标准的module格式(module整体结构)对于模块的书写采用统一的格式便于项目内部成员的理解和维护,我们用批处理建立了一个MODULE模块,其内容解释如下:端口定义按照输入,输出,双向的顺序:模块名、模块例化名统一,例化名前加大写U_以区分(多次例化另加标识),三者关系:文件名:xxx.v(小写)模块名:XXX(大写)例化名:U_XXX(大写)IP内部所有的模块名都要加IP名或者IP名简称作前缀,如USB_CTRL、USB_TX_FIFO。//*****************************//DEFINEMODULEPORT////******************************////moduleMODULE_NAME(//INPUTinput_port_1,…input_port_m,//OUTPUToutput_port_1,…output_port_m,);//*****************************//DEFINEPARAMETER////******************************parameter…//******************************//DEFINEINPUT//******************************inputrst_n;//reset,activelow.inputclk_*;//clocksignal,50M.input[n:0]a_din;//*****input[k:0]b_din;//*****//******************************//DEFINEOUTPUT////******************************output[m:0]a_dout;//*****output[i:0]b_dout;//*****//******************************//OUTPUTATRRIBUTE////******************************//REGSreg[m:0]a_dout;//*****//WIRESwire[i:0]b_dout;//*****//******************************//INSTSNCEMODULE////******************************MODULE_NAME_AU_MODULE_NAME_A(.A(A),.B(B),.C(C),);…//******************************//MAINCODE////******************************………………//******************************//Endmodule3.一致的排版A.一致的缩排统一的缩排取4个空格宽度输入输出信号的宽度定义与关键字之间,信号名与宽度之间要用空格分开;所有宽度定义对所有信号名对齐,代码风格统一如下:input[3:0]input_a;//*****inputinput_b;//*****…output[128:0]output_a;output[15:0]output_b;outputoutput_c;B.一致的beginend书写方式always中,一定要用beginend区分,格式和代码风格统一如下:always@(postedgeclkornegedgerst_n)beginif(rst_n==1’b0)syn_rst=‘DLY1’b0;elsebeginif(a==b)syn_rst=‘DLY1’b1;elsesyn_rst=‘DLY1’b0;endendifelse中仅有一个语句行时,不要使用beginend;如果有多个语句行时,beginend和if()或else()空四个格。格式如下:if(…)…elseif(…)else********************************************************************if(…)…elseif(…)begin……(endelse4.一致的信号命名风格简洁,清晰,有效是基本的信号命名规则,详见命名规范。全称缩写中文含义acknowledgeack应答adressaddr(ad)地址arbiterarb仲裁checkchk校验,如CRC校验clockclk时钟configcfgConfiguration,装置controlctrl控制countcnt计数dataindin(di)数据输入dataoutdout(do)数据输出decodede译码decreasedec减一delaydlydisabledis不使能errorerr错误(指示)enableen使能framefrm帧generategen生成,如CRC生成grantgnt申请通过increaseinc加一inputin(i)lengthlen(帧、包)长nmportnm网管相关outputout(o)packet不推荐packetpkt与帧相同prioritypri优先级pointerptr指针rdenableren读使能readrd读(操作)readyrdy应答信号或准备好receiverx(帧数据)接收requestreq(服务、仲裁)请求resetrstsegmentsegsoucescr源(端口)ststisticsstat统计timertmr定时器switchersfSwitchfabrictemporarytmp临时transmittx发送(帧数据)相关Validvld(v)有效、校验正确wrenablewen写使能writewr写操作a.端口、信号、变量名的所有字母小写:函数名、宏定义、参数定义用大写b.使用简称、缩略词(加上列表)c.基于含义命名(避免以数字命名的简单做法),含义可分段(最多分三段),每一小段之间加下划线”_”,如tx_data_val;命名长度一般限制在20个字符以内。d.低电平有效信号,加后缀”_n”,如rst_ne.无条件寄存的寄存信号在原信号上加ff1、ff2…如原信号data_in,寄存一拍data_in_ff1,寄存两拍data_in_ff2f.不能用”reg”,作为最后的后缀名,因为综合工具会给寄存器自动加上_reg,如果命名里就用_reg作为后缀名则扰乱了网表的可读性。5.统一的表达式书写A.括号的使用如果一个表达式的分组情况不是很明显时,加上括号有助于理解。例如下面的代码加上括号就清晰很多。if(&a==1’b1&&!flag==1’b1||b==1’b1)//改为:if((&a==1’b1)&&(!flag==1’b1)||(b==1’b1))//B.适当的使用空格一般表达式在运算符的两侧要各留出一个空格,但定义比较长的表达式,去掉预先级高的运算符前的空格,使其与运算对象紧连在一起,可以更清晰的显示表达式结构。还是上面的例子:if((&a==1’b1)&&(!flag==1’b1)||(b==1’b1))//改为:if((&a==1’b1)&&(!flag==1’b1)||(b==1’b1))//”=”,”==”前后都要加空格。C.赋值要指明比特宽度赋值或者条件判断时要注明比特宽度,注意表达式的位宽匹配。如:reg[4:0]signal_a;错误:1signal_a=5;2if(signal_a==5)3signal_a=signal_b[3:0]+4;正确:1signal_a=5d52if(signal_a==5d5)3signal_a={1’b0,signal_b[3:0]+5d4因为工具默认是32位宽,如果不注明位宽,工具检查会报warning,而且这样增加了设计的严谨性。6.统一的语句书写――条件判断结构书写方式A.条件的完整性Ifelse搭配使用,对于缺省的条件要写”else;”;Ifelsed条件判别式要全面,比如if(a==1’b0);Case中的缺省条件要写”default”;B.”ifelse”结构:适用于复杂条件判断的语句但对于复杂的条件判断,使用?:如果不仔细分析条件的每一条路径,就让读代码搞不清它是到底要做什么。例如:C=(!Ic&&!rc)?0(Ic?rc:Ic)//(?:)改为:always@(Icorrc)//ifelsebeginif((Ic==0)&&(rc==0))c=0;elseif(Ic==1)c=rc;elsec=Ic;end即使是简单的条件判断,我们也必须使用IF-ELSE,当涉及复杂的条件判断,使用IF-ELSE结构以获得清晰的结构便于理解和维护。因此必须使用IF-ELSE。C.”IFELSE”结构VS”CASE”结构IFELSE结构综合的结构可能是与或非门构成的,也可能是一组多路选择器,而case结构综合结果一般会是多路选择器,但对于可以优化的case综合工具会综合出更简单的结构。所有对于可以写出平行结构的条件,优先写成case结构,例如地址译码等,条件之间有重复和嵌套的情况则是写成ifelse结构。D.FiniteStateMachine不允许有模糊不清的状态机模式,所有的状态机必须清晰明了。我们要求将状态机的时序部分和组合逻辑部分分开。例如:modulestate4(clockresetout);inputresetinputclock;output[1:0]out;parameter[1:0]stateA=2’b00;parameter[1:0]stateB=2’b01;parameter[1:0]stateC=2’b10;parameter[1:0]stateD=2’b11;reg[1:0]state;reg[1:0]nextstate;reg[1:0]out;always@(posedgeclock)beginif(reset==1,0’b0)state=stateA;elsestate=nextstate;e

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功