1.cache的读写
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:直接把要写的数据写入到内存中。
2.AXI的事务属性
关于transaction 的及时可见:
对于write transaction,且是bufferable,可以在中间节点返回response,但是需要保持可见,什么叫做可见?即其他master事务发起的事务,在传输过程中能够看到该数据,即中间节点有一个地址比对的操作,若读地址和写地址相同,则可以直接在该节点读取相应的数据。
为什么同一个master需要发起多个ID的transaction?因为outstanding的能力,可以一次性发送多个事务请求,但是其中有些事务需要保持顺序,如何实现在发出多个事务后保证它们的顺序呢?使用transaction ID
为了提高总线数据传输带宽和利用率,AXI协议中masters可以outstanding传输,那么当多笔传输发生时,就需要保证每一笔都能按照预期的顺序来完成操作。AXI中当发生如下情况时,AXI必须做到保证先后顺序,即先发送的必须先到达目的地(device or memory),也先完成。
1、同时进行访问memory空间的多笔传输的地址(address)一样或有重叠(overlap);
2、访问同一个peripheral device空间时。
对于peripheral device空间必须全部保序,不管地址,是因为device空间是带有额外属性的,即对device空间的读写操作,可能会影响该空间其他地址的数据变化,因此需要严格保序,否则数据一致性难以保证。
AXI通过何种方式来告知各个component是否是需要保证的transactions呢?答:通过ID号,即相同的ID号需要做到保序。另外:保序只是针对同一个master来说,多个master之间传输的保序无法保证,可以通过软件来保证。
AXI保序要求所有相同方向且带有相同ID的transactions必须按顺序返回response,顺序就是他们发送的顺序。由于读通道和写通道是两个不同的方向,如果两个不同方向的transactions带有相同的ID需要保序,master必须接收到第一笔transaction的response信号后,才能发送第二笔transaction。如果不遵循这个约束,保序无法得到保证。
3.AXI中的通道
AXI总共有五个数据传输channel,其中两个channel用来读,三个channel用来写。每个channel都有流控信号(valid-ready),发送数据端就给valid,接收数据端给ready,读数据和写数据通道都包括一个 LAST 信号,用来指明一个事务传输的最后一个数据。AXI 写通道有三个,传输写地址的通道、传输写数据的通道、传输response的通道。
写地址通道信号
所有的信号开头都是AW,代表Write的Address channel,传输地址信息和数据都是在 VALID 和 READY 同时为高时有效。
AWSIZE表示数据传输位宽,AWLEN用来burst写传输的长度,AWBURST表示burst传输类型,AWLOCK信号在最后一章原子操作详细介绍。
AWCACHE指示Cache是bufferable、cacheable、write-through或者write-back类型的。bit[0] Bufferable (B) bit、bit[1] Cacheable (C) bit、bit[2] Read Allocate (RA) bit、bit[3] Write Allocate (WA) bit。
bufferable:只针对写操作,可以提升传输效率。即使slave没准备好接收数据,总线也可以返回OKAY给master,把master传给slave的数据存入buffer,待slave准备好了再将buffer的数据传给slave。Write through:CPU写Cache时,若命中,则把数据同时写入Cache和内存中;Write Back:CPU写Cache时,若命中, 先把数据写到Cache中,再通过flush方式写入内存。
AWPROT是一个info类型的信号,用来指示当前传输的属性是一个数据传输还是指令传输、是普通模式还是特权模式。
由AxCache信号来指定,0-3bit分别代表Bufferable,Cacheable,Read Allocate,WriteAllocate。
注:
Cachable和bufferable
一个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。
其他具体看这篇
AMBA协议-AXI协议详解(读写时序、Outstanding、乱序传输、原子操作)_不吃葱的酸菜鱼的博客-优快云博客
4.outstanding
outstanding能力为N=0或1:
读操作:读地址命令->等待读数据返回->读地址命令->等待读数据返回->读地址命令->等待读数据返回。。。。。
写操作:写地址命令->写数据->等待写响应返回->写地址命令->写数据->等待写响应返回。。。。。(如果支持out-of-order,对于AXI3,写命令和写数据不一定有先后顺序且ID顺序不一定相同,AXI4因为已经没有WID信号,所以写数据的顺序要和写地址的顺序一样)
而如果outstanding能力为N>1的话,则:
读操作:可以连续发N个读地址命令,这期间如果读数据没有返回,则需要需要等待读数据返回,如果有读数据返回,则返回了几个,那么仍然可以接着发几个。也就是说,“在路上” 的读命令(或者读数据)最多可以是N。多说一点,可以看出,如果数据返回得比较慢,那么IP需要等待,效率就会比较低,因此,为了提高效率,有必要提高outstanding能力,以弥补”路上“(总线)引入的延时。但是也不能无限制地发,有可能会引起总线拥塞,把其他IP给堵住。
写操作:可以连续发出N组写地址(写数据)命令,这期间如果写响应没有返回,则必须等待写响应返回才能接着发写地址(写数据)命令,如果有写响应返回,则返回了几个,那么仍然可以接着发几组。也就是说,“在路上” 的写响应最多可以是N。
做项目的时候read的outstanding为8,write的outstanding为8,io的outstanding为1,因此只有cachable区间的时候访问,最大到8;而再加上uncachable区间,最大outstanding为9.
AXI VIP的outstanding设置
AXI VIP的port_configuration有三个outstanding的配置参数:
rand int num_outstanding_xact = -1;
rand int num_read_outstanding_xact = 8;
rand int num_write_outstanding_xact = 8;
当num_outstanding_xact == -1时,num_outstanding_xact将不起作用,需要单独设置num_read_outstanding_xact和num_write_outstanding_xact,相当于读写通道各自有一个FIFO。读通道的outstanding能力取决于num_read_outstanding_xact,写通道的outstanding能力取决于num_write_outstanding_xact。
当num_outstanding_xact != -1时,num_read_outstanding_xact和num_write_outstanding_xact将不起作用,相当于读写通道共用一个FIFO。读写通道的outstanding之和由num_outstanding_xact决定。
默认支持的最大outstanding数是128,如果超过128,注意修改宏SVT_AXI_MAX_NUM_OUTSTANDING_XACT
另外,max_num_outstanding_xacts_check_enable参数可以检查master或slave的outstanding是否超过上述配置的值
原文链接:https://blog.youkuaiyun.com/inthesunxkz/article/details/121858339
5.out of order 和interleave乱序和间插
乱序和间插是两个完全不同的概念。笼统的说,乱序指的是burst这个粒度,而间插指的是beat这个粒度。
简单说了,乱序是salve返回master请求的out of order特性,但这个slave可以是广义上的,一般总线会完成这个功能;
而间插(interleave)是指写数据,或是读返回数据,按找不同ID交织出现。比如:ID0 ID1 ID0 ID1…。乱序和间插都有深度,一般乱序深度比间插大的多。上面那个例子就是间插深度为2的情况。
6.exclusive 和lock
当对同一个地址进行读写操作时,在BUS上会看到在读写通道里面分别有对XX地址的读写操作,但读到和写入的数据是不同的。BUS上有很多master,都有可能对同一个地址进行类似操作,比如 master1 和 master2 都要对地址A数据进行读后写修改,原本计划的顺序是master1读后写,接着master2读后写。结果因为传输问题,master1读了地址A数据没写回,此时master2读了地址A数据后再进行修改写入,然后master1再写,这时候显然出现了读数据错误,master2应该读取的是master1修改的数据,但在这里却直接读取了。
ID扩展:一笔数据从master传输到slave再由slave返回的全过程可以如下描述:数据从master在发出的时候会给总线一个ID,当这笔数据传送到总线上后,总线会对ID进行扩展,扩展内容用来标志cmd由哪个master发出,接着再把扩展后的ID回给slave。送到slave之后,slave回response信号给总线时,总线也可以根据扩展的ID,将slave返回的response路由到正确的master上。
而针对多master访问总线问题,AXI 引入了一个原子操作,希望对地址A进行读后写的操作都是由同一个master操作的,中间不会由别的master介入,这样在多线程的时候就不会出现访存冲突的问题。AXI总线针对原子操作定义了两种Access。
原文链接:https://blog.youkuaiyun.com/qq_57502075/article/details/130470954
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)就不满足,所以总线就不会被锁定