上学时学点电的专业的都应该有学过总线这个东西,我提一个最简单的:两根线广播线,凡是挂入这两根广播线的设备都可以收、发电平信号,信号的规则就是这个总线的协议。比如MODBUS、CANBUS之类。类似我画的图这样:
这种简单的总线中,大家都是对等的,所有人的通讯都是跑上来踩这两条线。满足我对总线最朴素的想象。
翻车式拐弯:那么一个SOC上面的总线如AMBA家族的AXI系列,AXI扩展的ACE,CHI这些,大家都叫总线,它们的线也是把所有节点都用线连在一起的吗?只是,,,更多了几根?
很明显这只是我一个比较低智的疑问,在高速总线上,节点可能还会很多,还要高频,大家都来踩信号线,要想竞争握手抢到发言权都会是一场灾难,可能有些节点很久也抢不到一次;更不必说还要自己区分一段信号的目标是不是自己,不断地做信号解码分析的耗费也是十分巨大。
简单读一下AXI总线的规范,所有上总线的节点似乎都是想发就发,没有在总线上抢使用权,也没有尝试监听别的节点的信号来分析目标是不是自己。
所以,这中间隐藏着我一直没有注意的点,叫做总线互联结构,抽象一下,这是与两根线式总线中,那两根线处于一个层次的东西,就是一个总线结构中节点之间连接的方式。我举例几个说明一下:
1. 两根线式总线互联结构,就看开篇第一个图里面的两根走所有信号线就行了。
2. 星型总线互联结构,如下图。咦?看起来似乎有点像小时候学的互联网拓扑结构?对滴,差不多少。
3. 环形结构(ring结构) ,图很土,但是确实长这样。
4. 全连接结构简单的讲就是所有节点都能直达。
看到没有,各种乱七八糟的结构都可以是总线互联,那么问题就来了,除了2线式的总线,其他总线本质上都是些点对点传输的组合(不能做广播信号和全总线监听),也就是说,不是能够通过简单的直连金属导线能解决的,就如同互联网需要交换机一样,这需要总线中的所有节点都有一个类似交换机的东西。这个东西在SOC的总线中普遍叫做router,换句话说,这个总线是活的,它知道根据某种规则将一个节点发出的数据转到指定节点。说到这里应该已经把总线互联这个东西解释清楚了,它是一个能做总线中指定两点,做点对点传输的东西。这其实是总线协议背后的东西,有的结构叫crossbar(类似全连接),有的叫NOC(Network on chip,就是一种网,渔网见过吗,跟那差不多,手残懒得画),也有的叫ring(上面说的环形结构)。
对比着最简单的2线式总线,SOC上的总线已经大概说清楚了,这张总线是活的,其中有类似交换机的router,用来路由各个节点发出的数据,那么问题就来了:挑出ring总线来说,假设router转发一次数据需要1ns(纳秒,随意说的,跟实际soc无瓜葛),各个节点之间的通讯距离是不是一样的?我重新画一个节点多的ring结构:
这里面1-2节点之间的距离是1ns(1向2发送数据按照上面说的1router只需要1ns),1-4之间的距离无论经过2-3到4还是经过6-5到4都需要3ns,这就带来节点之间数据延迟不一致的问题。另外,1-4的数据很明显需要2-3或5-6的router来参与数据传输,而如果这时候2-3/5-6自己有数据要走,1-4的数据很明显是要被停滞的。换句话说,在总线互联中,各个router的数据传输压力是不相同的:如果1-3之间数据交互极其频繁的话,2节点就算没有数据传输也会很忙。进一步的,如果总线互联设计与数据负载不匹配,可能会出现其中的某个router过度繁忙造成总线数据带宽瓶颈;有人可能说采用全连接最好,谁也不干涉谁;确实是这样,crossbar是最快的总线互联结构,但是(重点),家里装修的时候还知道连线多了费电线(费钱)呢,soc中又何尝不是?
愚夫拙见,行文亦是不畅,看官须得且看且骂且吐槽之。
另外,对标题做一下回答:活的总线,也是总线;谁让人不另外起名呢~
本文用于自我科普,也不想去拉扯一些怎么设计合理呀~各种拓扑结合一起呀~2维结构不够用上3维呀。但是读者还是应该搜索一下这些拓扑,比如说麒麟、骁龙、联发科、苹果之类的soc,看一下他们总线互联是怎么做的,更甚至Intel多核间、各种主板、PCIe其实里面都是一些活的总线。