差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
硬禾实战营verilog代码规范 [2016/08/03 18:36]
zhijun
硬禾实战营verilog代码规范 [2021/09/15 14:54] (当前版本)
gongyu
行 1: 行 1:
 +[[stepfpga_code_spec]]
 +### 1.RTL CODE 规范
  
-====1.RTL CODE 规范==== 
 ------ ------
 +
 ===1.1标准的文件头=== ===1.1标准的文件头===
 +
 ------ ------
 在每一个版块的开头一定要使用统一的文件头,其中包括作者名,模块名,创建日期,概要,更改记录,版权等必要信息。 在每一个版块的开头一定要使用统一的文件头,其中包括作者名,模块名,创建日期,概要,更改记录,版权等必要信息。
 统一使用以下的文件头:其中*为必需的项目 统一使用以下的文件头:其中*为必需的项目
 +
 <code verilog> <code verilog>
 //​******************************************************** //​********************************************************
行 14: 行 18:
 //   File name       : ​  ​MODULE_NAME.v //   File name       : ​  ​MODULE_NAME.v
 //   ​Module name     : ​  ​MODULE_NAME //   ​Module name     : ​  ​MODULE_NAME
-//   ​Author ​         :   tony-ning+//   ​Author ​         :   STEP
 //   ​Description ​    ​:  ​ //   ​Description ​    ​:  ​
 //   ​Email ​          : ​  ​Author’s email //   ​Email ​          : ​  ​Author’s email
行 24: 行 28:
 //   ​Modification history //   ​Modification history
 //   ​---------------------------------------------------------------------------- //   ​----------------------------------------------------------------------------
-//   ​Version ​        : +// Version ​      ​Data(2016/08/01)   V1.0 
-//   Data(yyyy/mm/dd)   +// Description
-//   Name            : +
-//   Description ​    :+
 // //
 //​************************************************************* //​*************************************************************
 </​code>​ </​code>​
  
-===1.2 标准的module格式 ===(module 整体结构)+===1.2标准的module格式=== 
 ------ ------
 +
 对于模块的书写采用统一的格式便于项目内部成员的理解和维护,我们用批处理建立了一个MODULE模块,其内容解释如下: 对于模块的书写采用统一的格式便于项目内部成员的理解和维护,我们用批处理建立了一个MODULE模块,其内容解释如下:
 \\ 端口定义按照输入,输出,双向的顺序: \\ 端口定义按照输入,输出,双向的顺序:
行 41: 行 45:
 \\ 例化名 :U_XXX ​ (大写) \\ 例化名 :U_XXX ​ (大写)
 \\ IP 内部所有的模块名都要加IP名或者IP名简称作前缀,如USB_CTRL、USB_TX_FIFO。 \\ IP 内部所有的模块名都要加IP名或者IP名简称作前缀,如USB_CTRL、USB_TX_FIFO。
 +
 <code verilog> <code verilog>
 // ***************************** // *****************************
行 106: 行 111:
  
 ===1.3一致的排版=== ===1.3一致的排版===
 +
 ------ ------
 +
 \\ A. 一致的缩排 \\ A. 一致的缩排
 +
 <code verilog> <code verilog>
  //​统一的缩排取4个空格宽度  //​统一的缩排取4个空格宽度
行 121: 行 129:
   
 \\ B.一致的 begin end 书写方式 \\ B.一致的 begin end 书写方式
 +
 <code verilog> <code verilog>
  //always 中,一定要用begin end 区分,格式和代码风格统一如下:  //always 中,一定要用begin end 区分,格式和代码风格统一如下:
行 151: 行 160:
  else  else
  </​code>​  </​code>​
 +
 ===1.4 一致的信号命名风格=== ===1.4 一致的信号命名风格===
 +
 ------ ------
 +
 简洁,清晰,有效是基本的信号命名规则,详见命名规范。 简洁,清晰,有效是基本的信号命名规则,详见命名规范。
 ^全称 ^缩写  ​       ^中文含义^ ^全称 ^缩写  ​       ^中文含义^
行 198: 行 210:
 |wr enable |wen |写使能| |wr enable |wen |写使能|
 |write |wr |写操作| |write |wr |写操作|
- +
 \\ a.端口、信号、变量名的所有字母小写:函数名、宏定义、参数定义用大写 \\ a.端口、信号、变量名的所有字母小写:函数名、宏定义、参数定义用大写
 \\ b.使用简称、缩略词(加上列表) \\ b.使用简称、缩略词(加上列表)
