参考:http://www.mamicode.com/info-detail-2032670.html
allocate的理解,就是先让cache分配一个块,然后把write(CPU写)或read(CPU读)的date放进去
1.CPU读Cache时:
●若hit,则CPU直接从Cache中读取数据即可。
●若miss,有两种处理方式:
>Read through,即直接从内存中读取数据;
>Read allocate,先把数据读取到Cache中,再从Cache中读数据。
2.CPU写Cache时:
●若hit,有两种处理方式:
>Write through:把数据同时写到Cache和内存中;
>Write back:先把数据写到Cache中,再通过flush方式写入到内存中。
●若miss,有两种处理方式:
>Write allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush方式写入到内存中;
>No write allocate:直接把要写的数据写入到内存中。
关于transaction 的及时可见:
对于write transaction,且是bufferable,可以在中间节点返回response,但是需要保持可见,什么叫做可见?即其他master事务发起的事务,在传输过程中能够看到该数据,即中间节点有一个地址比对的操作,若读地址和写地址相同,则可以直接在该节点读取相应的数据。
为什么同一个master需要发起多个ID的transaction?因为outstanding的能力,可以一次性发送多个事务请求,但是其中有些事务需要保持顺序,如何实现在发出多个事务后保证它们的顺序呢?使用transaction ID
http://bbs.eetop.cn/thread-614159-1-1.html
为了提高总线数据传输带宽和利用率,AXI协议中masters可以outstanding传输,那么当多笔传输发生时,就需要保证每一笔都能按照预期的顺序来完成操作。AXI中当发生如下情况时,AXI必须做到保证先后顺序,即先发送的必须先到达目的地(device or memory),也先完成。
1、同时进行访问memory空间的多笔传输的地址(address)一样或有重叠(overlap);
2、访问同一个peripheral device空间时。
想象一下,如果多笔传输的memory读,不按照顺序来进行,可以后续发的读请求读到之前的数据,而先发送的读请求读到之后的数据,造成数据紊乱;对于peripheral device空间必须全部保序,不管地址,是因为device空间是带有额外属性的,即对device空间的读写操作,可能会影响该空间其他地址的数据变化,因此需要严格保序,否则数据一致性难以保证。
AXI通过何种方式来告知各个component是否是需要保证的transactions呢?答:通过ID号,即相同的ID号需要做到保序。另外:保序只是针对同一个master来说,多个master之间传输的保序无法保证,可以通过软件来保证。
AXI保序要求所有相同方向且带有相同ID的transactions必须按顺序返回response,顺序就是他们发送的顺序。由于读通道和写通道是两个不同的方向,如果两个不同方向的transactions带有相同的ID需要保序,master必须接收到第一笔transaction的response信号后,才能发送第二笔transaction。如果不遵循这个约束,保序无法得到保证。
https://blog.csdn.net/W1Z1Q/article/details/100068720
http://blog.sina.com.cn/s/blog_8367f7e30102ykvc.html
AXI中的memory attribute属性,由AxCache信号来指定,0-3bit分别代表Bufferable,Cacheable,Read Allocate,Write Allocate。
AxCache[0],Bufferable,只针对写操作,表示interconnect,或者其他类似component,可以先返回resp,之后再
写向final distination。
AxCache[1],1) 与RA,WA配合,控制cache;
2) 表示transaction的属性,可以在中间被更改,对于write操作,很多的write操作可以进行merge。
对于read操作,表示该地址可以被prefetch。
AxCache[2],Read之后更新到cache line中。
AxCache[3],Write的时候,cache line中也保存最新的值
挺好的参考 https://developer.aliyun.com/article/740316
https://blog.csdn.net/better_xiaoxuan/article/details/78836737?utm_source=distribute.pc_relevant.none-task-blog-baidujs-3
AXI支持Out-of-Order的completion和Outstanding的issue,从而提升了效率。
Master 不必等待命令执行结束就可以发送下一命令
(例如,master发送多个读请求到不同的slaver,每个slaver的反应时间不一样,这样就不需要等一个慢的slaver返回数据后,才能发起下一次读操作)
对于同一端口相同ID的指令,必须要顺序完成;对于同一端口不同ID的指令,可以乱序完成;对于不同端口不同ID的指令,可以乱序完成。
(这个乱序,多指slaver返回数据是,例如master发起了多个读请求,slaver反应时间不一样,这样可以让反应快的slaver提前将数据传递回master,而不必等待其他slaver完成后才能返回数据)“out of order”技术保证响应较快的存储区域不必等待响应较慢的存储区域,降低了交易延时,从而提高了系统性能表现。
若master与interconnect相连,interconnect会针对不同端口发送的ARID,AWID, WID扩展ID(AXI4没有WID)。
注意死锁的情况。比如Master1先发送给Slave1,再发送给Slave2,ID号相同;Master2先发送给Slave2,再发送给Slave1,ID号相同。经过interconnect扩展ID号后,对于Slave1来说,他收到两个不同ID号的命令,分别来自Master1和Master2。若他先返回给Mater2的数据,由于Master2要求先收到来自Slave2的数据,就会造成死锁。
(所以对于同ID 的事务,master ,slaver ,interconnect 都需要保持顺序)
一个Master发出一个读写的request,中间要经过很多Buffer,最后才能送到memory。这些Buffer的添加是为了outstanding,timing,performance等。
Buffer有两种类型:一种FIFO结构,仅仅就是保存发送Request给下一级或者返回Response给上一级。还有一种Buffer,在接受了上一级的Request之后立刻给上一级回response,告诉上一级这个操作已经做完了,而实际上这个操作并没有发到下一级Buffer,更没有被送到memory。有的人可能就问,write的时候这样可以,read的时候则无法这么做。其实read一样有bufferable,如果此处buffer的write data channel有此read需要的数据,就可以直接返回,而不用去访问memory,如果没有,则要把Request发到下一级。
总之,所以的访问都要经过这些buffer,是否bufferable在于何时由谁回response,在于是否要把request送到最终的memory。
Cacheable:
Interconnect其实只是一个路由的功能,内部有buffer,但并没有cache。而是在这个访问从Master发起request到送到最终的memory这个过程中,可能会经过一些cache,cacheable代表了是不是要去这个cache中查找自己需要的数据。要不要更新cache。
你说的利用cache来提高性能,有些操作是要求绝对non-cacheable的,比如device 内部寄存器的访问,这些都是MMR(memory mapped register 存储器映射寄存器)。只能使用non-cachable。
AXI 五个channel所有的信号,可以是Master-Interconnect,也可以是Interconnect-Slave,也可以直接是Master-Slave。
outstanding 乱序与穿插
简单讲,如果没有outstanding,或者说outstanding能力为1,则AXI Master的行为如下:
读操作:读地址命令->等待读数据返回->读地址命令->等待读数据返回->读地址命令->等待读数据返回。。。。。
写操作:写地址命令->写数据->等待写响应返回->写地址命令->写数据->等待写响应返回。。。。。(如果支持out-of-order,对于AXI3,写命令和写数据不一定有先后顺序且ID顺序不一定相同,AXI4因为已经没有WID信号,所以写数据的顺序要和写地址的顺序一样)
而如果outstanding能力为N>1的话,则:
读操作:可以连续发N个读地址命令,这期间如果读数据没有返回,则需要需要等待读数据返回,如果有读数据返回,则返回了几个,那么仍然可以接着发几个。也就是说,“在路上” 的读命令(或者读数据)最多可以是N。多说一点,可以看出,如果数据返回得比较慢,那么IP需要等待,效率就会比较低,因此,为了提高效率,有必要提高outstanding能力,以弥补”路上“(总线)引入的延时。但是也不能无限制地发,有可能会引起总线拥塞,把其他IP给堵住。
写操作:可以连续发出N组写地址(写数据)命令,这期间如果写响应没有返回,则必须等待写响应返回才能接着发写地址(写数据)命令,如果有写响应返回,则返回了几个,那么仍然可以接着发几组。也就是说,“在路上” 的写响应最多可以是N。
out of order 和interleave
乱序和间插是两个完全不同的概念。笼统的说,乱序指的是burst这个粒度,而间插指的是beat这个粒度。
简单说了,乱序是salve返回master请求的out of order特性,但这个slave可以是广义上的,一般总线会完成这个功能;而间插(interleave)是指写数据,或是读返回数据,按找不同ID交织出现。比如:ID0 ID1 ID0 ID1….。乱序和间插都有深度,一般乱序深度比间插大的多。上面那个例子就是间插深度为2的情况。
exclusive 和lock
1. 首先,Lock在amba2.0中就有涉及,意思是,某个master 可以通过Lock 总线来实现独占。只有当该master完成传输后才释放出总线。这样的话,总线的效率会降低。 2. 相比Lock,AXI 中引入了exclusive操作,不需要将bus锁定给某个master。而是通过TAG ID以及slave 返回的response来判断当前的传输是否成功。过程如下:
1)mst 首先向slave的某个地址位置发起一个exclusive读操作。slave中的monitor会纪录下该mst的 ARID和 要访问的地址位置(返回EXOKEY)。
2)mst向同一地址区域发起一exclusive写操作。slave同样要记录该操作的mst的 AWID 和 要访问的地址位置。如果AWID==ARID && 该地址内容没有改变(没有 其他的mst访问过),这个写操作就是成功的。该地址就会更新,同时slv会返回EXOKEY. 否则,slv会返回OKEY.
由此看来,对于exclusive操作,总线其实允许其他mst同时来请求总线。比如,当其他mst要同时通过总线访问其他的slv时,上述2)就不满足,所以总线就不会被锁定
multiple transaction
1.transaction ID 能干什么?
对于一个master,如果需要一系列的transaction保持顺序执行,则给这些transaction配置相同的ID。如果对于接下来执行的事务没有顺序要求,则分配不同的ID,这样对于outstanding>1的连接,就可以提高带宽的使用效率。
2.对于读写事务/通道有没有什么保序要求?
对于访问地址重叠的事务,需要前一个事务完成后,后面的事务才能发起