(转帖)写verilog代码的一些经验和小结(Verilog)
原创地址:http://www.openhw.org/ares10/blog/08-03/146788_f57e9.html
下面是自己写verilog代码的一些经验和小结,和大家分享下。
1、对于高速的逻辑操作(如:判断,取反等),为了保证逻辑正确和结果的稳定(不抖动),需要用 always的 case语句来实现,而不要使用 if…else…,或者assign 语句的()?… :…形式。也即,对于高速数据的判断选择性操作,用case比用if…else…可以满足更高的时钟要求,但占用较多的slice;同一种逻辑操作,用同步赋值语句always比用assign可以满足更高的时钟要求。所需要的代价就是需要多增加一些触发器,因为只有触发器可以用 always赋值。
2、时钟周期约束使用最多的一种约束,增加时钟约束可以提高芯片的时钟速率。增加约束后,综合、布局、布线,查看place and route报告。如果报告中约束不满足,则需要改动程序使其满足时钟约束;如果约束满足了,后仿结果还可能不正确,还需要进一步调整时序。
3、对于加减操作,最好使用IP CORE的加法器。相比直接使用符号”+”或“-”,IP CORE可以在资源相同的情况下,达到更高的速率。
4、后仿时,为了观察程序模块中的内部信号(出去模块的输入和输出),需要将内部信号也通过模块的输出引出。当引出的内部信号过多时(FPGA的输入输出管脚数量是有限的),约束将更加难以满足,后仿可能会出现一些不可预料的问题。所以不要引出过多的内部信号。
5、采用流水线操作可以大大提高系统时钟,也即将复杂的操作分成许多简单操作级联的形式,这样每级简单操作都可以达到较高速率。代价就是用资源去换速度(每级流水线都需要额外的reg型变量),同时有一个固定的初始时延。
6、一般不要同时使用上升沿触发和下降沿触发,这样会降低系统稳定工作的时钟速率。
7、不可以在一个always模块的敏感变量区同时使用沿触发和电平触发。
8、用ram(block ram或distributed ram)存储比用触发器存储节约slice资源。
有不准确的地方还请大家指正。