Verilog小学生
除了资源共享和流水线,系统级优化确实能带来更大收益。一个核心思路是‘时间换面积’,这在数据通路里很常见。比如,你有一个需要处理N个通道数据的模块,如果资源允许,可以并行实例化N个处理单元,但面积大。系统级做法是,只实例化一个处理单元,但让它在时间上复用,通过一个调度器,分时处理这N个通道的数据。这需要设计一个高效的数据缓冲和流控机制,比如用FIFO缓存各通道数据,处理单元轮流从各FIFO取数运算。这样面积几乎降为原来的1/N,但吞吐率会受影响,需要根据系统延迟要求来权衡。
另一个层面是算法近似或降级。在一些图像或信号处理中,不一定需要全精度计算。比如,把乘法器系数从16位降到12位,或者用查找表加线性插值来近似复杂函数,而不是用CORDIC这类迭代单元,能省不少DSP和LUT。
模块划分上,要刻意设计‘参数化’和‘可配置’的模块。比如,设计一个支持不同数据位宽、不同通道数的通用滤波模块,用参数控制生成。在顶层根据实际需求例化,避免为每个小变种都写一个专用模块,减少重复设计。同时,模块接口尽量设计成流式(如AXI-Stream),便于拼接和复用,减少胶合逻辑。
选用IP核时,比如Xilinx的FIR Compiler,不要直接拉满最高性能配置。仔细看选项:是否需要用对称系数优化来减少乘法器?是否可以选分布式算术而不是用DSP块?系统时钟如果够高,是否能用单个高速DSP核分时处理多路数据?这些配置选项对面积影响巨大。
最后,一个容易忽略的系统策略是‘存储器重组’。FPGA的Block RAM资源是有限的,但也是面积大户。如果设计里有很多小容量、分散的RAM,可以考虑合并成一个大RAM,通过地址映射来访问,能节省BRAM的控制逻辑和碎片。反过来,如果一个大RAM的读写端口很多,导致使用大量多端口RAM(面积开销大),可以考虑用双端口RAM加仲裁逻辑,在时间上复用端口。
总之,系统级优化要跳出一个模块的内部,从数据流、控制流、资源调度、算法近似和IP配置这些更高维度去思考,目标是用最少的硬件资源满足系统性能指标。面试时如果能结合一个具体项目,比如‘我在做多通道传感器融合时,用单计算核分时复用处理8个通道,节省了7个乘法器阵列’,会非常加分。
