Amiya · 2021年06月07日

ARM系列 -- 中断(二)

家勤则兴,人勤则健。

-- 曾国藩

开始之前,先声明一下,ARM系列的全部文章都参考的是公开文档。如果大家有需要,可以去ARM的官方网站下载。我手里没有任何非公开的文档。

闲话少说,今天开始扒GIC-600。

为了适应大规模的SoC设计,GIC-600被设计成分布式IP。所谓分布式,GIC-600由几种组件构成,每个组件可以跟其它相关模块在物理设计上摆放在一起,并与其拥有共同的电源域;组件之间通过片上网络(network on chip,简称NoC)通信,从而达到更好的时序。

GIC-600的重要组件包括以下几种:

  • Distributor:GIC-600的核心部件,负责与其它组件通信,主要处理SPI和LPI
  • Redistributor:与cluster或core交互,主要处理PPI和SGI
  • ITS(Interrupt Translation Service):处理基于消息的中断,用于解析LPI
  • SPI collator:顾名思义,收集整理SPI
  • Wake request:产生wake\_request给core

在具体介绍每个组件之前,我们有必要先来研究一下这些组件之间是如何连接的。主要有两种方式,第一种是利用片上网络,比如CMN-600这样的IP;第二种是私有的桥接。

WeChat Image_20210607103846.jpg
图1  利用NoC连接GIC-600的组件

第一种方法,适合大规模的物理设计,尤其是全局时钟方案复杂的SoC。比如有很多的cluster,一般而言,一个redistributor对应一个cluster,这样redistributor可以和cluster一起做布局布线,redistributor和cluster之间的通信可以保持在一个比较高的频率,且timing容易实现。同样,对于有很多PCIe控制器的设计,ITS可以和PCIe控制器放在一起,实现LPI。对于SPI来说,一般多是给低速的外设准备的,所以SPI collator可以和distributor放在一起。

Wake request组件的主要作用就是可以产生唤醒信号给core,如果SoC设计中没有做关于core功耗方面的设计,这个组件可以不需要;如果有功耗控制的需求,这些唤醒信号要给SCP(system control processor)或者相关的模块,再做进一步的设计,具体取决于设计需要了。

WeChat Image_20210607103857.jpg
图2  利用私有桥接连接GIC-600的组件

第二种方法,适合规模较小的,全局时钟方案简单的SoC,GIC-600的组件不依赖于片上网络(因为没有可用接口,比如NIC等)。这种方法的弊端是,组件之间的走线可能会非常长,并且可能需要在别的IP中穿行。好处是,不占用任何NoC的带宽。

接下来看看每个组件。首先是distributor,一个SoC只有一个。其它的组件只能与distributor通信。所以,可以看出,distributor是GIC-600中的核心,其作用是收集所有的中断,并转发给相应的目标core。

WeChat Image_20210607103951.jpg
图3  GIC-600 distributor和SPI collator

对于core来说,可以通过上图中的ACE-Lite slave接口访问GIC-600中除去GITS\_TRANSLATER的所有寄存器。由于为了实现LPI,GIC-600的distributor要维护几张表,且这些表格保存在内存中,所以需要一个master接口去访存。在上图中,对应的是ACE-Lite master总线接口。Distributor还包含三组AXI4-Stream接口,分别用于redistributor,ITS和其它distributor(比如多路服务器)的通信。至于Q-channel,不知道大家还记得多少,《SoC设计之功耗 -- Q channel》,在这里主要是为了做时钟管理。

SPI collator对外的接口比较简单,输入SPIs,是来自外设的中断线。在GIC-600中,SPI数目是32的整数倍,目前最多支持960。输出SPI\_r,是经过时钟同步的SPI信号,如果需要,可以送给发出SPI的外设。

Wake request模块是配合SoC功耗管理用的,如果需要实现core的idle状态管理,或者powergating,在distributor把中断发给目标core之前必须唤醒该core。所以唤醒信号是每个core一个。功耗管理取决于具体的设计,可以参考前面的文章,《ARM系列 -- PCSA(二)》。

简单介绍完distributor,需要再讲讲AXI4-Stream总线。

WeChat Image_20210607104024.jpg
图4  AMBA演进

在AXI4-Stream中,去掉了地址项,允许无限制的数据突发传输规模。正如spec中所说,这个总线是用于master和slave之间交换数据用的。接口信号比较简单,如下图:

WeChat Image_20210607104042.jpg
图5  AXI4-Stream接口信号列表

大部分信号和AXI类似,ACLK和ARESETn信号,不必多说。TREADY和TVALID是mater和salve的握手信号,slave可以通过TREADY反压master的数据传送。需要注意的是TDEST和TID,TDEST提供数据流的路由信息,也就是说一个master可以接几个slave设备。TID提供数据流的标识,意味着master可以给slave交叉发送不同数据流。

如果两个设备要实现双向传输,就需要互为master和slave。拿GIC-600来说,一个SoC中只有一个distributor,同时可以有若干redistributor,但是redistributor只与distributor通信,且需要双向传输。也就是说distributor能看到多个redistributor,而一个redistributor只能看到distributor。Distributor可以通过TDEST把数据路由给相对应的redistributor,并且通过redistributor发过来的TID以区分不同的redistributor。

TDATA数据流包含三种类型:data、position、null。data是数据;position作为占位符使用,可以用来表征data的相对位置,null不包含任何有用的信息。数据流的结构可以有很多种,比如可以只传数据;也可以将数据和null或position混合传输。

WeChat Image_20210607104054.jpg
图6  连续且对齐的数据流

WeChat Image_20210607104106.jpg
图7 连续不对齐的数据流

WeChat Image_20210607104118.jpg
图8  byte数据流

ACE-Lite总线就复杂多了,不是一两篇短文能说清楚的,留在以后吧。

作者:老秦谈芯
来源:https://mp.weixin.qq.com/s/hCYTiD\_QJ9d1bSBXtAQXxA
作者微信公众号
qrcode_LaoQinTanXin_1.jpg

相关文章推荐

欢迎大家点赞留言,更多Arm技术文章动态请关注极术社区Arm技术专栏
推荐阅读
关注数
23565
内容数
1017
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息