Verilog代码规范及FPGA编写经验

一、Verilog代码规范

1、赋初值

变量声明时不要对变量进行赋初值操作。赋初值操作应该在复位状态下完成,也建议寄存器变量都使用复位端,以保证系统上电或紊乱时,可以通过复位操作让系统恢复初始状态。建议设计时,时钟采用正边沿逻辑,复位采用负边沿逻辑,复位时语句块中所有的信号都应该赋予初值,不要漏掉相关信号。

2、关于 always 语句

(1)不到万不得已不要在 2 个 always 块中分别使用同一时钟的上升沿和下降沿逻辑,否则会引入相对复杂的时钟质量和时序约束的问题

(2)禁止在一个 always 块中同时将时钟的双边沿作为触发条件,编译、仿真可能会按照设计人员的思想进行,但此类电路往往不可综合,或综合后电路功能不会符合预期

(3)一个 always 块中不要存在多个并行或不相关的条件语句,使用多个 always 分别描述

3、关于时钟与异步

设计中尽量使用同步设计。必须要使用异步逻辑时,一定要对不同时钟域之间的信号进行同步处理,不能直接使用相关信号,否则会产生亚稳态电路。

4、关于综合

一般情况下信号变量不要直接使用乘法 *、除法 /、求余数 % 等操作。这些操作符被综合后,结构和时序往往不易控制。应该使用相关优化后的 ip 模块或工艺库中的集成模块。但是 parameter 类型的常量就可以使用此类操作符,因为在编译之初编译器就会计算出常量运算的结果,不会消耗多余的硬件资源。

5、关于例化

例化时,连接输入端的信号可以是 reg 型或 wire 型变量,连接输出端的信号一定是 wire 型变量。但是端口信号声明时,输入信号必须是 wire 型变量,输出信号可以是 reg 型或 wire 型变量。多个模块例化时,模块名字在前,例化名字在后,且例化名字不能相同。

二、一些重要原则

1、时序电路建模时,用非阻塞赋值

2、锁存器电路建模时,用非阻塞赋值

3、用always块写组合逻辑时,用阻塞赋值

4、在同一个always块中同时建立时序和组合逻辑电路时,用非阻塞赋值

5、在同一个always块中不要同时使用非阻塞赋值和阻塞赋值

6、不要再多个always块中为同一个变量赋值

#遵循以上原则,有助于正确的编写可综合硬件,并且可以消除90%~100%在仿真时可能产生的竞争冒险现象。

三、时序错误

连续使用组合逻辑可能会发生时序错误,这是因为数据路径过长,

解决方法:在长路径上添加寄存器进行数据缓冲。

1、高速数据处理少用组合逻辑,因为数据速率太快,容易产生竞争冒险。

2、高速数据流处理,先进行一次缓存,

3、对于高速数据处理,尽量使用非阻塞语句,因为连续阻塞语句的使用由于数据流过快,在真正实现的时候会引起时序错误,原本阻塞语句实现的是结果变得和非阻塞语句一样。

4、不能一步进行复杂的运算。


个人总结,可能会有错误。

猜你喜欢

转载自blog.csdn.net/QUACK_G/article/details/124574796