完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这是参考一篇《 海思高校合作——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文件。。。
|
|
相关推荐
|
|
学习学习。。。。。
|
|
|
|
|
|
1476 浏览 1 评论
1266 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
1471 浏览 0 评论
920 浏览 0 评论
2272 浏览 0 评论
1447 浏览 35 评论
5631 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 05:48 , Processed in 0.634742 second(s), Total 56, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号