【精品博文】失控----FPGA去中心化设计 <三>
看了莫老师的回复,有必要写一篇来介绍NoC的network实现的方式,也就是第一篇中的箭头连线代表的是什么,虽然很复杂,很难讲清楚。
现在先抛开SOC EOC NOC,这些词,可能我对这些专业词汇的理解和其他人的不一样,这都是表象,并不是那么重要,只是名字而已。
先来一个最简单的Net图
S2M,M2S 为总线Bus的interconnect,这个只是2个master和2个slaver的互联,第一篇中的箭头,就是对应上图的红色箭头。
Network设计其中一个关键问题是:复杂度的增加,并不是master slaver 简单的copy.请看下图
BUS NET并不是扁平化的,它是可以延伸到底层模块的,如果只是扁平化完全可以用一个interconnect实现,像SOC的方式。这个还只是简单的,这里模块内不是全功能的子网络,再看下图
上图可以算个工程BUS NET 的样子了,这也是我没有在前两篇文章中把完整的BUS NET 画出来的原因,BUS NET 本身要比Modules 图复杂得多,
但是,但是,但是(重要的事情说三遍),上面说的还只是NET BUS 内容的一半。BUS NET中还需要其他东西!!!
1、 数据位宽转换,比如spi的只是8bit,VDMA的是32bit,就需要位宽转换(还要处理非整数倍情况 24-> 32,)。
2 、跨时钟域,这个反而是在BUS里面最简单的
3 、stream bus 的截断 补齐,比如 ethernet有最长 最短包限制。有时DDR的一次burst也是大于128bits的数据
4 、协议转换,AXIS转AXI4 ,AXI转avalone 等等
-----------------------------------------------------------------------------------------------------------
本里接下来应该是讲Net细节的实现的(S2M,M2S等怎么设计),这个真不好讲,我设计这套东西就花了小半年,以前有人问我VDMA怎么做,我说,这个很难讲清楚,因为这个不是一个模块,而已一个系统。NOC EOC的 Net也是,他不是一个模块,而是一个系统,还是一个大的系统!
只能稍微的摘最简单的说说:
1 、BUS 最简单的形式是:valid,ready,data这三个信号。复杂的bus ,比如 AMBA,AXI,AVALONE,这些都是建立在这最基础的三个信号上。
2 、超短FIFO(depth小于4 ,别以为超短fifo没有,bus 里面短fifo很常见),且必须是跨时钟的,和“first word fall through”(参考xilinx fifo参数设计,当然也可以直接用ip,但是没写过这个fifo,就不能对bus有深入的了解)。别以为看了网上的那篇异步FIFO设计,就能写出“first word fall through”的fifo,FIFO不是只有格雷码。
3 、data pipe,模块要求很简单,valid ,ready,data,进模块然后出去,(1)不能直连(2)每个输出的信号必须经reg,不能组合逻辑输出。这个模块是S2M,M2S的基本。
也有几点需要注意的:
1 、模块并不需要全部reg时序输出,有些可以组合逻辑输出(data pipe 除外),如果这条规则不打破,基本写不出 S2M,M2S。不要担心时序问题,一般2-3个输入的组合逻辑根本不会产出问题。
2 、只能用systemverilog设计,这个倒不是verilog vhdl做不出,如果我的工程是用verilog来做,那么代码里面80%以上都是关于BUS的信号定义,和port例化,会相当难看,sv支持数组port 和interface,可以省很多很多代码。
最后说一下我为什么不用xilinx 官方的interconnect S2M M2S IP
1 、AXI4的 有些信号我根本用不到,比如优先级,我只需要轻量的bus,有些BUS 我会加入自己定义的信号,比如axi lite 我会加入 awlock arlock。
2 、资源占用太多,axi stream 8_to_1 (M2S) 的interconnect 需要450个LUT,我的只需要小于50LUT。
3 、XilinX的是黑核,另一侧面说明interconnect还是很有技术含量的
4 、因为sv,xilinx的ip使用的是verilog或vhdl会占用代码行。