Verilog编码要求规范_第1页
Verilog编码要求规范_第2页
Verilog编码要求规范_第3页
Verilog编码要求规范_第4页
Verilog编码要求规范_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

1、实用文案Verilog编码规范(仅供内部使用)标准文档拟制:xxx日期:xxx审核:审核者日期:yyyy-mm-dd批准:批准者日期:yyyy-mm-dd版权所有侵权必究修订记录修订日期修订版本描述修订者实用文案36标准文档命名规范代码编写规范2.1 版面2.2 编写代码规范电路设计规则3.1时钟3.23.33.43.53.63.73.8复位避免LATCH避免组合反馈赋值语句目录11261.11.2.26.2728.29.29.case 语句和 if-then-else 语句状态机异步逻辑模块划分33293Q.33.提高可移植性的编码风格5.15.25.334采用参数化设计34.采用独立于工具

2、平台和工艺库的设计尽量使用已经得到验证的IP其他一些设计建议附件参考文档:36394635实用文案标准文档基本原则:简单,致,可O简单指尽量使用简单的语句,尽量使用简单的设计, 尽量使用简单的时钟, 尽量使用简单的复位。一致指尽量保持代码风格一致,尽量保持命名一致。可重用指有成熟的IP尽量使用IP,设计的代码要尽量可重用。1命名规范给信号命名就像给孩子取名字一样,有区别,有根源,有深度,还有一点,要简单,别冗长。有区别指取名字不要一样,假如大家只有一个手机号码,那这个号码还能有什么用处?有根源指取名字要能象姓氏一样,让人一看就直到是张家的后代而不是李家的。有深度就是取名字要有涵义,张一,张二,

3、张三虽然也是名字,但是请考虑一下被取名字人的感受。简单点,几十个字母长的名字,打字的和看字的都累。大小写规则:只有 Parameter ,'define 和module 名称才能享受大写。Module名应与文件名保持一致(文件名是小写),假如不想在设计后面遇到麻 烦的话。不要尝试使用任何保留字,因为他们已经被保留了。不要重复使用同样的名字去命名不同的数据。(建议)对 module 名加” _LVx ”的后缀,增强 module 名称的结构层次含义QTRxxxx_LV1CLK_ PROC_LV2 等等;如:设计顶层为 TOP LEVEL,即LEVEL1,命名为时钟模块,IO_PAD,CO

4、RE,为LEVEL2,命名为CORE内子模块为LEVEL3,然后以此类推。对于来自同一驱动源的所有时钟信号使用相同的名字。对于低电平有效的信号,应该以 _n结尾。模块间相连端口名称要一致。(建议)使用下表所列的命名缩写方式。全称名称clockClkresetrstclearclraddressaddrdata_indindata_outdoutinterrupt requestintread en ablerdenwrite en ablewrencou ntcntrequestreqcontrolctrlarbiterarbp oi nterptrsegme ntsegmemorymem全称

5、名称registerreg(建议)使用下列后缀命名方式全称添加后缀active low_nen able_enselect_selflag_flgdelay_dly? 信号命名的两个词之间用下划线间隔,如ram_addr ,cnt_ctrl等等? 信号命名尽量不要使用孤立的、小写的英文字母2代码编写规范2.1版面语句独立成行,增加可读性和可维护性。行的长度80个vi这保持每行小于或等于 72个字符。因为有的终端或打印机每行不能超过字符。规定72个字符是为了留出边空,提高可读性。还有一个原因是为象样的编辑器留有显示行号的地方。用回车来分割超过 72个字符的行,并且在下一行用缩进来表示该行是前一行

