1. 代码中的逻辑运算符和算术运算符没有区分清楚,即便是对于做软件的来说,这也算是很低级的错误了,尽管大多数时候这样的混淆不会影响功能的实现,但还是要规范。
例如a = b || !c;
显然应该更改为a = b | ~c;
2. 代码中的有些时钟信号既非FPGA外部晶振输入的时钟信号,也非FPGA内部专用时钟管理单元(如PLL或者DLL)产生的时钟。严格来说,这些信号是不适合作为内部时钟使用的,尽管它可能会节约一些资源,降低一些功耗。一来这些信号不走全局时钟网络或经过特别优化,时钟网络延时势必很大,也不利于做时序约束;二来若这样的时钟钟控的信号存在跨时钟域处理的需要,那么就有潜在的读写冲突可能。门控时钟的使用总归是有利也有弊的,设计者应该权衡,如果后面说的两个问题都不存在(也许你要做的这个设计时序要求很低),那么但用无妨。
3. 不要为了分模块而分模块。分模块是为了更有利于设计分工、优化以及日后的代码维护、升级。如果有些逻辑的划分只是仅仅因为它们是一类相似的逻辑而分到一块,却不考虑数据流以及功能甚至优化的需要,那么这种模块划分方式也许只会得到是得其反的效果。
4. 对于复位的设计,有条件使用两级的寄存器进行“异步复位,同步释放”的处理比一级要来得可靠些。
5.为了更好的进行时序约束和分析,如果可能,需求分析或是设计说明中有必要体现所有和FPGA接口的信号的一些时序参数。如建立时间和保持时间,甚至是信号电平的上升时间、下降时间等参数,这对于设计者采用怎样的降低亚稳态的设计策略是有帮助的。