发新话题
打印

编码风格 --- 编写风格

编码风格 --- 编写风格

1. 代码要表格化,便于阅读 2. 代码用空格对齐,用空格代替tab 3. 一行一个表达式 4.每行写一个端口申明 5. 端口申明的顺序要和模块申明时保持一致 6. 内部的线必须显示申明, 最好在端口申明后一起做申明 7. 一行不要超过80个字符 8.没有特殊必要,不同的时钟要放在不同的模块 9. 不能有组合的环路 10.所有的寄存器都需要初始化
With your idea, Carry out together.

TOP

一个好字了得!还有其他的没?
活着真好!

TOP

a.设计要参数化。比如一开始的设计时钟周期是30ns,复位周期是5个时钟周期,我 们可以这么写:       parameter CLK_PERIOD = 30;       parameter RST_MUL_TIME = 5;       parameter RST_TIME = RST_MUL_TIME * CLK_PERIOD;       ...       rst_n = 1'b0;       # RST_TIME rst_n = 1'b1;       ...       # CLK_PERIOD/2 clk <= ~clk;   如果在另一个设计中的时钟是40ns,复位周期不变,我们只需对CLK_PERIOD进行重 新例化就行了,从而使得代码更加易于重用。   b.信号命名要规范化。   1) 信号名一律小写,参数用大写。   2) 对于低电平有效的信号结尾要用_n标记,如rst_n。   3) 端口信号排列要统一,一个信号只占一行,最好按输入输出及从哪个模块来到哪 个模块去的关系排列,这样在后期仿真验证找错时后 方便很多。如:     module a(           //input           clk,           rst_n,   //globle signal           wren,           rden,           avalon_din, //related to avalon bus           sdi,       //related to serial port input           //output           data_ready,           avalon_dout, //related to avalon bus           ...         );     4) 一个模块尽量只用一个时钟,这里的一个模块是指一个module或者是一个en tity。在多时钟域的设计中涉及到跨时钟域的设计中最好有专门一个模块做时钟域的隔 离。这样做可以让综合器综合出更优的结果。     5) 尽量在底层模块上做逻辑,在高层尽量做例化,顶层模块只能做例化,禁止 出现任何胶连逻辑(glue logic),哪怕仅仅是对某个信号取反。理由同上。     6) 在FPGA的设计上禁止用纯组合逻辑产生latch,带D触发器的latch的是允许的 ,比如配置寄存器就是这种类型。     7) 一般来说,进入FPGA的信号必须先同步,以提高系统工作频率(板级)。     所有模块的输出都要寄存器化,以提高工作频率,这对设计做到时序收敛也 是极有好处的。     9) 除非是低功耗设计,不然不要用门控时钟--这会增加设计的不稳定性,在要 用到门控时钟的地方,也要将门控信号用时钟的下降沿 打一拍再输出与时钟相与。           clk_gate_en     --------             ----         -----------------|D   Q |------------------|   \ gate_clk _out                     |     |       ---------|     )-------- -                 ------o|>     |       |     |   /           clk   |     --------       |       ----         ------------------------------------     10)禁止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的方式 ,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分析的 复杂性。如FPGA的输入时钟是25M的,现在系统内部要通过RS232与PC通信,要以rs232_ 1xclk的速率发送数据。     不要这样做:     always (posedge rs232_1xclk or negedge rst_n)     begin         ...     end     而要这样做:     always (posedge clk_25m or negedge rst_n)     begin         ...         else if ( rs232_1xclk == 1'b1 )         ...     end     11)状态机要写成3段式的(这是最标准的写法),即       ...       always @(posedge clk or negedge rst_n)       ...         current_state <= next_state;       ...       always @ (current_state ...)       ...       case(current_state)           ...           s1:             if ...             next_state = s2;           ...       ...       always @(posedge clk or negedge rst_n)       ...         else           a <= 1'b0;           c <= 1'b0;           c <= 1'b0;         //赋默认值           case(current_state)               s1:                 a <= 1'b0;   //由于上面赋了默认值,这里就不用再对b 、c赋值了(b、c在该状态为0,不会产生锁存器,下同)               s2:                 b <= 1'b1;               s3:                 c <= 1'b1;               default:               ...     ...
http://likunarmstrong.bokee.com/

TOP

不错啊,支持原创啊,经验重要

TOP

今天第一次来这个站,越来越喜欢了。感觉很实在,很多都是经验的积累,虽然我也有,但是一直没有时间整理处理。等手头的项目结束了整理出来和大家分享
从苏州到上海,从日文到英文,从单片机到视频,从潜水到灌水,从......

TOP

提示: 作者被禁止或删除 内容自动屏蔽

TOP

发新话题