6、的继续。缩进。用缩进来提高续行和嵌套循环的可读性。缩进采用4个空格。避免使用TAB键。不同的编辑器或用户环境使得TAB的位置差别很大,造成缩进的混乱。有一些工具可以将TAB替换成空格。(建议)使用注释使用注释来解释端口、信号、信号组、always块、函数等。注释应该放在它所描述的代码的附近。注释应该简明扼要,并足够说明问题。避免注释杂乱。显 而易见的功能不用加注释。注释关键是说明设计意图。2.2编写代码规范在源文件中要有文件头在源文件、script文件的开始应包含一个文件头。文件头至少应包含下列信息:文件名、作者、模块的功能描述和关键特征的列表、文件产生的日期、更改记录(日期、更改者、更改的内

7、容)。(参见代码模板sample.v)模块名称用大写,例如:module MEM_CTRL 。,也可对同一类型的一端口声明时每行声明一个端口,并有注释(最好在同一行) 组端口加注释。 对于时钟,复位以及其他控制信号,需要注释有效工作沿或者有 效工作值建议用下述顺序声明端口。/INPUTSclocks/ po sedge activeresets/ active highen ables ,/ active highother con trol sig nals ,Data and address lines ,/OUT PUTSclocksresetsen ablesother con tro

8、l sig nals , data在输入和输出两类端口之间留一个空行来提高可读性。如上例所示。端口列表之后,使用 P arameter 定义内部信号宽度以及其他参数化设置。10信号申明和内部信号申明要单独成行,参考samp le.v 文件使用简单的语句, 一般使用ifelse和case就能满足大部分需求,不要使用复杂的语句常量(1 )一位的控制信号采用二进制表达方式,如1'b0 ;(2)常数位宽不可缺省;如:Bad :if (rst_n = 0) && (cnt_addr = 15)Good : if (rst_n = 1'bO) && (cnt

9、_addr = 5'd15)? 变量(1) Net and Register(a) 一位位宽的wire信号的声明不可缺省(b) 一个reg变量只可以在一个 always语句中赋值(C)(建议)任一 register的赋值加上单位延迟,对异步复位同样加上单位延迟;(d )向量有效位顺序的定义采用倒序格式,如:Data4:0(2) Memory代码中不建议使用 Memory(存储器阵列),Memory 只用于Testbench中,访问存储器阵列中某一向量的某一位或几位,需要通过中间变量进行。例:reg15:0mem0:255;temp = mem33;/temp gets data at

10、addr 333_bit_reg = temp 8:6;/get three bits of addr 33运算符及表达式(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 语句中,不同

11、模块不同always语句之间的代码不能实现资源共享。如:always (.)if (.) d0 = A + B;else d0 = 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+c y=d+z(2

12、)算符(a)条件运算符r1 = gate? r2 : r3;避免使用条件嵌套:r1 = (aa = 0)? (bb = 0)? r2 : r3) : r4; or r1 = 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:B与 if(A&&B)=1' b1)While(A=B)与 while(A=B)操作结果相

13、同,但显然前者不规范。(c) 乘法运算符“ *”对于一个变量 data与常数constant 相乘data * constant,如果常数不是2的整数次幕,建议先将其分解,如constant= 53 = 32 + 16 + 4 + 1 =2人5 + 2人4 + 22 + 2人0,这样乘积就可以表示为变量data移位结果的相加。对于乘法运算符“ * ”,综合后通常得到的是乘法器,时延较大。? 赋值语句(1 )不要在信号列表中进行运算操作如:Bad:addr(a,b,d &e);Good:addr(a,b,c);c=d &e;(2)BLOCK赋值和NON-BLOCK 赋值的使用(a

14、)组合逻辑采用 BLOCK赋值(=)如:always (dat)i_dat = dat;(b)非组合逻辑(主要是寄存器)采用 NON-BLOCK 赋值并加delay以保证前仿真和后仿真的一致如:always (po sedeg clk)q <= #'DEL d;(3)在同一块语句中不允许同时出现阻塞赋值和非阻塞赋值? 条件语句(1)IF语句(a)向量比较时,比较的向量长度要相等,同样向量和常量比较时长度也要求匹配,长度不同时要求进行显式位扩展( verilog对位数小的向量做0扩展以使它们的长度相匹配,该扩展是隐式的)如:reg7:0abc;reg3:0def;if (abc =

15、 4'b0,def) beginif (abc =8'h0) begin(b)不要采用if表达式的简写形式例如:if (variable) 等同于 if (variable != 0)if (Variable)等同于 if (variable = 0)但后者才合乎规范(C)每个if都应该有一个else与之相对应,如果条件为假时不进行任何操作,则用一条空语句 else ;避免产生latch(d)if.else if.else if.else的代码书写格式如下,要注意优先级if (.)beginendelsebeginif (.)else (.)ifelse (.)end(d)如果

