学习FPGA逻辑设计的一些注意事项
我看过很多初学者发给我的代码,也帮助他们debug。我发现这些代码问题都比较严重,先总结比较突出的几点,做理论上的描述,然后下一章我会仔细跟大家分析这些代码的错误之处。
1, Coding Style。
a) Coding Style的重要性怎么强调都不为过,好的Coding Style可以极大的避免一些低级错误的出现。从而极大的减轻Debug的压力和测试的难度。
b) 好的Coding style可以避免常见的错误如:多驱动源,Latch,仿真结果与电路结果不一致。
c) 好的Coding style可以优化电路的性能如:电路最高速度,占用资源数量。
d) 当然,上面只是简单的描述,好的Coding style是可以极大的节省开发时间,减少Bug的数量的。
e) 那怎么样的Coding style才是好的Coding style,可以说,不同的公司因为文化的不一样会有不一样的要求,但是有些基本的是相同的,如:
i. 同步设计。
ii. 组合时序分开。
iii. 不允许出现不能综合的符号。
iv. 寄存器输出。
v. 不允许Latch,不允许组合循环。
vi. Case嵌套不超过2层,if else嵌套不超过3层。
vii. 命名规则。
viii. 空行规则。
ix. Clock使用规则。
x. 复位信号使用规则。
xi. …
f) 当然,上面只是简单的描述,以后我们会详细的阐述Coding Style规则,现在说的再多,也是枉然,没有实践,很快就会忘记的。也可以参考红芯电子的例程,代码的Coding style是非常不错的。
2, 同步设计。
这个问题在初学者中尤为严重,原因也很简单,在网络上Down的代码里面,基本上就是这样写的,很多人有样学样,这个是绝对不可取的。
a) 同步设计我们设计电路的基本规则之一,理由很简单,现在的EDA工具基本上无法支持异步电路的分析,也就是说,综合工具帮你分析的电路能跑多快,异步的话就是错误的,在低速的时候表现不出来,但是如果高速的话,这种Bug是极难找到的。
b) 什么叫同步设计,就是所有的寄存器都在同一个clock的控制下变化,从表现来说,就是有寄存器的敏感列表都是(posedge SYSCLK or negedge RST_B),如果在其他的信号的上升沿作为敏感列表,就是非通不了。
c) 很多人要问,按照(posedge SYSCLK or negedge RST_B)这个写法,那么RST_B信号不就是异步的一个信号了,确实是的,但是为什么还要这样写呢?原因也很简单,异步Reset的DFF的资源消耗比同步的小很多,而且Reset信号会在top module里面进行一次同步。
d) 那么有些时候,我们一个设计当中,需要不同的clock,比如有些专用电路的clock频率是固定的,这个时候就会有2个,3个甚至更多时钟。这个就是跨时钟域的设计了,跨时钟域设计的时候,不同时钟域之间的信号,如果是单根控制信号,可以用单稳态触发器,如果是数据,建议用FIFO。但是单个时钟域里面还是同步的。
e) 如果你仔细阅读过红芯电子的例程,你就会发现,红芯电子的例程,无论是外围接口还是算法模块,全部都是同步的。这个绝不是网络上down的代码可以比拟的。