AXI杂记
信号
如上图右边,分为两组五个通道,写相关三个通道,读相关两个通道
握手
使用valid和ready信号进行传输握手,提高可靠性,必要时进行反压
基本传输事务
AxADDR、AxLEN、AxSIZE、AxBURST四个信号描述基本传输
ID关系
原文https://zhuanlan.zhihu.com/p/149112312
outstanding
主机在当前传输事务完成前,就可以开始下个传输事务。
无outstanding时,事务1→响应1→事务2→响应2
有outstanding时,事务1→事务2→响应1→响应2
支持outstanding需要主机开辟一片缓存,其能力使用超前传输深度来衡量。
out of order
对于同一端口相同ID的事务,必须要顺序完成;对于同一端口不同ID的事务,可以乱序完成;对于不同端口不同ID的指令,可以乱序完成。(这个乱序,多指slaver返回数据是,例如master发起了多个读请求,slaver反应时间不一样,这样可以让反应快的slaver提前将数据传递回master,而不必等待其他slaver完成后才能返回数据)“out of order”技术保证响应较快的存储区域不必等待响应较慢的存储区域,降低了交易延时,从而提高了系统性能表现。
interleaving
存储属性
Axcache的四个bit主要从以下方面对齐访问做出规定
bufferable
对于一个SOC来说,主机通过总线访问某个从机,可能会经过多个buffer,比如intercoonect中处理乱序时可能就会有buffer对其重排序再返回主机。
是否bufferable主要在于response的返回。
有的buffer只有转发功能,将上一级的cmd转发给下一级,并将下一级response转发给上一级。有的buffer接收到上一级cmd,可以直接给其回复response,而实际上这个操作并没有到下一级。
cacheable
访问过程中,也可能会经过一些cache,cacheable代表了是不是要去cache中查找自己需要的数据和要不要更新cache。
读操作
read through:直接从内存中读
read allocate:先把数据读到cache,再从cache中读
写操作
hit
write through
write back
miss
write allocate:先写到cache再写到内存
No-write allocate:不写入cache,直接写到内存
锁定访问
原子操作用途
原文:https://www.cnblogs.com/yuandonghua/p/15665146.html
在多线程的操作系统中,都有一个获取线程锁的过程,这个锁是唯一的,一个线程抢到了其他线程就抢不到,如何实现这个功能呢?加入将内存的一个变量作为锁的标志,如果这个标志位0表示没有线程抢这个锁,如果为1表示某个线程抢到了这个锁。那么在抢锁之前先要看一下这个标志是否为0,如果为0表示锁是空闲的可以抢,为了表示抢到了这个锁,还得把这个变量置为1。这个抢锁的过程就至少需要有一读一写。但是在多线程操作的过程中,可能很多线程都在读取这个变量,都读到的值为0(读的时间还是比较长的,多核并发完全可以读多次),然后所有线程都写1,这样就造成了多个线程都得到了锁,与锁唯一的要求不合。也就是说通过软件手段是不能保证某个值被一个线程(Master)读取和写入的过程中没有被其他线程(Master)读取和写入。这就要求线程支持原子操作。
由于内存在使用过程中会出现ecc错误,需要刷新数据来纠正这些错误,操作系统通过内存巡检来完成刷新操作,内存巡检就是读取内存的值,通过ecc校验更正错误值,然后写入到内存,系统读取数据后,操作系统还是在正常运行的,内存上的程序很有可能把内部数据修改了,如果还是拿原来读取的数据ecc校验后写入就会冲掉程序保存的数据,这当然是不行的。这个时候内存巡检就要用到原子操作,巡检值使用exlusive方式读取内存,让这段内存记录在读取数据后内存数据有没有被改写过,如果被改写过,ecc校验后的数据使用exlusive方式写入的时候就会不成功,防止覆盖新的数据。巡检程序发现写入不成功就重新巡检这段内存,直到成功。
exclusive原子操作
Master_A以exclusive方式读取Salve的一段地址(以lane_cash为单位,一般为64byte)的值后,相当于Master通知slave监控这段地址的写,slave的一个moniter会纪录这个Master_A,如果Master_A在写入这个slave之前没有其他Master写过这个数据的话,Master_A往这段地址写入数据是会返回一个Exok即原子操作成功,指示数据正确写入;如果在Master_A写入数据之前有其他Master也往slave的这段地址写过数据,那么Master_A以exlusive写数据的操作会返回ok,这其实表示exclusive操作失败了,数据也被moniter阻挡没有写入到slave中。这样保证读写这一整个过程中,软件知道是不是只有一个线程(Master)在写这段地址(其他线程在这个过程可以读),也只有exlusive写返回Exok后才说明线程锁抢占成功,这样就只有一个线程能抢占成功。
是一种应用场景相关的操作,在多核CPU中,为了保证一个master对slave的访问操作不让其他master来访问,保证访问slave的数据不被其他master改写。有点像多线程中的线程锁。在AXI3.0的时候有normal access/exclusive access/locked access, 其中normal access是不进行任何干预的访问,exclusive则是slave端监控一下,在master访问期间有没有其他master访问过,如果访问过就给告警什么的,让master重新访问一遍。locked access这种模式在AXI 4.0取消了,即硬件锁定,其他master访问不了master到slave的总线,这种方式对性能影响很大,所以取消了。
其他
Axprot应该是配合指令集的工作模式,比如用户模式、机器模式,不同的模式有不同的权限
AxQos用于interconnect的仲裁器,代表不同master的优先级