差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
|
硬禾实战营verilog代码规范 [2016/08/03 18:37] 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 一致的信号命名风格=== | ||
| + | |||
| ------ | ------ | ||
| + | |||
| 简洁,清晰,有效是基本的信号命名规则,详见命名规范。 | 简洁,清晰,有效是基本的信号命名规则,详见命名规范。 | ||
| ^全称 ^缩写 ^中文含义^ | ^全称 ^缩写 ^中文含义^ | ||
| 行 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> | ||