行 206: 行 218:
 \\ f.不能用 ”reg”,​作为最后的后缀名,因为综合工具会给寄存器自动加上_reg,​ 如果命名里就用_reg作为后缀名则扰乱了网表的可读性。 \\ f.不能用 ”reg”,​作为最后的后缀名,因为综合工具会给寄存器自动加上_reg,​ 如果命名里就用_reg作为后缀名则扰乱了网表的可读性。
  
-                 +====2.模板示例==== 
 + 
 +------ 
 + 
 +<code verilog>​ 
 +//​******************************************************** 
 +// 
 +//   ​Copyright(c)2016,​ ECBC  
 +//   All rights reserved 
 +// 
 +//   File name       : ​  ​MODULE_NAME.v 
 +//   ​Module name     : ​  ​MODULE_NAME 
 +//   ​Author ​         :   ​STEP 
 +// Description :   
 +//   ​Email ​          : ​  ​Author’s email 
 +//   ​Data ​           :   ​2016/​08/​01 
 +//   ​Version ​        : ​  ​current version, just this: v1.0 
 +// 
 +//   ​Abstract ​       :    
 +// 
 +//   ​Modification history 
 +//   ​---------------------------------------------------------------------------- 
 +// Version ​      ​Data(2016/​08/​01) ​  ​V1.0 
 +// Description 
 +// 
 +//​************************************************************* 
 +//​******************* 
 +//​DEFINE(s) 
 +//​******************* 
 + 
 +//​******************* 
 +//​DEFINE(s) 
 +//​******************* 
 +//`define UDLY 1    //Unit delay, for non-blocking assignments in sequential logic 
 + 
 +//​******************* 
 +//DEFINE MODULE PORT 
 +//​******************* 
 +module MODULE_NAME 
 +
 + //INPUT 
 + rest_n ​        , 
 + clk_* ​         , 
 + a_din ​         , 
 + b_din ​         , 
 + 
 + //OUTPUT 
 + a_dout ​        , 
 + b_dout 
 +); 
 + 
 + //​******************* 
 + //DEFINE PARAMETER 
 + //​******************* 
 + parameter T1S = 24_999_999;​ 
 + 
 + //​******************* 
 + //DEFINE INPUT 
 + //​******************* 
 + input ​            ​ rst_n ; ​   //reset, active low . 
 + input ​            ​ clk_* ; ​   //clock signal, 50M . 
 + input ​ [n:​0] a_din ; ​   //***** 
 + input ​ [k:0]       ​ b_din ; ​   //***** 
 + 
 + //​******************* 
 + //DEFINE OUTPUT 
 + //​******************* 
 + output ​ [m:0]    a_dout ​     ;    //***** 
 + output ​ [i:0]     ​ b_dout ​     ;    //***** 
 + 
 + //​******************** 
 + //OUTPUT ATTRIBUTE 
 + //​******************** 
 + //REGS 
 + reg   ​[m:​0] ​    ​ a_dout ; ​   //***** 
 + 
 + //WIRES 
 + wire  [i:0]      b_dout ; ​   //***** 
 + 
 + //​********************* 
 + //INNER SIGNAL DECLARATION 
 + //​********************* 
 + //REGS 
 + reg   ​[3:​0] ​      ​ counter ​    ; ​   //***** 
 + 
 + //WIRES 
 + wire  [7:0]       ​ temp1 ; ​   //***** 
 + 
 + //​********************* 
 + //​INSTANTCE MODULE 
 + //​********************* 
 + 
 + //​************************************************************** 
 + //instance of module MODULE_NAME_A filename:​module_name_a.v 
 + //​************************************************************** 
 + MODULE_NAME_A ​ U_MUDULE_NAME_A( 
 + .A (A ),​ 
 + .B (B ),​ 
 + .C (C ) 
 + ); 
 + 
 + //​********************* 
 + //MAIN CORE 
 + //​********************* 
 + 
 + //​Sequential logic style 
 + always@(posedge clk_* or negedge rest_n) 
 + begin : SEQ_BLOCK_NAME 
 + if (rst_n==1’b0) 
 + counter<​=4’b0;​ 
 + else 
 + begin 
 + if (expression) 
 + counter <= #`DLY siginal_b;​ 
 + else; 
 + end 
 + end // SEQ_BLOCK_NAME 
 + 
 + //​Combinational logic style 
 + always@(signal_a or signal_b) 
 + begin:​COM_BLOCK-NAME 
 + case (expression) 
 + item1 ​   :begin 
 + signal_c=*****;​ 
 +   end 
 + item2 ​   : //​statement;​ 
 + default ​  ://​statement;​ 
 + endcase 
 + end // COM_BLOCK_NAME 
 +  
 + assign out = expression ? (1’b0):​(1’b1);​ 
 + 
 + //​********************* 
 +endmodule 
 + 
 + </​code> ​