Verilog+HDL代码书写规范

Verilog+HDL代码书写规范
Verilog+HDL代码书写规范

1.目的

本规范的目的是提高书写代码的可读性、可修改性、可重用性,优化代码综合和仿真的结果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范化可编程技术部的FPGA设计输入,从而做到:①逻辑功能正确,②可快速仿真,③综合结果最优(如果是hardware model),④可读性较好。

2.范围

本规范涉及Verilog HDL编码风格,编码中应注意的问题,Testbench的编码等。

本规范适用于Verilog model的任何一级(RTL,behavioral, gate_level),也适用于出于仿真、综合或二者结合的目的而设计的模块。

3.定义

Verilog HDL : Verilog 硬件描述语言

FSM :有限状态机

伪路径:静态时序分析(STA)认为是时序失败,而设计者认为是正确的路径。

4.规范内容

4.1.Verilog 编码风格

本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级(RTL,behavioral, gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。

4.1.1. 命名的习惯

选择有意义的信号和变量名,对设计是十分重要的。命名包含信号或变量诸如出处、有效状态等基本含义,下面给出一些命名的规则。

y用有意义而有效的名字

有效的命名有时并不是要求将功能描述出来,如

For ( I = 0; I < 1024; I = I + 1 )

Mem[I] <= 32’b0;

For 语句中的循环指针I 就没必要用loop_index作为指针名。

y用连贯的缩写

长的名字对书写和记忆会带来不便,甚至带来错误。采用缩写时应注意同一信号在模块中的一致性。缩写的例子如下:

Addr address

Pntr pointer

Clk clock

reset

y 用最右边的字符下划线表示低电平有效,高电平有效的信号不得以下划线表示,短暂的引擎信号建议采用高有效。 如: Rst_ ,Trdy_, Irdy_, Idsel.

y 大小写原则

名字一般首字符大写,其余小写(但parameter, integer 定义的数值名可全部用大写),两个词之间要用下划线连接。

如: Packet_addr, Data_in, Mem_wr Mem_ce_y 全局信号名字中应包含信号来源的一些信息。

如:D_addr[7:2] ,这里的“D ”指明了地址是解码模块(Decoder module)中的地址。

y 同一信号在不同层次应保持一致性。

y 自己定义的常数、类型等用大写标识

如:parameter CYCLE=100;

y 避免使用保留字

如:in ,out ,x ,z 等不能够做为变量、端口或模块名

y 添加有意义的后缀,使信号名更加明确,常用的后缀如下:

寄存后的信号

_reg 芯片的双向信号-xbio

芯片的三态输出_xz

芯片的漏极开路输出_xod

芯片原始输出信号_xo

芯片原始输入信号_xi

下降沿有效的寄存器_f

连到三态输出的信号_z

寄存前的信号_next

时钟信号_Clk

意义后缀

y 一个module 一个文件,且文件名能与module 名对应起来

4.1.2. Modules

y 顶层模块应只是内部模块间的互连。

Verilog 设计一般都是层次型的设计,也就是在设计中会出现一个或多个模块,模块间的调用在所难免。可把设计比喻成树,被调用的模块就是树叶,没被调用的模块就是树根,那么在这个树根模块中,除了内部的互连和模块的调用外,尽量避免再做逻辑,如不能再出现对reg 变量赋值等。这样做的目的是为了更有效的综合,因为在顶层模块中出现中间逻辑,Synopsys 的design compiler 就不能把子模块中的逻辑综合到最优。

y 每一个模块应在开始处注明文件名、功能描述、引用模块、设计者、设计时间及版权信息等。代码中的所有说明、注释必须均为英文。需要特别说明的是,必须对Revision History 要格外重视,必须将每次版本修改的信息按照时间一一详加叙述,以保持版本的可读性与继承性。

如: /* ======================== *\

Filename ﹕ RX_MUX.v

Author ﹕

Description ﹕

Called by ﹕Top module

Revision History ﹕99-08-01

Revision 1.0

Email ﹕ M@https://www.360docs.net/doc/3118170587.html,

Company ﹕ Huawei Technology .Inc

Copyright(c) 1999, Huawei Technology Inc, All right reserved

\* ========================= */

y不要对Input进行驱动, 在module 内不要存在没有驱动的信号,更不能在模块端口中出现没有驱动的输出信号,避免在elaborate和compile时产生warning,干扰错误定位。

y每行应限制在80个字符以内,以保持代码的清晰、美观和层次感。

一条语句占用一行,如果较长(超出80个字符)则要换行。

y电路中调用的 module名用Uxx标示, Cell名用Vxx标识。向量大小表示要清晰,采用基于名字(name_based)的调用而非基于顺序的(order_based)。另外,调用模块时调用关系要写全,否则,在用synplify综合过程会出warning。

Instance UInstance2(

.DataOut(DOUT),

.DataIn(DIN),

.Cs_(Cs_)

);

y用一个时钟的上沿或下沿采样信号,不能一会儿用上沿,一会儿用下沿。如果既要用上沿又要用下沿,则应分成两个模块设计。建议在顶层模块中对Clock做一非门,在层次模块中如果要用时钟下沿就可以用非门产生的Posedge Clk_,这样的好处是在整个设计中采用同一种时钟沿触发,有利于综合。

y在模块中增加明了的英文注释。

对信号、参量、引脚、模块、函数及进程等加以说明,便于阅读与维护。

y Module 名要用大写标示,且应与文件名保持一致。

如:Module DFF_ASYNC_RST(

Reset,

Clk,

Data,

Qout

);

y严格芯片级模块的划分

只有顶层包括IO引脚(pads),中间层是时钟产生模块、JTAG、芯片的内核(CORE),这样便于对每个模块加以约束仿真,对时钟也可以仔细仿真。

y模块输出寄存器化

对所有模块的输出加以寄存(如图1),使得输出的驱动强度和输入的延迟可以预测,从而使得模块的综合过程更简单。

- 输出驱动的强度都等于平均的触发器驱动强度

- 输入延迟始终等于通过触发器的路径,近于相等

(图 1)

y将关键路径逻辑和非关键路径逻辑放在不同模块

保证DC可以对关键路径模块实现速度优化,而对非关键路径模块实施面积优化。在同一模块DC无法实现不同的综合策略。

y将相关的组合逻辑放在同一模块

有助于DC对其进行优化,因为DC通常不能越过模块的边界来优化逻辑

y ultraedit中的tab键设置为4个空格键

y输入输出的端口定义分行写,一行定义一个输入输出,顶格对齐

y module头中的括号内的输入输出的定义按输入输出分开,与括号对齐

y module用到的变量统一在输入输出的定义之后,按wire和reg型分开定义,并对重要的信号加注释说明

y module主体以//module begin作为起始标识

y子模块的调用顶格对齐;子模块中的输入输出的端口信号的名字尽量与调用的名字一致

y if...else一一对应,若无else时,加一个空语句

4.1.3. Net and Register

y一个reg变量只能在一个always语句中赋值。

y向量有效位顺序的定义一般是从大数到小数。

尽管定义有效位的顺序很自由,但如果采用毫无规则的定义势必会给作者和读代码的人带来困惑,如Data[-4:0],则LSB[0][-1][-2][-3][-4]MSB,或Data[0:4],则LSB[4][3][2][1][0]MSB,这两种情况的定义都不太好,推荐Data[4:0]这种格式的定义。

y对net和register类型的输出要做声明。

如果一个信号名没做声明,Verilog将假定它为一位宽的wire变量。

y无用信号不要引入module内部,避免在elaborate和compile时产生warningr类型的输出要做声明。

如果一个信号名没做声明,Verilog将假定它为一位宽的wire变量。

4.1.4. Expressions

y用括号来表示执行的优先级

尽管操作符本身有优先顺序,但用括号来表示优先级对读者更清晰,更有意义。

If ((alpha < beta) && (gamma >= delta))....比下面的表达更合意

If (alpha < beta && gamma >= delta)...

y用一个函数(function)来代替表达式的多次重复

如果代码中发现多次使用一个特殊的表达式,那么就用一个函数来代替,这样在以后的版本升级时更便利,这种概念在做行为级的代码设计时同样使用,经常使用的一组描述可以写到一个任务(task)中。

4.1.

5. IF 语句

y向量比较时,比较的向量要相等。

当比较向量时,verilog将对位数小的向量做 0 扩展以使它们的长度相匹配,它的自动扩展为隐式的。建议采用显示扩展,这个规律同样适用于向量同常量的比较。

Reg Abc [7:0];

Reg Bca [3:0];

......

If (Abc = = {4’b0, Bca})begin

.......

If (Abc = = 8’b0) begin

y每一个If 都应有一个else 和它相对应

在做硬件设计时,常要求条件为真时执行一种动作而条件为假时执行另一动作,即使认为条件为假不可能发生。没有else可能会使综合出的逻辑和RTL级的逻辑不同。如果条件为假时不进行任何操作,则用一条空语句。

always @(Cond)

begin

if (Cond)

DataOut <= DataIn;

Else:;

end

以上语句DataOut会综合成锁存器.

y应注意If ..else if ...else if ...else 的优先级

4.1.6 case 语句

y case语句通常综合成一级多路复用器(图的右边部分),而if-then-else则综合成优先编码的串接的多个多路复用器,如图的左边部分。通常,使用case 语句要比if语句快,优先编码器的结构仅在信号的到达有先后时使用。条件赋值语句也能综合成多路复用器,而case 语句仿真要比条件赋值语句快。

y所有的Case 应该有一个default case ,允许空语句

Default : ;

4.1.7 Writing functions

y在function的最后给function赋值

y函数中避免使用全局变量

否则容易引起HDL行为级仿真和门级仿真的差异。如:

function ByteCompare;

input [15:0] Vector1;

input [15:0] Vector2;

input [7:0] Length;

begin

if (ByteSel)

// compare the upper byte

else

// compare the lower byte

。。。

end

endfunction // ByteCompare

中使用了全局变量ByteSel,可能无意在别处修改了,导致错误结果。最好直接在端口加以定义。

4.1.8 Assignment

y Verilog 支持两种赋值:过程赋值(procedural) 和连续赋值(continuous)。过程赋值用于过程代码(initial, always, task or function)中给reg 和 integer变量赋值,而连续赋值一般给wire 变量赋值。

y Always @(敏感表),敏感表要完整,如果不完整,将会引起仿真和综合结果不一致always @(d or Clr)

begin

if (Clr)

q = 1'b0;

else if (e)

q = d;

end

以上语句在行为级仿真时e的变化将不会使仿真器进入该进程,导致仿真结果错误

y Assign/deassign 仅用于仿真加速

y Force/release 仅用于debug

y避免使用Disable

y对任何reg赋值用非阻塞赋值代替阻塞赋值

4.1.9 Combinatorial Vs Sequential Logic

y如果一个事件持续几个时钟周期,设计时就用时序逻辑代替组合逻辑

如:Wire Ct_24_e4; //it ccarries info. Last over several clock cycles

Assign Ct_24_e4 = (count8bit[7:0] >= 8’h24) & (count8bit[7:0] <= 8’he4);

那么这种设计将综合出两个8 比特的加法器,而且会产生毛刺,对于这样的电路,要采用时序设计,代码如下:

Reg Ct_24_e4;

Always @(poseddge Clk or negedge Rst_)

Begin

If (!Rst_)

Ct_24_e4 <= 1’b0;

Else if (count8bit[7:0] = = 8’he4)

Ct_24_e4 <= 1’b0;

Else if (count8bit[7:0] = = 8’h23)

Ct_24_e4 <= 1’b1;

Esle ;

End

y在simulation pattern 或 report file中,尽量不用内部信号,如果要用就把它们引到端口,这样做并不增加芯片面积。

y内部总线不要悬空。在default状态,要把它上拉或下拉。

Wire OE_default;

Assign OE_default = !(oe1 | oe2 | oe3);

Assign bus[31:0] = oe1 ? Data1[31:0] :

oe2 ? Data2[31:0] :

oe3 ? Data3[31:0] :

oe_default ? 32’h0000_0000 :

32’hzzzz_zzzz;

4.1.10 Macros

y为了保持代码的可读性,常用 “`define”做常数声明

y把“`define”放在一个独立的文件中

参数(parameter)必须在一个模块中定义,不要传替参数到模块,“`define”可以在任何地方定义,要把所有的“`define”定义在一个文件中,在编译原代码时首先要把这个文件读入。如果希望宏的作用域仅在一个模块中,就用参数来代替。

4.1.11 Comments

y对更新的内容更新要做注释

y在语法块的结尾做标记

//style 1

If (~OE_ && (state != PENDING))

begin

....

End // if enable = = ture and ready

//style 2 --- identical lables on begin and end

If (~OE_ && (state != PENDING))

begin //drive data

....

End //drive data

// Comment end with the name of the

Function Calcparity;//Data, ParityErr

....

Endfunction // Calcparity

y每一个模块都应在模块开始处做模块级的注释(参考前面标准模块头)

y在模块端口列表中出现的端口信号,都应做简要的功能描述

4.1.12 FSM

y VerilogHDL状态机的状态分配

VerilogHDL描述状态机时必须由parameter分配好状态,这与VHDL不同,VHDL状态机状态可以在综合时分配产生。

y组合逻辑和时序逻辑分开用不同的进程

组合逻辑包括状态译码和输出,时序逻辑则是状态寄存器的切换

y必须包括对所有状态都处理,不能出现无法处理的状态,使状态机失控y Mealy机的状态和输入有关,而Moore机的状态转换和输入无关。

Mealy 状态机的例子如下:

...

reg CurrentState, NextState, Out1;

Parameter S0=0,S1=1;

always @(posedge Clk or negedge Rst_)

// state vector flip-flops (sequential)

begin

if (!Reset)

CurrentState = S0;

else

CurrentState <= NextState;

end

always @(In1 or In2 or CurrentState)

// output and state vector decode (combinational) begin

case (CurrentState)

S0:

begin

NextState <= S1;

Out1 <= 1'b0;

end

S1:

begin

if (In1)

begin

NextState <= S0;

Out1 <= In2;

end

Else

begin

NextState <= S1;

Out1 <= !In2;

end

Endcase

end

endmodule

4.2 代码编写中容易出现的问题

y在for-loop中包括不变的表达式,浪费运算时间

for (i=0;i<4;i=i+1)

begin

Sig1 = Sig2;

DataOut[i] = DataIn[i];

end

for-loop中第一条语句始终不变,浪费运算时间.

y资源共享问题

条件算子中不存在资源共享,如

z = (cond) ? (a + b) : (c + d);

必须使用两个加法器;

而等效的条件if-then-else语句则可以资源共享,如 if (Cond)

z = a + b;

else

z = c + d;

只要加法器的输入端复用,就可以实现加法器的共享,使用一个加法器实现y由于组合逻辑的位置不同而引起过多的触发器综合,如下面两个例子 module COUNT (AndBits, Clk, Rst);

Output Andbits;

Input Clk,

Rst;

Reg AndBits;

//internal reg

Reg [2:0] Count;

always @(posedge Clk)

begin

begin

if (Rst)

Count <= 0;

else

Count <= Count + 1;

End //end if

AndBits <= & Count;

End //end always

endmodule

在进程里的变量都综合成触发器了,有4个; module COUNT (AndBits, Clk, Rst);

Output AndBits;

Input Clk,

Rst;

Reg AndBits;

//internal reg

Reg [2:0] Count;

always @(posedge Clk)

begin //synchronous

if (Rst)

Count <= 0;

else

Count <= Count + 1;

End //end always

always @(Count)

begin //asynchronous

AndBits = & Count;

End //end always

Endmodule //end COUNT

组合逻辑单开,只有3个触发器.

y谨慎使用异步逻辑

module COUNT (Z, Enable, Clk, Rst); Output [2:0] Z;

Input Rst,

Enable,

Clk;

reg [2:0] Z;

always @(posedge Clk)

begin

if (Rst)

begin

Z <= 1'b0;

end

else if (Enable == 1'b1)

begin

If (Z == 3'd7)

begin

Z <= 1'b0;

End

Else

begin

Z <= Z + 1'b1;

end

End

Else ;

End //end always

Endmodule //end COUNT

是同步逻辑,而下例则使用了组合逻辑作时钟,以及异步复位.实际的运用中要加以避免. module COUNT (Z, Enable, Clk, Rst);

Output [2:0] Z;

Input Rst,

Enable,

Clk;

Reg [2:0] Z;

//internal wire

wire GATED_Clk = Clk & Enable;

always @(posedge GATED_Clk or posedge Rst) begin

begin

if (Rst)

begin

Z <= 1'b0;

end

Else

begin

if (Z == 3'd7)

begin

Z <= 1'b0;

end

Else

begin

Z <= Z + 1'b1;

end

End //end if

End //end always

Endmodule //end module

y对组合逻辑的描述有多种方式,其综合结果是等效的

c = a &b;

等效于

c[3:0] = a[3:0] & b[3:0];

等效于

c[3] = a[3] & b[3];

c[2] = a[2] & b[2];

c[1] = a[1] & b[1];

c[0] = a[0] & b[0];

等效于

for ( i=0; i<=3; i = i + 1)

c[i] = a[i] & b[i];

可以选择简洁的写法.

y考虑综合的执行时间

通常会推荐将模块划分得越小越好,事实上要从实际的设计目标、面积和时序要求出发。好的时序规划和合适的约束条件要比电路的大小对综合时间的影响要大。要依照设计的目标来划分模块,对该模块综合约束的scripts也可以集中在该特性上。要选择合适的约束条件,过分的约束将导致漫长的综合时间。最好在设计阶段就做好时序规划,通过综合的约束scripts来满足时序规划。这样就能获得既满足性能的结果,又使得综合时间最省。

y避免点到点的例外

所谓点到点例外(Point-to-point exception),就是从一个寄存器的输出到另一个寄存器的输入的路径不能在一个周期内完成。多周期路径就是其典型情况。多周期路径比较麻烦,在静态时序分析中要标注为例外,这样可能会因为人为因素将其他路径错误地标注为例外,从而对该路径没有分析,造成隐患。避免使用多周期路径,如果确实要用,应将它放在单独一个模块,并且在代码中加以注释。

y避免伪路径(False path)

伪路径是那些静态时序分析(STA)认为是时序失败,而设计者认为是正确的路径。通常会人为忽略这些warning,但如果数量较多时,就可能将其他真正的问题错过了。

y避免使用Latch

使用Latch必须有所记录,可以用All_registers -level_sensitive来报告设计中用到的Latch。不希望使用Latch时,应该对所有输入情况都对输出赋值,或者将条件赋值语句写全,如在if语句最后加一个else,case语句加defaults。

当你必须使用Latch时,为了提高可测性,需要加入测试逻辑。

不完整的if和case语句导致不必要的latch的产生,下面的语句中,DataOut会被综合成锁存器。如果不希望在电路中使用锁存器,它就是错误。

always @(Cond)

begin

if (Cond)

DataOut <= DataIn;

end

y避免使用门控时钟

使用门控时钟(Gated clock)不利于移植,可能引起毛刺,带来时序问题,同时对扫描链的形成带来问题。门控钟在低功耗设计中要用到,但通常不要在模块级代码中使用。可以借助于Power compiler来生成,或者在顶层产生。

y避免使用内部产生的时钟

在设计中最好使用同步设计。如果要使用内部时钟,可以考虑使用多个时钟。因为使用内部时钟的电路要加到扫描链中比较麻烦,降低了可测性,也不利于使用约束条件来综合。

y避免使用内部复位信号

模块中所有的寄存器最好同时复位。如果要使用内部复位,最好将其相关逻辑放在单独的模块中,这样可以提高可阅读性。

y如果确实要使用内部时钟,门控时钟,或内部的复位信号,将它们放在顶层

将这些信号的产生放在顶层的一个独立模块,这样所有的子模块分别使用单一的时钟和复位信号。一般情况下内部门控时钟可以用同步置数替代。例如:

module COUNT (Reset, Enable, Clk, Qout);

input Reset, Enable, Clk;

output [2:0] Qout;

reg [2:0] Qout;

wire GATED_Clk = Clk & Enable;

always @(posedge GATED_Clk or posedge Reset)

begin

if (Reset)

begin

Qout = 1'b0;

end

Else

begin

if (Qout == 3'd7)

begin

Qout= 1'b0;

end

Else

begin Qout = Qout + 1'b1;

end end end endmodule

module COUNT (Reset, Enable, Clk, Qout);input Reset, Enable, Clk;

output [2:0] Qout;

reg [2:0] Qout;

always @(posedge Clk) begin

if (Reset)

begin

Qout = 1'b0;

end

else if (Enable == 1'b1)

begin

if (Qout == 3'd7)

begin

Qout = 1'b0;

end

Else

begin

Qout = Qout + 1'b1;

end

end

end

endmodule

程序代码注释编写规范

程序代码注释编写规范 为提高控制程序的阅读性与可理解性,现制定相关代码程序代码注释编写的编写规范。 一般情况下,源程序有效注释量必须在20%以上,注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。 常规注释有以下两种方式。 单行:以"//"符号开始,任何位于该符号之后的本行文字都视为注释。 多行:以"/*"符号开始,以"*/"结束。任何介于这对符号之间的文字都视为注释。 一、说明性文件 说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。 示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************* COPYRIGHT (C), MicTiVo International. Co., Ltd. File NAME: // 文件 Author: Version: Date: // 作者、版本及完成日期 DESCRIPTION: // 用于详细说明此程序文件完成的主要功能,与其他模块 // 或函数的接口,输出值、取值范围、含义及参数间的控 // 制、顺序、独立或依赖等关系 Others: // 其它内容的说明 Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明 1.... History: // 修改历史记录列表,每条修改记录应包括修改日期、修改 // 者及修改内容简述 1. Date: Author: Modification: 2. .. *************************************************/ 二、源文件头 源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。 示例:下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************************ COPYRIGHT (C), MicTiVo International. Co., Ltd. FileName: Author:

软件代码编写规范

? 软件销售代理合同范本软件代码编写规范 草稿 2005.2

? 软件销售代理合同范本 1 命名规则 https://www.360docs.net/doc/3118170587.html,命名规则 一致的命名模式是托管类库中可预知性与可发现性最重要的元素之一。对这些命名指南广泛的使用和理解将消除许多最常见的用户问题。本主题提供.NET Framework 类型的命名指南。对于每个类型,还应该注意关于大写样式、区分大小写和措词的一些通用规则。 1.1.1大写样式 描述用于在类库中命名标识符的Pascal 大小写、Camel 大小写和全部大写样式。 使用下面的三种大写标识符约定。 Pascal 大小写 将标识符的首字母和后面连接的每个单词的首字母都大写。可以对三字符或更多字符的标识符使用Pascal 大小写。例如: B ack C olor Camel 大小写 标识符的首字母小写,而每个后面连接的单词的首字母都大写。例如: b ack C olor 大写 标识符中的所有字母都大写。仅对于由两个或者更少字母组成的标识符使用该约定。例如: System.IO System.Web.UI 可能还必须大写标识符以维持与现有非托管符号方案的兼容性,在该方案中所有大写字母经常用于枚举和常数值。一般情况下,在使用它们的程序集之外这些字符应当是不可见的。 下表汇总了大写规则,并提供了不同类型的标识符的示例。 标识符大小写示例 类Pascal AppDomain 枚举类型Pascal ErrorLevel 枚举值Pascal FatalError 事件Pascal ValueChange 异常类Pascal WebException 注意总是以Exception后缀结尾。 只读的静态字段Pascal RedValue 接口Pascal IDisposable 注意总是以I 前缀开始。 方法Pascal ToString 命名空间Pascal System.Drawing 参数Camel typeName 属性Pascal BackColor

PHP代码编写规范

QC 质量管理体系文件 代码编写规范 受控状态:■受控□非受控 发布日期:2006年02月20日 实施日期:2006年02月24日

1. 引言 1.1. 目的 制定本规范是为了能达到以下目的: ●提高程序员工作效率和代码的利用性 ●程序员可以了解任何代码,弄清程序的状况 ●新人可以很快的适应环境 ●防止新接触php的人出于节省时间的需要,自创一套风格并养成终生的习惯 ●防止新接触php的人一次次的犯同样的错误 ●在一致的环境下,人们可以减少犯错的机会 1.2. 适用范围 适用于本公司的所有开发人员,包括数据库、网页及应用程序开发人员,及有关的程序测试人员。 1.3. 引用标准 GB/T 8566-1995 信息技术软件生存期过程 GB/T 8567-1988 计算机软件产品开发文件编写指南 1.4. 术语 GB/T 11457-1995中所使用的术语适用于本规范。

2. 代码编写规则 2.1. 注释 (1)编写代码期间注释要求占程序总量15%以上。 (2)每个模块顶部必须说明模块名称、功能描述、作者等。 (3)每个过程、函数、方法等开头部分必须说明功能、参数、返回值、原数据和目标数据数据结构等等。 (4)变量定义的行末应当对变量给出注释。 (5)程序在实现关键算法的地方应当给出注释 2.2. 变量、函数、过程、控件等命名规则 (1)变量命名采用[作用范围][数据类型][自定义名称]规则定义,要求看到变量名就能直观的看出其范围和数据类型。 (2)函数、过程、方法、事件等命名应尽量做到观其名知其义。 (3)控件的命名采用[控件类型][自定义名]规则定义,要求通过名字能直观看出控件类型。 (4)自定义命名空间规则,要求能顾名思义 2.3. 源代码规则 风格约定:采用缩进的格式保存程序的层次结构。要求能直观的看出循环、判断等层次结构。

程序代码注释编写规范

程序代码注释编写规范 XXX份公司

为提高控制程序的阅读性与可理解性,现制定相关代码程序代码注释编写的编写规范。 一般情况下,源程序有效注释量必须在20%以上,注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。 常规注释有以下两种方式。 单行:以"//"符号开始,任何位于该符号之后的本行文字都视为注释。 多行:以"/*"符号开始,以"*/"结束。任何介于这对符号之间的文字都视为注释。 一、说明性文件 说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。 示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************* COPYRIGHT (C), MicTiVo International. Co., Ltd. File NAME: // 文件 Author: Version: Date: // 作者、版本及完成日期 DESCRIPTION: // 用于详细说明此程序文件完成的主要功能,与其他模块 // 或函数的接口,输出值、取值范围、含义及参数间的控 // 制、顺序、独立或依赖等关系 Others: // 其它内容的说明 Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明 1.... History: // 修改历史记录列表,每条修改记录应包括修改日期、修改 // 者及修改内容简述 1. Date: Author: Modification: 2. .. *************************************************/ 二、源文件头 源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。 示例:下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************************

VERILOG语言编写规范

VERILOG语言编写规范 1 目的 本规范的目的是提高书写代码的可读性可修改性可重用性,优化代码综合和仿真结果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范化公司的ASIC设计输入从而做到 1. 逻辑功能正确 2.可快速仿真 3. 综合结果最优如果是hardware model) 4. 可读性较好。 2 范围 本规范涉及Verilog HDL编码风格,编码中应注意的问题, Testbench的编码等。 本规范适用于Verilog model的任何一级( RTL behavioral, gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。 3 定义 Verilog HDL : Verilog 硬件描述语言 FSM :有限状态机 伪路径:静态时序分析( STA)认为是时序失败,而设计者认为是正确的路径 4 引用标准和参考资料 下列标准包含的条文通过在本标准中引用而构成本标准的条文在标准出版时所示版本 均为有效所有标准都会被修订使用本标准的各方应探讨使用下列标准最新版本的可能性 Actel HDLCoding Style Guider Sun Microsystems Revision 1.0 VerilogStyle and Coding Guidelines 5 规范内容 5.1 Verilog 编码风格

本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级( RTL behavioral,gate_level) 也适用于出于仿真,综合或二者结合的目的而设计的模块。 5.1.1 命名规范 选择有意义的信号和变量名,对设计是十分重要的。命名包含信号或变量诸如出处,有效状态等基本含义下面给出一些命名的规则。 1. 用有意义而有效的名字 有效的命名有时并不是要求将功能描述出来如 For ( I = 0; I < 1024; I = I + 1 ) Mem[I]<= #1 32’b0; For 语句中的循环指针I 就没必要用loop_index作为指针名。 2. 用连贯的缩写 长的名字对书写和记忆会带来不便,甚至带来错误采用缩写时应注意同一信号在模块中的一致性。缩写的例子如下: Addr address Pntr pointer Clk clock Rst reset 3. 用名字前加小写n表示低电平有效高电平有效的信号不得以下划线表示短暂 的引擎信号建议采用高有效 如 nRst, nTrdy, nIrdy nIdsel. 4. 大小写原则 名字一般首字符大写,其余小写(但parameter, integer 定义的数值名可全部用大写),两个词之间要用下划线连接(或第二个单词首字母大写) 如 :Packet_addr, Data_in, Mem_wr , Mem_ce_ Or: PacketAddr, DataIn, MemWr , MemCe 5.全局信号名字中应包含信号来源的一些信息 如: D_addr[7:2] 这里的 D 指明了地址是解码模块(Decoder module)中的地址.

VERYLOG编码规范

Verilog编码规范! 一. 强调Verilog代码编写风格的必要性。 强调Verilog代码编写规范,经常是一个不太受欢迎的话题,但却是非常有必要的。 每个代码编写者都有自己的编写习惯,而且都喜欢按照自己的习惯去编写代码。与自己编写风格相近的代码,阅读起来容易接受和理解。相反和自己编写风格差别较大的代码,阅读和接受起来就困难一些。 曾有编程大师总结说,一个优秀的程序员,能维护的代码长度大约在1万行数量级。代码的整洁程度,很大程度上影响着代码的维护难度。 遵循代码编写规范书写的代码,很容易阅读、理解、维护、修改、跟踪调试、整理文档。相反代码编写风格随意的代码,通常晦涩、凌乱,会给开发者本人的调试、修改工作带来困难,也会给合作者带来很大麻烦。 (实际上英文Coding Style有另一层涵义,更偏重的是,某一个电路,用那一种形式的语言描述,才能将电路描述得更准确,综合以后产生的电路更合理。本文更偏重的是,编写Verilog代码时的书写习惯。) 二. 强调编写规范的宗旨。 缩小篇幅 提高整洁度 便于跟踪、分析、调试 增强可读性,帮助阅读者理解 便于整理文档 便于交流合作 三. 变量及信号命名规范。 1. 系统级信号的命名。 系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号;系统信号以字符串Sys开头。 2. 低电平有效的信号后一律加下划线和字母n。如:SysRst_n;FifoFull_n; 3. 经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别。如CpuRamRd信号,经锁存后应命名为CpuRamRd_r。 低电平有效的信号经过锁存器锁存后,其命名应在_n后加r。如CpuRamRd_n信号,经锁存后应命名为CpuRamRd_nr 多级锁存的信号,可多加r以标明。如CpuRamRd信号,经两级触发器锁存后,应命名为CpuRamRd_rr。 4. 模块的命名。 在系统设计阶段应该为每个模块进行命名。命名的方法是,将模块英文名称的各个单词首字母组合起来,形成3到5个字符的缩写。若模块的英文名只有一个单词,可取该单词的前3个字母。各模块的命名以3个字母为宜。例如: Arithmatic Logical Unit模块,命名为ALU。 Data Memory Interface模块,命名为DMI。

软件开发代码规范C版

软件开发代码规范(C#版) 拟制:日期:2007-2-13审核:日期: 审核:日期: 批准:日期: 版权所有 ********有限公司

修订纪录

目录 注:Pascal命名法则:即名称中所有单词的第一个字母大写其他字母使用

小写形式。 Camel命名法则:即名称中第一个单词各个字母全部小写,其他部分遵循Pascal命名法则。 1、第一章命名规范 1.1、第一节总则 1.本命名规则除特殊提及外统一使用Camel命名法则。 如:controlMenu 2.命名时尽量不使用拼音,更不可使用拼音缩写(专有名词除外)。 3.如果使用品牌名称命名时其大小写尽量保持和品牌名称一致的样式。 如:LuX则命名时,不要写成LUX,或者Lux,而应该保持与原品牌名称风格一致使用LuX 4.使用专有名词或英文缩写命名时采用大写形式。 如:CNNIC 5.禁止使用仅区分大小写的方式命名。 如:Abc与abc仅用大写A来区分,这样写在类C系语言中不会出错,但是不利于系统的迁移

、第二节变量命名规范 1.2.1、CodeBehind内部命名规范 1.公有字段/属性使用Pascal 命名规则,私有变量/保护变量/局部变量使用Camel命名规则,遵循动宾结构。 例: public class Hello { private string userName; private DateTime loginTime; private bool isOnline; public string UserName { get { return ; } } } 2.即使对于可能仅出现在几个代码行中的生存期很短的变量,仍然使用意义描述性的名称。仅对于短循环索引使用单字母变量名,如 i 或 j 3.在变量名中使用互补对,如 Min/Max、Begin/End 和 Open/Close。 4.当一个方法内部变量繁多的时候,可以使用Camel命名法则,其中第一个单词可以使用变量类型的缩写来说明以示区别。 例:

程序员代码编写标准指南汇总

Delphi 6 程序员代码编写标准指南 一、序言 二、通用源代码格式规则 2.1 缩格 2.2 页边空格 2.3 Begin…End 配对 2.4 代码文件中通用符号含义 三、Object Pascal 3.1 括号 3.2 保留字和关键字 3.3 过程和函数(例程) 3.3.1 命名/格式化 3.3.2 形式参数 3.3.2.1 格式化 3.3.2.2 命名 3.3.2.3 参数的排序 3.3.2.4 常量参数 3.3.2.5 名称的冲突 3.4 变量 3.4.1 变量的命名和格式 3.4.2 局部变量 3.4.3 全局变量的使用 3.5 类型 3.5.1 大写约定 3.5.1.1 浮点指针类型 3.5.1.2 枚举类型 3.5.1.3 变数和ole变数类型 3.5.2 结构类型 3.5.2.1 数组类型 3.5.2.2 记录类型 3.6 语句 3.6.1 if 语句 3.6.2 case 语句 3.6.2.1 一般性话题 3.6.2.2 格式 3.6.3 while 语句 3.6.4 for 语句 3.6.5 repeat 语句

3.6.6 with 语句 3.6.6.1 一般话题 3.6.6.2 格式 3.7 结构异常处理 3.7.1 一般话题 3.7.2 try…finally的使用 3.7.3 try…except的使用 3.7.4 try…except…else的使用 3.8 类类型 3.8.1 命名和格式 3.8.2 域 3.8.2.1 命名/格式 3.8.2.2 可视化 3.8.3 方法 3.8.3.1 命名/格式 3.8.3.2 使用静态的方法 3.8.3.3 使用虚拟/动态的方法 3.8.3.4 使用抽象的方法 3.8.3.5 属性存取方法 3.8.4 属性 3.8. 4.1 命名/格式 3.8. 4.2 使用存取的方法 四、文件 4.1 工程文件 4.1.1 命名 4.2 窗体文件 4.2.1 命名 4.3 数据模板文件 4.3.1 命名 4.4 远端数据模板文件 4.4.1 命名 4.5 Unit文件 4.5.1 通用Unit结构 4.5.1.1 unit的名字 4.5.1.2 uses子句 4.5.1.3 interface部分 4.5.1.4 implementation部分 4.5.1.5 initialization部分 4.5.1.6 finalization部分 4.5.2 窗体单元

源代码及文档管理规范

第一章总则 第一条为保障公司源代码和开发文档安全不至于泄露,保证源代码的完整,明确源代码控制管理流程,特制定此管理办法。 第二条本办法适用于所有涉及接触源代码的各部门各岗位。所涉及部门都必须严格执行本管理办法。 第三条源代码直接控制管理部门为研发部。 第四条本办法管理重点在于控制管理源代码的完整性,不被非授权获取,不被非授权复制和传播。 第五条本办法所指源代码不仅限于公司开发人员自行编写实现功能的程序代码,而且还包括相应的开发设计文档及用于支撑整个系统运行所必须具备的第三方软件、控件和其它支撑库等文件。 第二章源代码完整性保障 第六条所有软件的源代码文件及相应的开发设计文档均必须及时加入到指定的源代码服务器中的指定库中。 第七条我们研发的产品软件运行所必须的第三方软件、控件和其它支撑库等文件也必须及时加入源代码服务器中指定的库中。 第八条软件开始编写或者调整代码之前,其相应的设计文档和代码必须先从相应的SVN 库进行SVNUpdate操作。软件编码或功能调整结束测试正确无误后,相应的源代码必须进行SVNCommit操作,在最终进行SVNCommit操作之前需要再进行SVNUpdate操作,查看是否有冲突产生,如果有冲突产生需要和冲突相关人一并解决冲突。 第三章源代码的授权访问 第九条源代码服务器对于共享的SVN库的访问建立操作系统级的,基于身份和口令的访问授权。 第十条在SVN库中设置用户,并为不同用户分配不同的,适合工作的最小访问权限。要求连接SVN库时必须校验SVN中用户身份及其口令。在SVN库中要求区别对待不同用户的可访问权、可读权、可写权。 第十一条曾经涉及、触及源代码的计算机在转作它用,或者离开研发部门之前必须由网络管理人员全面清除计算机硬盘中存储的源代码。如果不能确定,必须对计算机中所有硬盘进行全面格式化后方可以转做它用或离开研发部门。 第四章源代码复制和传播 第十二条源代码向研发部门以外复制必须获得总经理的书面授权。并必需记录复制人、批准人、复制时间、复制目的、文件流向、文件版本或内容。 第十三条源代码以任何介质形式进行存储的备份,必须由专人负责保管。对于这些介质地借阅,用于研发部内部使用的必须获得研发部经理的授权,对于用于研发部以外使用的必须获得总经理的书面授权。 第十四条源代码的借阅、复制必须进行详细的登记,必需记录借阅人、批准人、借阅时间、

软件开发代码规范(C#版)

软件开发代码规(C#版) 拟制: 日期:2007-2-13 审核: 日期: 审核: 日期: 批准: 日期: 所有 ********

修订纪录

目录 1、第一章命名规 (4) 1.1、第一节总则 (4) 1.2、第二节变量命名规 (4) 1.2.1、CodeBehind部命名规 (4) 1.2.2、控件命名规 (5) 1.3、第三节常量命名规 (5) 1.4、第四节命名空间、类、方法命名规 (5) 1.5、第五节接口命名规 (6) 1.6、第六节命名规小结 (6) 2、第二章代码注释规 (6) 2.1、第一节模块级注释规(命名空间、类等) (6) 2.2、第二节方法级注释规 (7) 2.2.1 、属性注释 (7) 2.2.2 、方法注释 (7) 2.3、第三节代码间注释规 (8) 3、第三章编写规 (8) 3.1、第一节格式规 (8) 3.2、第二节编程规 (9) 3.2.1 、程序结构要求 (9) 3.2.2 、可读性要求 (9) 3.2.3 、结构化要求 (10) 3.2.4 、正确性与容错性要求 (10) 3.2.5 、可重用性要求 (10) 3.2.6 、interface使用注意事项 (11) 3.2.7 、类使用注意事项 (11) 3.2.8 、流程控制语句注意事项 (12) 3.2.8 、其他应注意事项 (13) 注:Pascal命名法则:即名称中所有单词的第一个字母大写其他字母使用小写形式。 Camel命名法则:即名称中第一个单词各个字母全部小写,其他部分遵循Pascal命名法则。

1、第一章命名规 1.1、第一节总则 1.本命名规则除特殊提及外统一使用Camel命名法则。 如:controlMenu 2.命名时尽量不使用拼音,更不可使用拼音缩写(专有名词除外)。 3.如果使用品牌名称命名时其大小写尽量保持和品牌名称一致的样式。 如:LuX则命名时,不要写成LUX,或者Lux,而应该保持与原品牌名称风格一致使用LuX 4.使用专有名词或英文缩写命名时采用大写形式。 如:CNNIC 5.禁止使用仅区分大小写的方式命名。 如:Abc与abc仅用大写A来区分,这样写在类C系语言中不会出错,但是不利于系统的迁移 1.2、第二节变量命名规 1.2.1、CodeBehind部命名规 1.公有字段/属性使用Pascal 命名规则,私有变量/保护变量/局部变量使用Camel命名规则,遵循动宾结构。 例: public class Hello { private string userName; private DateTime loginTime; private bool isOnline; public string UserName { get { return https://www.360docs.net/doc/3118170587.html,erName; } } } 2.即使对于可能仅出现在几个代码行中的生存期很短的变量,仍然使用意义描述性的名称。仅对于短循环索引使用单字母变量名,如 i 或 j 3.在变量名中使用互补对,如 Min/Max、Begin/End 和 Open/Close。 4.当一个方法部变量繁多的时候,可以使用Camel命名法则,其中第一个单词可以使用变量类型的缩写来说明以示区别。 例:

第5章-Verilog HDL语法规范(第10讲)-5.10

Verilog HDL语言规范

Verilog HDL 行为描述语句 本部分介绍行为描述语句。通过行为级建模把一个复杂的系统分解成可操作的若干个模块,每个模块之间的逻辑关系通过行为模块的仿真加以验证。同时行为级建模还可以用来生成仿真激励信号,对已设计模块进行仿真验证。

Verilog HDL 行为描述语句 --过程语句 过程分配用于更新reg,integer,time,real, realtime和存储器数据类型。对于过程分配和连续分配来说,有下面的不同之处: ?连续分配 连续分配驱动网络。只要一个输入操作数的值发生变化,则更新和求取所驱动网络的值。 ?过程分配 在过程流结构的控制下,过程分配更新流结构内变量的值。

Verilog HDL 行为描述语句 --过程语句 过程分配的右边可以是求取值的任何表达式。左边应该是一个变量,它接收右边表达式分配的值。 过程分配的左边可以是下面的一种格式: ?reg 、integer 、real 、realtime 或者time 数据类型分配给这些数据类型所引用的名字。 ?reg 、integer 、real 、realtime 或者time 数据类型的位选择分配到单个的比特位

Verilog HDL 行为描述语句 --过程语句 ?reg 、integer 、real 、realtime 或者time 数据类型的部分选择一个或者多个连续的比特位的部分选择。 ?存储器字 存储器的单个字 ?任何上面的并置(连接)或者嵌套的并置(连接) 上面四种形式的并置或者嵌套的并置。这些语句对右边的表达式进行有效的分割,将分割的部分按顺序分配到并置或者嵌套并置的不同部分中。

软件著作权申报中60页标准代码文档的写作经验谈

软件著作权申报中60页标准代码文档的写作经验谈 在申报著作权的工作中,都要提供软件的60页源代码。这是一种特殊要求的东西,它 要求每页50行程序,并要求前30页是程序的前半部分有开头并连续,后30页是程序的后半部分包括结尾也要连续,30和31页之间可以不连续。这个文档的格式,一般要求有页眉 上标记申报的软件名称,天津还要有行标,页眉的右边有,第某页,共60页字样。 这样的要求通常负责技术的开发人员,是没有时间和精力做好后,提供给申报人员的, 这就需要负责申报的人员,根据技术开发人员提供的源代码进行编辑,使之符合申报的要求。对此,我曾经反复按照这个要求去处理技术人员传来的代码,一开始确实破费周折,处理的多了也慢慢总结出一些经验来,在这里与系统内负责申报的同仁分享。 一、程序的选择 要选择超过3000行的源代码,这样才能裁剪出,符合要求的代码,同时,最好选取核 心程序的代码,这样"using ”等语句会对应主数据库或主要的模块。程序要有比较鲜明的 开始段落和结尾的段落,还注意去掉一些注释性的内容,如下面这样的部分。 #region 统计导出XLS模板 /****************************************************************** * 城信所国土房产政务平台Copyright (c) 2011-2015 Inc. * ALL RIGHTS RESERVED *功能描述:统计导出XLS模板 *作者: *创建日期:2011-11-28 *版本: *更新说明: * **************************************************************/ #en dregi on

用verilog语言编写交通灯程序

交通灯 一、实验目的 写一个交通灯,要求: ①有东西南北四个方向,两组交通灯轮流交替变换,其中,红灯时间为30 个时间单位,绿灯时间为25个时间单位,黄灯时间为5个时间单位。最后用modelsim软件进行仿真。 ②要求设计是一个可综合设计。 二、实验原理 根据实验要求的逻辑功能描述,可以分析得出原理图如下: 根据实验要求画出控制器的状态转移图如下:

三、代码 1、源代码 (1)控制器模块 module traffic_lights(clk,rst,count,ew,sn); input clk,rst; input[5:0] count; output[2:0] ew,sn; reg[2:0] ew,sn; reg[3:0] state; parameter Idle=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100; always @(posedge clk) if(!rst) begin state<=Idle; end else casex(state) Idle: if(rst) begin state<=s1; end s1: if(count=='d25) begin state<=s2; end s2: if(count=='d30) begin state<=s3;

end s3: if(count=='d55) begin state<=s4; end s4: if(count=='d60) begin state<=s1; end endcase always @(posedge clk) begin if(!rst) begin ew<=3'b100; sn<=3'b100; end else casex(state) Idle: if(rst) begin ew<=3'b100; sn<=3'b001; end s1: if(count=='d25) begin ew<=3'b100; sn<=3'b010; end

华为代码规范文档

代码规范文档

目录 1 概述错误!未定义书签。 编写目的错误!未定义书签。 文档约定错误!未定义书签。 预期的读者和阅读建议错误!未定义书签。 参考文献错误!未定义书签。 2 排版要求错误!未定义书签。 程序块缩进错误!未定义书签。 程序块之间空行错误!未定义书签。 长语句和长表达式错误!未定义书签。 循环、判断等长表达式或语句错误!未定义书签。 长参数错误!未定义书签。 短语句错误!未定义书签。 条件、循环语句错误!未定义书签。 语句对齐错误!未定义书签。 函数、过程和结构等语句块错误!未定义书签。 程序块分界符错误!未定义书签。 操作符前后空格错误!未定义书签。 其他错误!未定义书签。 3 注释错误!未定义书签。 有效注释量错误!未定义书签。 公司标识错误!未定义书签。 说明性文件错误!未定义书签。 源文件头错误!未定义书签。 函数头部说明错误!未定义书签。 注释与代码一致错误!未定义书签。 注释内容错误!未定义书签。 注释缩写错误!未定义书签。 注释位置错误!未定义书签。 变量、常量注释错误!未定义书签。 数据结构的注释错误!未定义书签。 全局变量错误!未定义书签。 注释缩排错误!未定义书签。 注释与代码之间空行错误!未定义书签。 变量定义、分支语句错误!未定义书签。 其他错误!未定义书签。 4 标识符命名错误!未定义书签。 命名清晰错误!未定义书签。 特殊命名需注释错误!未定义书签。 命名风格保持一致错误!未定义书签。 变量命名错误!未定义书签。 命名规范与系统风格一致错误!未定义书签。 其他错误!未定义书签。 5 可读性错误!未定义书签。 运算符优先级错误!未定义书签。

verilog语言代码设计规范

verilog语言代码设计规范2011年12月

目录 一、规范适用范围 ------------------------------------------------------------------------ 4 1.1项目适用范围------------------------------------------------------------------------------------- 4 1.2人员适用范围------------------------------------------------------------------------------------- 4 1.3编码设计的成果形式 --------------------------------------------------------------------------- 4 二、代码书写规范 ------------------------------------------------------------------------ 5 2.1模块说明书写规范------------------------------------------------------------------------------- 5 2.1模块注释书写规范------------------------------------------------------------------------------- 5 2.3变量名称书写规范------------------------------------------------------------------------------- 6 2.4代码结构书写规范------------------------------------------------------------------------------- 7 三、使用verilog语言的语法范围----------------------------------------------------- 8 3.1设计RTL代码的语法范围 -------------------------------------------------------------------- 8 3.2设计仿真代码的语法范围 -------------------------------------------------------------------- 10 四、使用verilog语言的结构范围---------------------------------------------------- 11 4.1系统设计文件的形式与使用方法----------------------------------------------------------- 11 4.2模块结构划分的标准 -------------------------------------------------------------------------- 12 4.3组合逻辑的代码风格 ------------------------------------------------------------------------ 13 4.4时序逻辑的代码风格 -------------------------------------------------------------------------- 21 4.5仿真代码的代码风格 -------------------------------------------------------------------------- 27 五、使用受限范围内的语法或结构要进行的申请过程-------------------------- 32 5.1受限的语法与结构------------------------------------------------------------------------------ 32 5.2批准使用的程序--------------------------------------------------------------------------------- 32

c语言代码书写规范

c语言代码书写规范 篇一:关于C语言编程书写规范的规则和建议 关于C语言编程书写规范的规则和建议 一、头文件 1、头文件开头处的版权和版本声明。 2、预处理块。 3、函数和类结构声明等。 ? 头文件由三部分内容组成: ? 【规则】为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。 ? 【规则】用 #include 格式来引用标准库的头文件(编译器将从标准库目录开始搜索). ? 【规则】用 #include “”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索) ? 【建议】头文件中只存放“声明”而不存放“定义” ? 【建议】不提倡使用全局变量,尽量不要在头文件中出现象extern int value 这类声明。 二、程序的版式 空行 ? 【规则】在每个类声明之后、每个函数定义结束之

后都要加空行。 ? 【规则】在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。 代码行 ? 【规则】一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。 ? 【规则】if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。 ? 【建议】尽可能在定义变量的同时初始化该变量(就近原则) 代码行内的空格 ? 【规则】关键字之后要留空格。象const、virtual、inline、case 等关键字之后至少要留一个空格,否则无法辨析关键字。象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。 ? 【规则】函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。 ? 【规则】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。

Verilog+HDL代码书写规范

1.目的 本规范的目的是提高书写代码的可读性、可修改性、可重用性,优化代码综合和仿真的结果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范化可编程技术部的FPGA设计输入,从而做到:①逻辑功能正确,②可快速仿真,③综合结果最优(如果是hardware model),④可读性较好。 2.范围 本规范涉及Verilog HDL编码风格,编码中应注意的问题,Testbench的编码等。 本规范适用于Verilog model的任何一级(RTL,behavioral, gate_level),也适用于出于仿真、综合或二者结合的目的而设计的模块。 3.定义 Verilog HDL : Verilog 硬件描述语言 FSM :有限状态机 伪路径:静态时序分析(STA)认为是时序失败,而设计者认为是正确的路径。 4.规范内容 4.1.Verilog 编码风格 本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级(RTL,behavioral, gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。 4.1.1. 命名的习惯 选择有意义的信号和变量名,对设计是十分重要的。命名包含信号或变量诸如出处、有效状态等基本含义,下面给出一些命名的规则。 y用有意义而有效的名字 有效的命名有时并不是要求将功能描述出来,如 For ( I = 0; I < 1024; I = I + 1 ) Mem[I] <= 32’b0; For 语句中的循环指针I 就没必要用loop_index作为指针名。 y用连贯的缩写 长的名字对书写和记忆会带来不便,甚至带来错误。采用缩写时应注意同一信号在模块中的一致性。缩写的例子如下: Addr address Pntr pointer Clk clock reset

FORTRAN 90 程序编程规范

FORTRAN 90 程序编程规范 Fortran 90 编程规范,使程序代码高度组织化,更加易读、易懂、易于维护,程序更加高效。使编出的程序更易懂、易于维护。 1 语言选择 数值预报创新系统软件开发应避免使用Fortran77 的某些过时特征以Fortran 90不一致的特征。选择Fortran 90 作为开发语言,并采用Fortran 90 的新功能,如动态内存的分配(dynamic memory allocation)、递归(recursion ), 模块(modules)、POINTER 、长变量名、自由格式等。 Fortran 77其中某些只是一些冗余的功能,这些功能已经过时,另外,还有一些在Fortran90 中被证明是不好的用法,建议不要使用。 2 Fortran 90 的新特性 2.1.1 建议使用的Fortran 90 新特性 建议使用Fortran 90 提供的模块(module ),并用Use ONLY 指定module 中哪些变量或派生类型定义可用于调用程序。 尽量使用数组下标三元组,这样可优化并减少所需的代码行数。为提高可读性,要在括号内表明数组的维数,例如: 1dArrayA(:) = 1dArrayB(:) + 1dArrayC(:) 2dArray(: , :) = scalar * Another2dArray(: , :) 当访问数组的子集时,例如在有限差分等式中,可以通过使用下标三元组实现。例如:2dArray(: , 2:len2) = scalar *( & Another2dArray(:, 1:len2 -1) & - Another2dArray(:, 2:len2) & ) 对程序单元(program units )命名,并使用End program ,End subroutine ,End interface ,End module 等结构再次指定“program unit ”的名称。 在逻辑表达式中使用>、 >=、 ==、 <、 <=、 /=,它们分别代 替.gt.、.ge.、.eq.、.lt.、.le.、.ne. 。新的表示方法更接近标准的数学符号 在变量定义中始终使用“::”;始终用“DIMENSION ”定义数组形状;始终用(len=)的语法格式声明字符变量的长度。

verilog的代码规范和coding风格

verilog的代码规范和coding风格 想要成为一名优秀的数字IC设计工程师需要哪些基本的专业知识呢?如下: 1.半导体物理学、半导体器件物理学、基本的固体物理、半导体工艺与制造等物理学知识; 2.电路分析、模拟电子线路、COMS模拟集成电路、专用 集成电路基础等模拟IC知识; 3.信号系统、数字信号处理、信道编码、通信原理等通 信知识; 4.C语言、汇编、C++、脚本(shell、tcl、perl)、Linux(我觉得如果懂kernel那就更好了)、体系结构、组成原理等计算机知识; 5.各种EDA和编程调试工具的使用Modelsim、Debussy、quartus ii、Cadence、DC、vim等等(就数字方向而言 用的最多的5种左右,模拟另当别论);另外虚拟机什么的总得玩得转吧! 6.当然最重要的还是我们亲爱的--verilog,不会 verilog(当然VHDL也是一样的)那你会别的也算不上优秀的 Digital IC Engineer!verilog语法并不复杂,只是初 学者容易犯一些“类C”错误,总会不经意

间将verilog写 成了C语言,或者是没有使用并行思想,或者就是多处 赋值等等问题。如果我们克服了之前的一些小毛病,在 这 些之外,我们想更近一步提升自己的写代码水平、研发 水平,而不是只做一个码农的话那么我们要做的就是: 第一步:提高代码规范性,每个企业、研究所可能都有 自己的一套代码书写规范,但是总的来说都有一些共性,而且往往这些共性的地方还特别多,一个没有代码规范 的程序员不可能写出非常漂亮和优秀的程序,当然有了 规 范的代码后也不一定就能写出漂亮和优秀的程序,这是 两码事。代码规范之后的一个境界我觉得是优良的编程 风 格,编程风格不同于代码规范,编程风格在verilog中 特别指代那些逻辑上的风格,同样的功能,使用不同的 编 程风格,代码综合面积可能是几倍的关系,这一点我深 有体会,另外,人们不经意间的编码习惯可能会导致许 多 冗余代码,在verilog综合之后,这些冗余就会成为实 实在在多出来的不必要的电路,他们或者是寄存器或者

相关文档
最新文档