首页 Verilog编码规范

Verilog编码规范

举报
开通vip

Verilog编码规范PAGEVerilog编码规范(仅供内部使用) 拟制: xxx 日期: xxx 审核: 审核者 日期: yyyy-mm-dd 批准: 批准者 日期: yyyy-mm-dd版权所有侵权必究修订记录 修订日期 修订版本 描述 修订者 目录61命名规范82代码编写规范82.1版面82.2编写代码规范173电路设计规则173.1时钟173.2复位183.3避免LATCH183.4避免组合反馈183.5赋值语句193.6case语句和if-...

Verilog编码规范
PAGEVerilog编码 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 (仅供内部使用) 拟制: xxx 日期: xxx 审核: 审核者 日期: yyyy-mm-dd 批准: 批准者 日期: yyyy-mm-dd版权所有侵权必究修订记录 修订日期 修订版本 描述 修订者 目录61命名规范82代码编写规范82.1版面82.2编写代码规范173电路设计规则173.1时钟173.2复位183.3避免LATCH183.4避免组合反馈183.5赋值语句193.6case语句和if-then-else语句193.7状态机213.8异步逻辑214模块划分215提高可移植性的编码风格215.1采用 参数 转速和进给参数表a氧化沟运行参数高温蒸汽处理医疗废物pid参数自整定算法口腔医院集中消毒供应 化设计225.2采用独立于工具平台和工艺库的设计225.3尽量使用已经得到验证的IP236其他一些设计建议257附件308参考文档:基本原则:简单,一致,可重用。·简单指尽量使用简单的语句,尽量使用简单的设计,尽量使用简单的时钟,尽量使用简单的复位。·一致指尽量保持代码风格一致,尽量保持命名一致。·可重用指有成熟的IP尽量使用IP,设计的代码要尽量可重用。1命名规范给信号命名就像给孩子取名字一样,有区别,有根源,有深度,还有一点,要简单,别冗长。有区别指取名字不要一样,假如大家只有一个手机号码,那这个号码还能有什么用处?有根源指取名字要能象姓氏一样,让人一看就直到是张家的后代而不是李家的。有深度就是取名字要有涵义,张一,张二,张三虽然也是名字,但是请考虑一下被取名字人的感受。简单点,几十个字母长的名字,打字的和看字的都累。·大小写规则:只有parameter,`define和module名称才能享受大写。·Module名应与文件名保持一致(文件名是小写),假如不想在设计后面遇到麻烦的话。·不要尝试使用任何保留字,因为他们已经被保留了。·不要重复使用同样的名字去命名不同的数据。·(建议)对module名加”_LVx”的后缀,增强module名称的结构层次含义如:设计顶层为TOPLEVEL,即LEVEL1,命名为QTRxxxx_LV1;时钟模块,IO_PAD,CORE,为LEVEL2,命名为CLK_PROC_LV2等等;CORE内子模块为LEVEL3,然后以此类推。·对于来自同一驱动源的所有时钟信号使用相同的名字。·对于低电平有效的信号,应该以_n结尾。·模块间相连端口名称要一致。·(建议)使用下表所列的命名缩写方式。 全称 名称 clock Clk reset rst clear clr address addr data_in din data_out dout interruptrequest int readenable rden writeenable wren count cnt request req control ctrl arbiter arb pointer ptr segment seg memory mem register reg·(建议)使用下列后缀命名方式 全称 添加后缀 activelow _n enable _en select _sel flag _flg delay _dly·信号命名的两个词之间用下划线间隔,如ram_addr,cnt_ctrl等等·信号命名尽量不要使用孤立的、小写的英文字母L2代码编写规范2.1版面·语句独立成行,增加可读性和可维护性。·行的长度保持每行小于或等于72个字符。因为有的终端或打印机每行不能超过80个字符。规定72个字符是为了留出边空,提高可读性。还有一个原因是为象vi这样的编辑器留有显示行号的地方。用回车来分割超过72个字符的行,并且在下一行用缩进来表示该行是前一行的继续。·缩进。用缩进来提高续行和嵌套循环的可读性。缩进采用4个空格。避免使用TAB键。不同的编辑器或用户环境使得TAB的位置差别很大,造成缩进的混乱。有一些工具可以将TAB替换成空格。·(建议)使用注释使用注释来解释端口、信号、信号组、always块、函数等。注释应该放在它所描述的代码的附近。注释应该简明扼要,并足够说明问题。避免注释杂乱。显而易见的功能不用加注释。注释关键是说明设计意图。2.2编写代码规范·在源文件中要有文件头在源文件、script文件的开始应包含一个文件头。文件头至少应包含下列信息:文件名、作者、模块的功能描述和关键特征的列表、文件产生的日期、更改记录(日期、更改者、更改的内容)。(参见代码模板sample.v)·模块名称用大写,例如:moduleMEM_CTRL。·端口声明时每行声明一个端口,并有注释(最好在同一行),也可对同一类型的一组端口加注释。对于时钟,复位以及其他控制信号,需要注释有效工作沿或者有效工作值建议用下述顺序声明端口。//INPUTsclocks,//posedgeactiveresets,//activehighenables,//activehighothercontrolsignals,Dataandaddresslines,//OUTPUTsclocks,resets,enables,othercontrolsignals,data·在输入和输出两类端口之间留一个空行来提高可读性。如上例所示。·端口列表之后,使用parameter定义内部信号宽度以及其他参数化设置。·IO信号申明和内部信号申明要单独成行,参考sample.v文件·使用简单的语句,一般使用if…else…和case就能满足大部分需求,不要使用复杂的语句·常量(1)一位的控制信号采用二进制表达方式,如1'b0;(2)常数位宽不可缺省;如:Bad:if((rst_n==0)&&(cnt_addr==15))Good:if((rst_n==1'b0)&&(cnt_addr==5'd15))·变量(1)NetandRegister(a)一位位宽的wire信号的声明不可缺省(b)一个reg变量只可以在一个always语句中赋值(c)(建议)任一register的赋值加上单位延迟,对异步复位同样加上单位延迟;(d)向量有效位顺序的定义采用倒序 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 ,如:Data[4:0](2)Memory代码中不建议使用Memory(存储器阵列),Memory只用于Testbench中,访问存储器阵列中某一向量的某一位或几位,需要通过中间变量进行。例:reg[15:0]mem[0:255];temp=mem[33];//tempgetsdataataddr333_bit_reg=temp[8:6];//getthreebitsofaddr33·运算符及表达式(1)表达式(a)用括号来表示执行的优先级,尽管操作符本身有优先顺序,但用括号表示优先级对读者更清晰,更有意义如:Bad:A+B?C:D;Good:(A+B)?C:D;(b)适当使用括号适当使用括号可以控制生成的电路结构,如Z=A+B+C+D,综合结果可能为三级加法器,而变换为Z=(A+B)+(C+D),综合结果则可能为两级加法器;(c)注意资源共享需要资源共享的部分一定要放在同一个模块的同一个always语句中,不同模块不同always语句之间的代码不能实现资源共享。如:always@(...)if(...)d0=A+B;elsed0=C+D;中,DC可能只会生成一个加法器。条件算子中不存在资源共享如:z=(cond==1’b1)?(a+b):(c+d);必须使用两个加法器;而等效的条件if-else语句可以资源共享,如:if(cond==1’b1)z=(a+b);elsez=(c+d);只要加法器的输入端复用,就可以实现加法器的共享,使用一个加法器实现。(d)尽量采用公共子表达式如:x=a+b+cy=d+a+b改为:z=a+bx=z+cy=d+z(2)算符(a)条件运算符r1=gate?r2:r3;避免使用条件嵌套:r1=(aa=0)?((bb==0)?r2:r3):r4;orr1={aa,bb}==0?r2:{aa,bb}==0?r3:{aa,bb}==0?R4:r4;(b)逻辑操作符在if(),while(),()?A:B之类的表达式中,括号中的表达式应该是一个逻辑表达式,相应的操作符应该用逻辑操作符。如:wirex,A,B;(x)?A:B与(x==1'b1)?A:BIf(A&B)与if((A&&B)==1’b1)While(A=B)与while(A==B)操作结果相同,但显然前者不规范。(c)乘法运算符“*”对于一个变量data与常数constant相乘data*constant,如果常数不是2的整数次幂,建议先将其分解,如constant=53=32+16+4+1=2^5+2^4+2^2+2^0,这样乘积就可以表示为变量data移位结果的相加。对于乘法运算符“*”,综合后通常得到的是乘法器,时延较大。·赋值语句(1)不要在信号列表中进行运算操作如:Bad:addr(a,b,d&e);Good:addr(a,b,c);c=d&e;(2)BLOCK赋值和NON-BLOCK赋值的使用(a)组合逻辑采用BLOCK赋值(=)如:always@(dat)i_dat=dat;(b)非组合逻辑(主要是寄存器)采用NON-BLOCK赋值并加delay以保证前仿真和后仿真的一致如:always@(posedegclk)q<=#`DELd;(3)在同一块语句中不允许同时出现阻塞赋值和非阻塞赋值·条件语句(1)IF语句(a)向量比较时,比较的向量长度要相等,同样向量和常量比较时长度也要求匹配,长度不同时要求进行显式位扩展(verilog对位数小的向量做0扩展以使它们的长度相匹配,该扩展是隐式的)如:reg[7:0]abc;reg[3:0]def;.......if(abc=={4'b0,def})begin.......if(abc==8'h0)begin(b)不要采用if表达式的简写形式例如:if(variable)等同于if(variable!=0)if(!variable)等同于if(variable==0)但后者才合乎规范(c)每个if都应该有一个else与之相对应,如果条件为假时不进行任何操作,则用一条空语句else;避免产生latch(d)if...elseif...elseif...else的代码 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 写格式如下,要注意优先级if(...)begin......endelsebeginif(...)......else(...)if(...)else(...)end(d)如果变量在if-else语句中非完全赋值,则应给变量一个缺省值如:if(a==b)beginv1=2'b01;v2=2'b10;//v3isnotassignedendelseif(a==c)beginv2=2'b10;v3=2'b11;//v1isnotassignedendelse//default赋值beginv1=2'b00;v2=2'b00;v3=2'b00;end(2)CASE语句(a)所有的case语句都应该有一个default语句,避免产生Latch(b)(建议)不要使用casex、casez语句,综合工具不支持·循环语句(1)forever语句(2)repeat语句(3)while语句(4)for语句在可以用其它语句描述电路时,建议不要采用循环语句来描述。·initial语句不要在RTL代码中出现initial块综合会将initial块忽略,使前仿真和后仿真不一致initialbegin......end·always语句(1)在使用always生成组合逻辑时,敏感表要列全,敏感表中也不能包含没有用到的变量。Rule:Combinationalsensitivitylistsshouldinclude1)Anysignalonrighthandsideofassignment2)AnysignaliniforcaseexpressionForexample:......modulesense_list_ex(b,c,d);//PARAMETER//INPUTSinputb;inputc;inputd;//OUTPUTS//INOUTS//SIGNALDECLARATIONSwireb;wirec;wired;rega;//ASSIGNSTATEMENTS//MAINCODEalways@(borcord)if(b==1’b1)a=c&d;elseif(c==1’b1)a=d;endmodule//SENSE_LIST_EX(2)对带异步清零端的寄存器的定义模板always@(posedgeclk_mainornegedgerst_n)if(rst_n==1'b0)//此处统一采用rst_n==1'b0形式而不采用(!rst_n)begin//形式,对相关寄存器清0(采用#`u_dly<=赋值)......endelsebegin//对相关寄存器赋值(采用#`u_dly<=赋值)......end采用时钟上升沿触发。·有限状态机(FSM)(1)组合逻辑和时序逻辑分开描述;//PART1:COMBINATERIALLOGICFORNEXTSTATEalways@(cur_stateorfull_new_frorfullorhave_space)begin:OVC_FSM_NXT_STcase(cur_state)STDBY:beginif(full_new_fr==1'b1)nxt_state=W_BLOCK;elseif(full==1'b1)nxt_state=W_DSCD;elsenxt_state=cur_state;endW_BLOCK:beginif(have_space==1'b1)nxt_state=STDBY;elsenxt_state=cur_state;endW_DSCD:beginif(have_space==1'b1)nxt_state=STDBY;elsenxt_state=W_BLOCK;enddefault:nxt_state=STDBY;endcaseend//OVC_FSM_NXT_ST//PART2:SEQUENTIALLOGICFORCURRENTSTATEalways@(posedgeclkor`RST_EDGEreset)begin:OVC_FSM_ST_TRANSif(reset==`RST_VALUE)cur_state<=`DLYW_BLOCK;elsecur_state<=`DLYnxt_state;end//OVC_FSM_ST_TRANS3电路设计规则3.1时钟·(建议)简单的时钟结构易于理解、分析和维护,而且容易产生好的综合结果。最好是能够有单一的全局时钟,所有寄存器都在上升沿触发。·所有子模块内部使用单一时钟单一时钟沿,如条件不满足时,必须注明原因,并提出对综合以及布线的要求。·设计中包含内部产生的时钟时,必须将所有需要的时钟在一个单独的模块中生成。·如果不得不用混合的时钟沿,在综合和时序分析时确保能满足时钟精度最差情况下的占空比。同时确保把假定的占空比写入用户手册。在多数设计中,占空比是时钟树的函数,而时钟树的插入通常又依赖于具体的工艺。使用Core的芯片设计者必须检查实际的占空比能够满足Core的要求,也应该了解怎样改变综合和时序分析的策略以使得Core能够满足实际的条件。·(建议)多数基于扫描链的测试方法要求对上升沿和下降沿触发的寄存器分开处理。如果必须使用大量的上升沿和下降沿触发的寄存器,将上升沿和下降沿触发的寄存器分到不同的模块中是很有用的。这样容易确定下降沿触发的寄存器,并可将它们放到不同的扫描链中。·(建议)避免在RTL级手工实例化时钟Buffer。时钟Buffer通常是在综合以后在物理设计时插入的。在可综合的RTL代码中,时钟网络通常被认为是理想的网络,没有延时。在布局布线时,时钟树插入工具插入适当的结构,尽可能的接近理想的、平衡的时钟配布网络。一个例外情况是在顶层模块中可以插入厂家提供的伪时钟Buffer,用于指明时钟树的源头和时钟树的参数。·(建议)避免在RTL级使用门控时钟或内部产生的时钟信号。门控时钟电路依赖于具体的工艺和时序。门控时钟不正确的时序可能导致假的时钟信号和误操作。不同局部时钟SKEW还会导致保持时间冲突(violation)。门控时钟还会降低电路的可测性,也使得综合的约束变得困难。多数低功耗的电路需要门控时钟,但它们不应该出现在RTL级的编码中,象PowerCompiler这类工具可以自动去做。如果设计中必须使用门控时钟、内部产生的时钟或复位信号,应该让产生这些信号的电路位于设计顶层的一个独立的模块中。它将违反编码规范的地方限制在一个小的范围内,有利于对这些产生电路开发特殊的测试策略。对于其他模块将可采用 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的时序分析和扫描链插入技术。3.2复位·(建议)确保所有寄存器只被简单的复位信号所控制。最好的情况是,复位信号是1bit寄存器的输出。因为组合逻辑的输出会带有毛刺,对于异步复位电路,则会引起触发器的异常。·(建议)尽可能避免内部产生的条件复位信号。通常模块内所有寄存器应在同一时间内被复位。这种方式使得分析和设计更加简单和容易。·(建议)如果需要条件复位,设置一个单独的复位信号,并且将产生逻辑隔离于一个单独的模块。这种方式可使代码更易读,并易于综合出好的结果。·如果需要内部产生异步复位信号,必须保证所产生的异步复位信号没有毛刺,最好的办法是保证异步复位信号最后为1bit触发器的输出,例如当计数器达到一个预设值时,产生异步复位信号:bad:wirereset;assignreset=(count==value);better:regreset;always@(posedgeclk)reset<=(count==value);3.3避免LATCH描述组合逻辑的always块中,如果if语句缺乏else子句、case语句中各个条件所处理的变量不同都会在综合时推断出LATCH。使用下述方法可避免LATCH:·对所有的输入条件都给出输出。·保证always块敏感列表完备。敏感列表应包括:if(…),case(…)中的条件信号;所有always块中位于赋值语句右边的信号;当信号为多bit向量时,应包括向量的所有bit而不是部分。·在最终优先级的分支上使用else子句,而不用elsif。·所有的Case应该有一个defaultcase。·避免使用LATCH,除非能清楚地分析相关电路的时序以及毛刺带来的影响3.4避免组合反馈·在设计中避免组合反馈电路。这种电路违背了同步设计原则,难以控制其行为,对仿真、调试和DFT都极其不利。3.5赋值语句·在写可综合的代码时,在时序逻辑的always语句块中总是使用非阻塞赋值。否则RTL级的仿真会和门级仿真的结果不一致。·在组合逻辑的always语句块中使用阻塞赋值。·同一个触发器不能在多个always块中被赋值。3.6case语句和if-else语句·(建议)如果不需要有优先级的编码结构,建议使用case语句而不要使用if-else语句。对于基于cycle的仿真器,case语句的仿真速度要比if语句的仿真速度快。对于大的多选器,case语句也比条件赋值语句的仿真速度快。对于综合工具,case语句也往往能产生出时序和面积更优化的电路。·(建议)对于条件分支为独热编码的case语句,建议采用下列语句,对于综合工具能产生较优化的电路case(1’b1)condition1:statement;condition2:statement;…default:statement;endcase3.7状态机·将状态机的描述分成两个always块,一个用来描述组合逻辑,一个用来描述时序逻辑。·(建议)用参数语句来定义状态向量。·(建议)将状态机的逻辑和非状态机的逻辑分成不同的模块,以便于综合工具对状态机进行单独优化。·必须使用default条件为状态机指定一个默认的状态,防止状态机进入死锁状态。·FSM提供防死锁机制,以防止限死在某个状态,特别是在异常情况下。·在FSM逻辑比较复杂的时候,建议使用独热编码方式,以提高时序。//PART1:COMBINATERIALLOGICFORNEXTSTATEalways@(cur_stateorfull_new_frorfullorhave_space)begin:OVC_FSM_NXT_STcase(cur_state)STDBY:beginif(full_new_fr==1'b1)nxt_state=W_BLOCK;elseif(full==1'b1)nxt_state=W_DSCD;elsenxt_state=cur_state;endW_BLOCK:beginif(have_space==1'b1)nxt_state=STDBY;elsenxt_state=cur_state;endW_DSCD:beginif(have_space==1'b1)nxt_state=STDBY;elsenxt_state=W_BLOCK;enddefault:nxt_state=STDBY;endcaseend//OVC_FSM_NXT_ST//PART2:SEQUENTIALLOGICFORCURRENTSTATEalways@(posedgeclkor`RST_EDGEreset)begin:OVC_FSM_ST_TRANSif(reset==`RST_VALUE)cur_state<=`DLYW_BLOCK;elsecur_state<=`DLYnxt_state;end//OVC_FSM_ST_TRANS·状态机输出异步控制信号时,必须采用下列结构3.8异步逻辑·(建议)避免使用异步逻辑。异步逻辑难于设计和验证,并会降低设计的可移植性。·(建议)如果在设计中使用异步逻辑,将异步逻辑和同步逻辑分成不同的模块。这使得代码检查更加容易(异步逻辑通常需要仔细的检查和功能及时序上的验证)。·异步信号必须使用两级触发器同步之后使用。如下图所示4模块划分·(建议)对设计层次中的每一个模块,锁存模块的所有输出信号。这样做可以简化处理过程,它使得输出的驱动强度和输入延时都可预期。输出驱动强度是触发器的平均驱动强度。·(建议)保持相关的组合逻辑在同一个模块中。这有利于综合工具对逻辑的优化,也有利于时序预算和快速仿真。·(建议)对不同设计目标的电路分成不同的模块将含有关键路径的逻辑和非关键路径的逻辑分成不同的模块,以便综合工具对关键路径采用速度优化,对非关键路径采用面积优化。·(建议)确保只有在顶层模块中才包括I/OPAD。顶层模块中还包括一个中层模块,该模块中包含JTAG模块、时钟产生电路、CORE逻辑。这个要求不是强制性的,但这样做易于集成测试逻辑、PAD和功能逻辑。·(建议)避免在顶层模块中出现Gluelogic。5提高可移植性的编码风格5.1采用参数化设计·(建议)不要直接使用数字在设计中不要直接使用数字(Hard-CodedNumericValue)。作为例外,可以使用0和1(但不要组合使用,如1001)。例如:差的编码风格:wire[7:0]my_in_bus;reg[7:0]my_out_bus;好的编码风格:`DefineMY_BUS_SIZE8wire[MY_BUS_SIZE-1:0]my_in_bus;reg[MY_BUS_SIZE-1:0]my_out_bus;另一种较好的编码风格,有利于IP封装:parameterBUS_SIZE=8;wire[BUS_SIZE-1:0]my_in_bus;reg[BUS_SIZE-1:0]my_out_bus·(建议)将一个设计的所有的`define语句集中到一个单独的文件。5.2采用独立于工具平台和工艺库的设计·(建议)避免嵌入式的EDA工具的命令。不要在源代码中使用嵌入式的EDA工具命令。因为其他的EDA工具并不一定认得这些隐含的命令,导致差的或错误的结果,降低代码的可移植性。即使是使用DesignCompiler,当综合策略改变是,嵌在源代码中的综合命令也不如单独的script文件中的综合命令容易修改。例如:1://synopsysasync_set_reset“reset”2:always@(posedgeclkorposedgereset)诸如第一行之类的工具命令最好不要使用。这个规则有一个例外就是编译开关的打开和关闭可以嵌入到代码中。例如://synopsystranslate_off//synopsystranslate_on·(建议)使用独立于工艺的库。·(建议)在设计中避免实例化(instantiate)门,门级设计难于理解、维护和重用。如果使用的特定工艺的门,设计将变得不可移植。如果必须使用特定工艺的门,建议将它们放于单独得模块,这样在移植时易于更改。5.3尽量使用已经得到验证的IP(1)对于通用的接口和常用的模块,尽量使用已经得到验证的IP(2)尽量对自己设计的模块采用参数化设计,在得到充分验证之后,能被其他项目当作IP使用,提高其他设计的可靠性,缩短设计周期。bad:moduleadd(a,b,c);input[7:0]a,b;output[7:0]c;…better:moduleadd(a,b,c);parameterWIDTH=8;input[WIDTH-1:0]a,b;output[WIDTH-1:0]c;6其他一些设计建议·整个项目组都使用一致的信号命名规则。·尽量避免使用复杂的运算符,如*,/,%。特别是/,%,大部分综合器的支持是非常有限的(只支持常量)。·提供方便调试的功能:比如增加可读的标志寄存器、统计计数、FIFO的状态寄存器等等。·在地址空间允许的范围内,尽量使内部关键触发器能够通过CPU接口被CPU访问和控制,如计数器,移位寄存器,状态机寄存器等等Bad:reg[7:0]cnt;Always@(posedgeclkorposedgerst)If(rst==1’b1)cnt<=0;Elseif(cnt_en==1’b1)cnt<=cnt+_1;better:reg[7:0]cnt;always@(posedgeclkorposedgerst)if(rst==1’b1)cnt<=0;elseif(cnt_en|test_cnt_en)cnt<=cnt+1;·尽量避免使用异步FIFO,采用将速度较慢侧的读或者写使能信号同步到速度较快侧,然后使用同步FIFO实现。·对于FPGA设计,适当限制组合逻辑的输入信号数目(4个以下最好)。在一个logicblock中fan-in数目是固定的;组合逻辑如果需要跨越Logicblock,则延迟会大大增加。这对提高Timing很有用。·对于FPGA设计,一般情况先使用块RAM,在块RAM资源不够的情况下才使用分散RAM,而且分散RAM的接口时序最好与块RAM的时序一致,便于随时调整RAM的使用状况。·逻辑级数过多的功能块,使用寄存器隔离,提高设计的综合时的时钟频率。·不要使用位宽过大的计数器,建议将位宽超过8的计数器打散成多个不超过8bit宽度的计数器。计数器要求可被CPU直接访问,并且每个打散后的小计数器都有CPU可控的计数使能信号。Bad:reg[31:0]cnt;Always@(posedgeclkorposedgerst)If(rst==1’b1)cnt<=0;Elseif(cnt_en==1’b1)cnt<=cnt+_1;better:reg[7:0]cnt0,cnt1,cnt2,cnt3;wirecnt0_en,cnt1_en,cnt2_en,cnt3_en;assigncnt0_en=cnt_en|test_cnt_en;assigncnt1_en=(&cnt0&cnt_en)|test_cnt_en;…always@(posedgeclkorposedgerst)if(rst==1’b1)cnt0<=0;elseif(cnt0_en==1’b1)cnt0<=cnt0+1;…·尽可能地使用FPGA工具能提供的Cores。例如ALTERA/Xilinx的FPGA内嵌的DSP可以用于实现比较复杂的数学计算公式、算法,而且不占用原有的LUT资源。·养成良好的习惯:每个模块代码完成之后单独综合,或者几个子模块合成一个功能相对完整的模块时综合一次,把相应的warnning或者latch去掉,不能去除的warning需要全部加以说明,并以文档方式记录。7附件1.Verilog编码文档模板:sample.v//***********************************************************************////Company:UTStarcom////Copyright(c)2003,UTStarcomTelecomCo.,Ltd.//Allrightsreserved////ProjectName://Filename:xxx.v//Designer:yourname//Email:name@utstar.com//Date:////Version:1.0////MODULEName:XXXXX//Description:¡­¡­¡­.////Calledby:XXXX////-----------------------------------------------------------------------------//ModificationHistory//$Log:sample.v,v$//Revision1.22007/12/2903:17:59hz05145//tab2space////Revision1.12007/06/0503:57:49hz05145//xx_yychangedtommxnn////Revision1.12005/09/2002:57:07hz05145//nomessage////intial//////***********************************************************************////*************************//INCLUDES//*************************`include"defines.v"//*************************//MODULEDEFINTION//*************************moduleSAMPLE(//INPUTSrst,clk77m_sys,mode_choose,//'0'chooseSDHmodeframe;'1'meansSONETmodeframe.cpu_cs,cpu_addr,cpu_datain,cpu_rd,cpu_we,...//OUTPUTScpu_dataout,cpu_int,...);//*************************//INPUTS//*************************inputrst;inputclk77m_sys;inputmode_choose;inputcpu_cs;input[7:0]cpu_addr;input[15:0]cpu_datain;inputcpu_rd;inputcpu_we;//*************************//OUTPUTS//*************************output[15:0]cpu_dataout;outputcpu_int;wire[15:0]cpu_dataout;wirecpu_int;//*************************//INTERNALSIGNALS//*************************wiredout_tmp;regfifo_wen;//*************************//PARAMETERS//*************************parameterRST_STATE=3'b000;//*************************//CODE//*************************always@(posedgeclk77m_sysor`RST_EDGErst)begin:FIFO_W_SIGif(rst==`RST_VALUE)beginfifo_wen<=1'b0;endelsebeginfifo_wen<=fifo_wen_tmp;endend//FIFO_W_SIG//*************************//SUBMODULEINSTANTIATION//*************************WRAP_SRAM16x15U_WRAP_SRAM16x15(//INPUTs.rst(rst),.addr(sts_num),.clk(clk77m_sys),.din(din),.we(1'b1),.dout_en(1'b1),//OUTPUTs.dout(dout_tmp));endmodule8参考文档:1.ReuseMethodolgyManual_2,byMichaelKeatingandPierreBricaud2.TheTenCommandmentsofExcellentDesigns,byPeterChambersPAGE第11页共28页_1147783132.vsd_1147788821.vsd
本文档为【Verilog编码规范】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
万里长城
一线小学教师
格式:doc
大小:257KB
软件:Word
页数:0
分类:互联网
上传时间:2019-03-25
浏览量:2