16、变量在if-else语句中非完全赋值,则应给变量一个缺省值如:if (a = b)beginendv1 = 2'b01;v2 = 2'b10;/v3 is not assig nedelse if (a = c)beginv2 = 2'b10;v3 = 2'b11;/v1 is not assig nedendelse/default赋值beginv1=2'b00;v2 = 2'b00;v3 = 2'b00;end(2)CASE语句语句,避免产生Latch(a)所有的case语句都应该有一个default综合工具不支持(b)(建议)不要使

17、用 casex、casez语句,循环语句(1)forever 语句(2) rep eat 语句(3) while 语句(4) for语句在可以用其它语句描述电路时,建议不要采用循环语句来描述。ini tial语句不要在RTL代码中出现initial块综合会将initial块忽略,使前仿真和后仿真不一致in itialbeginend always 语句(1)在使用always生成组合逻辑时,敏感表要列全,敏感表中也不能包含没有用到的变量。Rule:Comb in ati onal sen sitivity lists should in clude1)A ny sig nal on right

18、 hand side of assig nment2)A ny sig nal in if or case exp ressi onFor exa mple:module sen se_list_ex(b,c,);P ARAMETER/INPUTSinputb;inputc;inputd;/OUT PUTS/INOUTS/SIGNAL DECLARATIONSwireb;wirec;wired;rega;/ASSIGN STATEMENTS/MAIN CODEalways (b or c or d)if (b = 1 ' b1)a = c & d;elseif (c=1'

19、; b1) a = d;en dmoduleSENSE_LIST_EX(2 )对带异步清零端的寄存器的定义模板always (po sedge clk_ma in or n egedge rst_n)if( rst_n = 1'bO )/此处统一采用rst_n = 1'bO形式而不采用(! rst_n )begi n/形式,对相关寄存器清0 (采用# 'u_dly<= 赋值)endelsebegi n/对相关寄存器赋值(采用# 'u_dly<= 赋值)end采用时钟上升沿触发。? 有限状态机(FSM )(1)组合逻辑和时序逻辑分开描述;/ P ART

20、 1: COMBINATERIAL LOGIC FOR NEXT STATEalways (cur_state or full _n ew_fr or full or have_s pace)begi n: OVC_FSM_NXT_STcase (cur_state)STDBY:begi nif (full_ new_fr = 1'b1)nxt_state = W_BLOCK;else if (full = 1'b1)nxt_state = W_DSCD;elsenxt_state = cur_state;endW BLOCK:beginif (have_s pace = 1&

21、#39;b1)nxt_state = STDBY;elsenxt_state = cur_state;endW DSCD:beginif (have_s pace = 1'b1)nxt_state = STDBY;elsenxt_state = W_BLOCK;enddefault:nxt_state = STDBY;endcaseend / OVC_FSM_NXT_;ST/ P ART 2: SEQUENTIAL LOGIC FOR CURRENT STATEalways (po sedge clk or 'RST_EDGE reset)begi n: OVC_FSM_ST_

22、TRANSif(reset = 'RST_VALUE)cur_state <= 'DLY W_BLOCK;elsecur_state <= 'DLY n xt_state;end / OVC_FSM_ST_TRANS3电路设计规则3.1时钟(建议)简单的时钟结构易于理解、分析和维护,而且容易产生好的综合结果。最好是能够有单一的全局时钟,所有寄存器都在上升沿触发。所有子模块内部使用单一时钟单一时钟沿,如条件不满足时,必须注明原因,并 提出对综合以及布线的要求。设计中包含内部产生的时钟时,必须将所有需要的时钟在一个单独的模块中生成。如果不得不用混合的时钟沿,在综

23、合和时序分析时确保能满足时钟精度最差情况下的占空比。同时确保把假定的占空比写入用户手册。在多数设计中,占空比是时钟树的函数,而时钟树的插入通常又依赖于具体的工艺。使用Core的芯片设计者必须检查实际的占空比能够满足Core的要求,也应该了解怎样改变综合和时序分析的策略以使得Core能够满足实际的条件。(建议)多数基于扫描链的测试方法要求对上升沿和下降沿触发的寄存器分开处理。如果必须使用大量的上升沿和下降沿触发的寄存器,将上升沿和下降沿触发 的寄存器分到不同的模块中是很有用的。这样容易确定下降沿触发的寄存器,并 可将它们放到不同的扫描链中。(建议)避免在RTL级手工实例化时钟 Buffer 。时

24、钟Buffer通常是在综合以后在物理设计时插入的。在可综合的RTL代码中,时钟网络通常被认为是理想的网络,没有延时。在布局布线时,时钟树插入工具 插入适当的结构,尽可能的接近理想的、平衡的时钟配布网络。Buffer,用于指明一个例外情况是在顶层模块中可以插入厂家提供的伪时钟时钟树的源头和时钟树的参数。(建议)避免在 RTL级使用门控时钟或内部产生的时钟信号。门控时钟电路依赖于具体的工艺和时序。门控时钟不正确的时序可能导致假的violati on )。时钟信号和误操作。不同局部时钟SKEW还会导致保持时间冲突(门控时钟还会降低电路的可测性,也使得综合的约束变得困难。多数低功耗的电路需要门控时钟,

25、但它们不应该出现在RTL级的编码中,象P ower Comp iler这类工具可以自动去做。应该让产生这些如果设计中必须使用门控时钟、内部产生的时钟或复位信号,信号的电路位于设计顶层的一个独立的模块中。它将违反编码规范的地方限制在 一个小的范围内,有利于对这些产生电路开发特殊的测试策略。对于其他模块将 可采用标准的时序分析和扫描链插入技术。3.2复位(建议)确保所有寄存器只被简单的复位信号所控制。最好的情况是,复位信号是1bit寄存器的输出。因为组合逻辑的输出会带有毛刺,对于异步复位电路,则会引起触发器的异常。(建议)尽可能避免内部产生的条件复位信号。通常模块内所有寄存器应在同一时间内被复位。

26、这种方式使得分析和设计更加简单和容易。(建议)如果需要条件复位,设置一个单独的复位信号,并且将产生逻辑隔离于一个单独的模块。这种方式可使代码更易读,并易于综合出好的结果。如果需要内部产生异步复位信号,必须保证所产生的异步复位信号没有毛刺,最好的办法是保证异步复位信号最后为1bit触发器的输出,例如当计数器达到一个预设值时,产生异步复位信号:bad :wire reset; assign reset = (count=value);better:reg reset;always (po sedge elk)reset <= (co un t=value);3.3 避免 LATCH描述组合逻

27、辑的 always块中,如果if语句缺乏else子句、case语句中各个条件所处理的变量不同都会在综合时推断出LATCH。使用下述方法可避免LATCH:对所有的输入条件都给出输出。保证always块敏感列表完备。敏感列表应包括:if(),ease()中的条件信号;所有 always块中位于赋值语句右边的信号;当信号为多bit向量时,应包括向量的所有bit而不是部分。在最终优先级的分支上使用else子句,而不用elsif 。所有的Case 应该有一个 default case 。避免使用LATCH,除非能清楚地分析相关电路的时序以及毛刺带来的影响3.4避免组合反馈在设计中避免组合反馈电路。这种电

28、路违背了同步设计原则,难以控制其行为,对仿真、调试和DFT都极其不利。3.5赋值语句在写可综合的代码时,在时序逻辑的always语句块中总是使用非阻塞赋值。否则RTL级的仿真会和门级仿真的结果不一致。在组合逻辑的always语句块中使用阻塞赋值。同一个触发器不能在多个always块中被赋值。3.6case语句禾n if-else 语句(建议)如果不需要有优先级的编码结构,建议使用case语句而不要使用if-else语句。对于基于cycle的仿真器,case语句的仿真速度要比if语句的仿真速度快。对于大的多选器,case语句也比条件赋值语句的仿真速度快。对于综合工具,case语句也往往能产生出时

29、序和面积更优化的电路。(建议)对于条件分支为独热编码的case语句,建议采用下列语句, 对于综合工具能产生较优化的电路case(1 ' b1)con diti on1 : stateme nt ;con diti on2 : stateme nt ;default : stateme nt;endcase3.7状态机将状态机的描述分成两个always 块,一个用来描述组合逻辑,一个用来描述时序逻辑。(建议)用参数语句来定义状态向量。(建议)将状态机的逻辑和非状态机的逻辑分成不同的模块,以便于综合工具对状态机进行单独优化。必须使用default 条件为状态机指定一个默认的状态 ,防止状态

30、机进入死锁状态。FSM提供防死锁机制,以防止限死在某个状态,特别是在异常情况下。在FSM逻辑比较复杂的时候,建议使用独热编码方式,以提高时序。/ P ART 1: COMBINATERIAL LOGIC FOR NEXT STATEalways (cur_state or full_ new_fr or full or have_s pace)begi n: OVC_FSM_NXT_STcase (cur_state)STDBY:begi nif (full_ new_fr = 1'b1)nxt_state = W_BLOCK;else if (full = 1'b1)nxt_

31、state = W_DSCD;elsenxt_state = cur_state;endW BLOCK:begi nif (have_s pace = 1'b1)nxt_state = STDBY;elsenxt_state = cur_state;endW DSCD:begi nif (have_s pace = 1'b1)nxt_state = STDBY;elsenxt_state = W_BLOCK;enddefault:nxt_state = STDBY;endcaseend / OVC_FSM_NXT_;ST/ P ART 2: SEQUENTIAL LOGIC F

32、OR CURRENT STATEalways (po sedge elk or 'RST_EDGE reset)begi n: OVC_FSM_ST_TRANSif(reset = 'RST_VALUE)cur_state <= 'DLY W_BLOCK;elsecur_state <= 'DLY n xt_state;end / OVC_FSM_ST_TRANS? 状态机输出异步控制信号时,必须采用下列结构3.8异步逻辑(建议)避免使用异步逻辑。异步逻辑难于设计和验证,并会降低设计的可移植性。(建议)如果在设计中使用异步逻辑,将异步逻辑和同步逻辑分

33、成不同的模块。这使得代码检查更加容易(异步逻辑通常需要仔细的检查和功能及时序上的验 证)。异步信号必须使用两级触发器同步之后使用。如下图所示clk14模块划分(建议)对设计层次中的每一个模块,锁存模块的所有输出信号。这样做可以简化处理过程, 它使得输出的驱动强度和输入延时都可预期。输出驱动强度是触发器的平均驱动强度。(建议)保持相关的组合逻辑在同一个模块中。这有利于综合工具对逻辑的优化,也有利于时序预算和快速仿真。(建议)对不同设计目标的电路分成不同的模块以便综合工具对将含有关键路径的逻辑和非关键路径的逻辑分成不同的模块,关键路径采用速度优化,对非关键路径采用面积优化。(建议)确保只有在顶层模

34、块中才包括I/O PAD。顶层模块中还包括一个中层模块,该模块中包含 JTAG模块、时钟产生电路、CORE逻辑。这个要求不是强制性的,但这样做易于集成测试逻辑、PAD和功能逻辑。(建议)避免在顶层模块中出现Glue logic 。5提高可移植性的编码风格5.1采用参数化设计(建议)不要直接使用数字在设计中不要直接使用数字(Hard-Coded Numeric Value )。 作为例外,可以使用0和1 (但不要组合使用,如1001 )。例如:差的编码风格:wire 7:0my_in _bus;reg7:0my_out_bus;好的编码风格:'Define MY BUSSIZE 8wir

35、e MY_BUS_SIZE-1:0my_in _bus;regMY_BUS_SIZE-1:0my_out_bus;另一种较好的编码风格,有利于IP封装:P arameter BUS_SIZE = 8 ;wire BUS_SIZE-1:0my_in _bus ;regBUS_SIZE-1:0my_out_bus(建议)将一个设计的所有的'defi ne 语句集中到一个单独的文件。5.2采用独立于工具平台和工艺库的设计(建议)避免嵌入式的 EDA工具的命令。不要在源代码中使用嵌入式的EDA工具命令。因为其他的EDA工具并不一定认得这些隐含的命令,导致差的或错误的结果,降低代码的可移植性。即

36、使是使用Design Compiler,当综合策略改变是,嵌在源代码中的综合命令也不如单独 的script文件中的综合命令容易修改。aI ”reset例如:1:/synop sys asyn c_set_reset2:always (po sedge clk or po sedge reset)诸如第一行之类的工具命令最好不要使用。这个规则有一个例外就是编译开关的打开和关闭可以嵌入到代码中。例如:/synop sys tran slate_off/synop sys tran slate_ on(建议)使用独立于工艺的库。(建议)在设计中避免实例化(in sta ntiate )门,门级设计难

37、于理解、维护和重用。如果使用的特定工艺的门,设计将变得不可移植。如果必须使用特定工艺的 门,建议将它们放于单独得模块,这样在移植时易于更改。5.3尽量使用已经得到验证的IP(1 )对于通用的接口和常用的模块,尽量使用已经得到验证的IP(2)尽量对自己设计的模块采用参数化设计,在得到充分验证之后,能被其他项目当作IP使用,提高其他设计的可靠性,缩短设计周期。bad:module add (a,b,c);inp ut 7:0 a,b;out put 7:0 c ;better: module add (a,b,c);parameter WIDTH = 8 ;inp ut WIDTH-1:0 a,b

38、 ;out put WIDTH-1:0 c;6其他一些设计建议整个项目组都使用一致的信号命名规则。尽量避免使用复杂的运算符,如*, /, %。特别是/, %,大部分综合器的支持是非常有限的(只支持常量)。提供方便调试的功能:比如增加可读的标志寄存器、统计计数、FIFO的状态寄存器等等。在地址空间允许的范围内,尽量使内部关键触发器能够通过CPU接口被CPU访问和控制,如计数器,移位寄存器,状态机寄存器等等Bad:reg7:0 ent ;Always (po sedge elk or p osedge rst)If (rst=1' b1)ent <= 0 ;Else if (cnt_

39、en=1' b1)ent <= ent +_1 ;better: reg7:0 ent;always (po sedge elk or p osedge rst)if (rst=1' b1)ent <= 0 ;else if (cnt_en | test_e nt_en)ent <= ent + 1 ;尽量避免使用异步 FIFO ,采用将速度较慢侧的读或者写使能信号同步到速度较快侧,然后使用同步 FIFO实现。对于FPGA设计,适当限制组合逻辑的输入信号数目(4个以下最好)。在一个logie bloek 中fan-in 数目是固定的;组合逻辑如果需要跨越Log

40、ie bloek ,则延迟会大大增加。这对提高Timi ng 很有用。对于FPGA设计,一般情况先使用块RAM,在块RAM 资源不够的情况下才使用分散RAM ,而且分散RAM的接口时序最好与块 RAM的时序一致,便于随时调整RAM的使用状况。逻辑级数过多的功能块,使用寄存器隔离,提高设计的综合时的时钟频率。不要使用位宽过大的计数器,建议将位宽超过8的计数器打散成多个不超过8bit宽度的计数器。计数器要求可被 CPU直接访问,并且每个打散后的小计数器都有CPU可控的计数使能信号。Bad:reg31:0 ent ;Always (po sedge elk or p osedge rst)If (r

41、st=1' b1)ent <= 0 ;Else if (cnt_en=1' b1)better:ent <= ent +_1 ;reg7:0 cnt0,cnt1,cnt2,cnt3;wire cn t0_e n,cn t1_e n,cn t2_e n,cn t3_e n ;assig n cn t0_e n = cnt_en | test_c nt_en ;assig n cn t1_e n = (&cnt0 & cnt_en) | test_c nt_en;always (po sedge elk or p osedge rst)if (rst=1

42、' b1)cntO <= 0 ;else if (cnt0_en=1' b1)cntO <= cnt0 + 1 ;尽可能地使用 FPGA工具能提供的 Cores。例如ALTERA/Xilinx的FPGA内嵌LUT的DSP可以用于实现比较复杂的数学计算公式、算法,而且不占用原有的 资源。养成良好的习惯:每个模块代码完成之后单独综合,或者几个子模块合成一个功能相对完整的模块时综合一次,把相应的warnning或者latch去掉,不能去除 的warning 需要全部加以说明,并以文档方式记录。7附件1. Verilog 编码文档模板:samp le.v*/ CompanyUTStarcom/Cop yright(c) 2003, UTStarcom Telecom Co., Ltd.All rights reserved/ P roject Name :/ File namexxx.v/ Desig neryour n ame

温馨提示

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

评论

0/150

提交评论