FPGA|CPLD|ASICwilliam hill官网
直播中

weihu_lu

10年用户 45经验值
擅长:可编程逻辑 电源/新能源 嵌入式技术 控制/MCU
私信 关注
[资料]

verilog 代码规范

这是参考一篇《 海思高校合作——QA 培训资料》写的,其实也只是整理而已啦,据说是华为的代码规范~~不过尽管是还是不是,以一大公司的代码规范作为看考是很值得学习的!


/**********************************************************************
* Copy(c) 1906, Jinan University
* All right reserved
*
* Company :
* Author :
* Email :
*
* Filename : led_run  //文件名小写
* Description :
* Call by :
* Revision History :
*
**********************************************************************/
//*****************************
// DEFINE(S)
//*****************************
`define        //函数名、宏定义、参数定义用大写


//*****************************
// TOP MODULE
//*****************************
module MODULE_NAME(  //模块名大写,对应文件名的小写
                        //端口定义按照输入,输出,双向的顺序
                        //INPUT
                        rst_n, //复位信号,_n代表低电平有效,_p高电平有效
                        clk_*, //*指代时钟频率,如clk_50M,代表50MHz时钟
                        a_din,
                        b_din,
                        //OUTPUT
                        a_dout,
                        b_dout,
                        //INOUT
                        a_dinout,
                        b_dinout
                                );
//*****************************
// DEFINE PARAMETERS
//*****************************
parameter        //函数名、宏定义、参数定义用大写


//*****************************
// DEFINE INPUT
//*****************************
//输入输出信号的宽度定义与关键字之间,信号名与宽度之间要用空格分开
//所有宽度定义对所有信号名对齐
//基于含义命名(避免以数字命名的简单做法),含义可分段(最多分三段),每一小
//     段之间加下划线”_”,如 tx_data_val;命名长度一般限制在 20 个字符以内。
input       rst_n;    //reset  //端口、信号、变量名的所有字母小写
                               //低电平有效信号,加后缀”_n”
input       clk_*;    //clock
input [i:0] a_din ;   //*****
input [j:0] b_din ;   //*****


//*****************************
// DEFINE OUTPUT
//*****************************
output [m:0] a_dout ; //*****
output [n:0] b_dout ; //*****


//*****************************
// DEFINE INOUT
//*****************************
inout [p:0] a_dinout ; //*****
inout [q:0] b_dinout ; //*****


//*****************************
// OUTPUT ATTRIBUTE
//*****************************
//REGS
reg [m:0] a_dout ; //*****  //端口、信号、变量名的所有字母小写
                   //不能用 ”reg”,作为最后的后缀名, 因为综合工具会给寄存器自动加上_reg, 如果命
                   //       名里就用_reg 作为后缀名则扰乱了网表的可读性。


//WIRES
wire [n: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( //例化名在模块名前面加U_
        .A (A ),
        .B (B ),
        .C (C )
        );


//*****************************
// MAIN CORE
//*****************************
//Sequential logic style
//不允许有模糊不清的状态机模式,所有的状态机必须清晰明了。
//       我们要求将状态机的时序部分和组合逻辑部分分开。(详情可以参考我的另一篇blog verilog规范设计--状态机)
//always中,一定要用 begin end 区分,格式和代码风格统一如下
always @(posedge clk_* or negedge rest_n)
begin : SEQ_BLOCK_NAME
//统一的缩排取4个空格宽度
        //赋值或者条件判断时要注明比特宽度,注意表达式的位宽匹配
        //复位的条件表达式及命名要和 always 敏感列表中的描述相统一,并且一定要使用异步复
    //       位。 所有的复位必须低有效。
        if (rst_n==1'b0)
                counter<=4'b0;  // if else 中仅有一个语句行时,不要使用 begin end
        else
        begin
            //一般表达式在运算符的两侧要各留出一个空格,但定义比较长的表达式,去掉预先级高
        //       的运算符前的空格,使其与运算对象紧连在一起,可以更清晰的显示表达式结构。
                if( (&a==1’b1) && ( !flag==1’b1) ||( b==1’b1) )  //如果一个表达式的分组情况不是很明显时,加上括号有助于理解。
                        counter <= #`DLY siginal_b;
                else;  // if else 搭配使用,对于缺省的条件要写”else;”;
        end
end // SEQ_BLOCK_NAME


//Combinational logic style
always @(signal_a or signal_b)
begin : COM_BLOCK-NAME
        //if else 结构综合的结构可能是与或非门构成的,也可能是一组多路选择器,而 case
        //       结构综合结果一般会是多路选择器,但对于可以优化的 case 综合工具会综合出更简单的结构。
        //所有对于可以写出平行结构的条件,优先写成 case 结构,例如地址译码等,条件之间
    //       有重复和嵌套的情况则是写成 if else 结构。
        case (expression)
                item1 : begin
                        signal_c=*****;
                end
                item2 : //statement;
                default ://statement;  // case 中的缺省条件要写”default”;
        endcase
end // COM_BLOCK_NAME
//*********************


endmodule


//无条件寄存的寄存信号在原信号上加 ff1 、 ff2… 如原信号 data_in, 寄存一拍
//       data_in_ff1, 寄存两拍 data_in_ff2

以下是代码参考v文件。。。

回帖(9)

meng19901003

2015-3-16 17:14:53
学习学习。。。。。
举报

唐建

2015-3-17 13:49:53
学习学习,规范什么的肯定要遵守
举报

mgaoitit

2015-4-1 22:45:51
新手学习学习~~
举报

09313222

2015-4-24 09:36:32
学习学习。。。。。。。。。。。。。
举报

zywplc

2015-6-8 08:52:24
谢谢分享                                                                        
举报

wjh_yw

2015-6-16 10:57:36
学习学习,谢谢分享!
举报

草上飞的

2016-12-8 15:26:13
学习学习,规范什么的肯定要遵守
举报

贾志坤

2017-2-13 09:16:57
谢谢分享
举报

蔡银森

2017-2-27 21:53:53
最近在学fpga,正好来学习一下
举报

更多回帖

发帖
×
20
完善资料,
赚取积分