1. 小谈匠说一说概述
小谈匠今天来说一说FPGA逻辑开发的注意事项,逻辑编码规范和数据流接口。FPGA逻辑开发是面向硬件编程,底层是大量的可编程资源,比如查找表,时钟综合器,IO单元,块RAM存储器,寄存器位等。从逻辑编码的可视性和可维护性出发,要注意分散和集中双原则。
FPGA芯片经常拿来做接口粘合,比如在数据通信领域主打就是高效的数据流处理。
2. FPGA逻辑编码规范点滴三则
(1) 逻辑代码摆布的分散和集中
逻辑代码就是我们在硬件世界表达的语言具象。Verilog语言和system verilog语言的代码风格不同,和VHDL语言的代码风格也不同。但是大量复杂代码的编写,犹如写一本书,要区分成若干章节,有核心章节,甚至书中有旁边。对于一个完整的硬件逻辑系统,也是区分成多个功能部件,有小核心组件,也有分系统组件,并且需要时钟、复位网络和逻辑模块接口将所有功能部件互联,将功能部件激励运转起来。逻辑代码的划分要依照从上到下的原则,从通用到专用的原则,将逻辑代码区分开来,分别存储和运维。这就是分散的操作。
分散原则体现到一个逻辑文件来说,就是一个逻辑文件尽可能完成一个功能,不要复杂化;将代码代码区分成输入环节,处理环节,输出环节,区分成信号、参数定义区和逻辑功能实现区,区分成主题功能区和运维仿真区。分散的好处是为了聚焦,关注当前功能逻辑代码,甚至是当前的一行逻辑代码。上面说的分散也不是胡乱随意的摆布,想到哪里,就写哪里的逻辑代码。需要对代码进行约束,将若干代码集中起来,形成有意义的区域。
我们熟知的一段式状态机和三段式状态机就是典型的分散和集中原则应用。一段式状态机是完整的集中,三段式状态机是分散前提下的有意义的集中。三段式状态机不是说只有数量含义的三段代码,而是分开成了三个区分意义的逻辑部分。
(2) 逻辑代码的注释要丰富和正确
逻辑代码是底层的语言表达,具有抽象性和离散性,需要注释进行原理说明,时序说明,显著提高逻辑代码的可维护性和价值性。逻辑代码相比,不是看深奥,而是看简明。注释的价值前提是正确。错误的注释不但无价值,还是负作用。
逻辑代码的注释可以分成文件头说明,代码区分割和说明,关键代码行的原理和时序说明。文件头说明,要描述清楚逻辑文件的所属,功能,接口时序,使用限制条件,版本更新内容说明灯。代码区分割和说明,是不同代码区的分割线和功能说明。关键代码行的原理和时序说明,对于复杂的逻辑处理说明是很有必要的,方便后续代码的运维使用。
(3) 逻辑代码要和硬件资源相呼应
逻辑代码最终是要适配映射到FPGA芯片的硬件组成单元上。所以,编写逻辑代码是要注意是否方便对应芯片硬件单元。比如case选择器,低规格的FPGA芯片方便支持4选一和8选一,高规格的FPGA芯片能够方便支持16选一,而不用拆分成2个8选一和1个2选一。
块存储资源有intel fpga 的M10K, M20K, amd fpga的M36K/18K,并且有最小使用深度的限制。存储数据时要根据需要拆分成不同深度和宽度的BRAM。
3. FPGA逻辑数据流接口“顺丰车”
在数据内容交互和流转方面,fpga内部方便使用数据流接口,即流式接口,方便模块间互联,减少数据处理时延。
Fpga逻辑数据流接口使用零延迟握手方式,最能减少数据处理时延。若是需要改善时序,则可以插入流式接口pipeline。
FPGA逻辑数据流接口的基本组成包含vld(valid),rdy(ready),sop,eop,dat,empty,chnl(channel),error,sbd(sideband)等内容。实现时,可以基于systemverilog语言的interface构建方便的互联接口。特别针对sbd(sideband)边带信号最好定义成结构体形式,方便调整扩展和引用具体的不同信息说明字段。Sbd(sideband)边带信号的内容最好对应整个报文传输过程是不变的。对于特定字段的有效性,要给出说明。对于多比特的error信号也定义成结构体形式,方便获取比特位的具体含义。下图的示例是一个参数化的接口。这里的error信号和sbd(sideband)信号仍是多比特数组形式。
图 avalon stream packet 接口示例