经验之谈
- 模块之间松耦合。意思就是模块与模块之间不能有互相有控制关系的信号,比如A模块的a信号控制B模块内部的b信号,这样一旦a信号修改逻辑,B模块内部的b信号逻辑就同样会变动,不利于版本迭代维护,且出bug概率较大。最好的做法为A与B模块间只传递数据,debug时只需debug他们之间的数据是否有误即可。
- 每个模块只做一件事。意思就是每个模块实现的功能尽可能单一,这样就不会有很多逻辑缠绕在一起,这样一方面容易debug,一方面也容易避免bug,并且思路清晰利于阅读和维护。
- 对某个信号的控制尽可能简单。意思就是不要用很多其他的信号对某个信号进行约束,尽可能想更好的方法。若没办法那就把该信号的控制拆成几个信号分级控制,不要写在一个always块内部。这样时序会优化,且组合逻辑资源也会优化,而寄存器资源几乎不会增加多少。
- 若资源充足的情况下,应尽可能用时序逻辑以提高最大运行频率,改善时序。
- 避免长if、else。长if、else会导致关键路径变长,最大运行频率降低,可想方法用case代替。
- case内部不要再嵌套if、else,尤其是较大的case,因为这样的逻辑所占用的资源是成倍增加的,在资源紧张的平台上,这样做是非常浪费资源的。可以有选择地先将条件提取出来,分类弄成小case。
- 有经验的,写一个模块之前可以预先想好每个信号的时序逻辑,然后才开始动笔,对于时延较多的模块来说可以避免后续去凑时序。
- 第一次做好。写verilog代码最忌讳返工,第一次就要划分好每个模块,并且每个模块间无耦合,每个模块写好就不要轻易去改动,一旦返工逻辑需要重新理顺,时序也需要重新纠正。
- 最后一点,尽可能想到一个简单的方案,尽可能减少你的代码量,代码量越少,越不容易出错,越容易维护和debug,越体现一个工程师的水平。
- 其他的都是老生常谈的,网上一大堆,这里就不做赘述了。