Transfer和Burst
burst是transfer的合集,一个burst里会有若干transfer
Interconnect
Interconnect可以给master来的transfer加上额外的ID tag,这使得来自每个master的ID tag都是独特的,一般设计为额外的4bits,master发出的ID tag为4bits,这样slave就必须设计为8 bits. 在来自master的信号中,interconnect会把这部分额外的ID tag给加上,在来自slave的信号中,中interconnect会在区分是给哪个master后,去掉额外的ID bits。这部分额外的ID tag还可以设计为来自虚拟主机的传输。
RVALID,WVALID,AWVALID,ARVALID,BVALID
WVALID信号属于data channel,0表示data和strobe没有都available,1表示data和stobe都是available了
RVALID信号属于data channel,0表示data没有available,1表示data已经available了,这和WVALID还是有区别的,没有strobe的要求
但是其他的几个AWVALID,ARVALID,BVALID分别属于address channel和write response channel,则没有strobe是否available的要求
AWID,WID,ARID,RID,BID
在AXI3中,AWID和WID的存在使得写操作是支持interleave的(burst顺序发射,transfer间插,burst顺序返回),在进行write data transfer的时候,属于同一个burst的,每个transfer都要带一个WID,WID要和AWID相同,这样就可以支持write的interleave了,也就是有不同WID的transfer可以交替传输,但是属于同一个burst中的transfer中间虽然插入了别的burst的transfer,还是要保持原来的顺序。
AXI4中去除了WID,这使得interleave就不存在了(顺序发射,顺序返回),因为如果再乱着传,就不知道transfer属于哪个burst了。所以写操作中不仅要每个burst要按照顺序,先传输完成一个上一个burst的data,再传输下一个burst的data
对于读操作master发送的address/control signal带有ARID,slave发送的read data带有RID,同一个burst的这两者是要相同的,每个read transfer要带有一个RID,这就是使得读操作是支持interleave和out-of-order的(burst顺序发射,transfer间插,burst乱序返回),因为ARID和RID的存在。在读数据的过程中,返回数据可以interleave,和AXI中的write data interleave一样,同时也可以先执行完的先返回,也就是乱序返回。
BID属于write response channel,要和AWID相同
Read response和Write response
response会有OKAY, EXOKAY, SLVERR, DECERR四种,对于read response需要每个transfer都要有一个response,而对于write response则只需要在每个burst结束时给出一个response。写操作是可缓冲的,这样在不需要得到slave的响应的时候就可以接着进行写操作。对应于写burst中不需要每个transfer都进行响应,而是整个burst结束后再进行响应。
关于此问题,引用其他博主的回答如下
对于read操作和write操作, Slave向master回Response的方式差异很大.
读操作有两个通道, 读地址通道和读数据通道, 由于response也是从slave到master端的, 因此response可以和data共用同一个通道, 但是, 对于写操作而言, addr和data都是从master到slave端的, 而response则是从slave到master, 因些就不得不多出个response通道.
无论是read response, 或是write response, response的格式均相同. RRESP[1:0] and BRESP[1:0]为AXI的response信号, Response的内容为OKAY, EXOKAY, SLVERR, DECERR. OKAY指示normal access的成功或exclusive access的失败; EXOKAY指示exclusive access的成功; SLVERR指示slave error, 如buffer越界, timeout超时等; DECERR指示master要访问的slave地址不存在, 即是没有相应的slave, 那么就需要设置一个default slave, 来响应DECERR.
response的操作并不复杂,但是,为什么写操作会有一个专门的response通道,而read操作没有,并且read操作是第次transfer会有一个response,而write操作的每次burst才有一次response。这虽然是AXI spec规定的,但是Spec为什么这样规定,还是值得思考的。
- 对于read操作,Spec明确规定必须先写addr,再读read data,那么slave回read data时,已经能确定该transfer是否成功,因此这时的response是已知的,response就可以和read data一块回给master。
- 对于write操作,addr和data均是从master到slave,而response是从slave到master,因此需要增加一个response通道。再看为什么不是每次transfer都有response,由于addr和data没有先后依赖关系,因此,第n次transfer时,slave有可能只收到data,而没收到addr,此时还无法判断response结果,所以write操作做不到每次transfer都给出response,而是每次burst有一次response。
因为AXI protocol有相关描述
For example, the write data can appear at an interface before the write address that relates to it. This can occur when the write address channel contains more register stages than the write data channel. It is also possible for the write data to appear in the same cycle as the address.
也就是说虽然address和control signal是在data之前发送,但是在channel传输过程中address信号可能会经过更多的寄存器,需要更多的时间。
ARREADY,AWREADY信号
ARREADY/AWREADY信号一般默认为高,这样在ARVALID/AWVALID拉高时就可以在一个周期完成传输,但是这要保证destination一直保持可接收的状态。ARREADY/AWREADY也可以默认为低,这样的话传输需要至少两个周期,一个周期用来拉高valid,另一个周期用来拉高ARREADY/AWREADY
在AXI中通道中两个关系必须保持
- 读取的数据必须在所关联的地址之后
- 写响应必须在这个burst传输的最后一个数据之后
关于Address
在AXI中,master通过address channel只需要传输首地址及控制信息,通过这些,slave需要自己计算出其他的地址,AXI表述如下:
As the burst transaction progresses, it is the responsibility of the slave to calculate the addresses of subsequent transfers in the burst
为什么会有WRAP 的burst类型
WRAP burst一般用来对cache的访问,一般会一次性访问完一个cache line,WRAP和INCR都可以访问完一个cache line,比如64byte,但是使用WRAP burst相比于INCR的优点是访问的首地址就是你想要用到的数据,而INCR则需要从cache line的一开始进行访问。这样就会造成想要用到的数据不能立马得到,cache的效率降低。
不能减少传输的burst length
如果不想要burst中的一部分数据,在写操作中,可以通过disable strobe的方法,但是所有的transfer都必须完成,在读操作中,master可以通过舍弃数据的方法,但是所有的transfer也都必须完成
读操作中,如果遇到了访问FIFO,则不能使用上述的方法,因为这样会使得数据丢失,因为FIFO的数据读取后将不会存在FIFO,所以master要保证在访问这种memory时不要使用多于所需transfer长度的控制信号
关于byte lane的使用
INCR,WRAP类型的burst,每个transfer宽度小于bus宽度的话,可以每次使用不同的byte lane
FIXED类型的burst则每次使用同一个byte lane
关于bufferable和cacheable,read allocate,write allocate(AXI3)
bufferable指的是当一个数据写入到目的地之前是否是可缓冲的,也就是是否是可延时的,这个一般只和写操作有关,如果是bufferable的,则说明这个操作是可以延时的,如果是Non-bufferable的,那说明这个操作是不能延时的。此信号代表着写操作的两种方式write through和write back,write-through指的是写操作的时候会同时对cache和memory写入,而write-back则是只会对cache写入,只有当这个cache要被replace的时候才会被写入memory。
是否bufferable还代表着可以由什么提供response,对于bufferable的可以由interconnect或者system cache提供,不必由真正的destination提供。而non-bufferable则表明必须由destination提供。
cacheable则指的是,一个数据写入或者从memory读取的时候,是否是可cache的。如果是可cache的,对于写操作的数据来说,如果cache hit的话,这个数据就可以在cache中写入,如果cache miss,那么此时就将会看write allcoate来决定使用什么样的方法来写入数据,write allocate为高电平的话,则写入的时候会将memory中的数据读取到cache中,对cache进行write cache hit的情形写入,并标记为dirty。write allocate为低电平的话,就会直接往memory中写入,而不会放入到cache中写入。对于读操作来说,如果cache hit的话,这个数据就可以从cache中读取,如果cache miss,那么此时就将会看read allocate,read allocate为高电平的话,就将会把memory中的数据读取到cache中,并按照write cache hit的方式读取,read allocate为低电平的话,则会直接从memory中读取,而不会将数据读取到cache中。
只有在可cache的时候,read allocate和write allocate的高电平才有意义。
exclusive access
对于exclusive访问,是需要slave进行monitor支持的,关于这个monitor的实现方式,引用如下博客
这个monitor内部含有一个8个entry的寄存器组,用来记录当前active的exclusive read。一个entry记录的信息是ARID和检测的Address。当exclusive read来的时候,monitor首先看当前的ARID有没有被记录在entry里面,如果有则用当前的ARADDR替换entry里面的Address信息,否则则新建一个记录。当exclusive write来的时候,monitor首先检测是否记录中是否有匹配的ARID。若有匹配的记录,再看这个entry中AWADDR是否与Address匹配,若匹配则返回EXOK,写操作生效。否则返回OK,写操作不生效。同时再遍历所有entry,看是否还有ID不匹配但Address匹配的记录,若找到,则删除相关记录。这样,另外一个不同ID对同一个Address的exclusive write再来的时候,会找不到匹配的记录,此时返回OK,exclusive write失败,写操作不生效。
来自http://blog.sina.com.cn/s/blog_c28badc30101mpzn.html
需要注意ARCACHE[3:0] 或 AWCACHE[3:0] 信号的值必须保证监控独占访问的从设备看到事务。 例如,由从属设备监视的独占访问不能具有指示事务可缓存的 ARCACHE[3:0] 或 AWCACHE[3:0] 值。也就是必须得到达destination,从destination得到响应。
对不支持独占访问的从属设备的独占写入总是更新内存位置。对支持独占访问的从属设备,只有当独占写入成功时才会更新内存位置。
locked access
locked access进行时,interconnect将会阻断来自其他的操作除非来自同一个主机的unlock
locked access开始时必须保证没有outstanding的操作
每一个locked access都是带着ARLOCK或者AWLOCK信号的,结束时的access是不带这个信号的,这是locked access的最后一个传输,接下来的lock将被解除
关于非对齐传输
关于非对齐传输,之前一直以为会导致想要传输的数据不完整,后来觉得应该是非对齐传输指的是如果传输的起始地址和bus不对齐的话,那么将会disable一部分strobe,disable的那部分就不会被传输了。不存在数据不完整的问题,因为那部分本来就是不想被传输的。
比如上图中,是从0x07传输的,利用了bus上的前三个strobe的disable
关于burst读和写的方式
网上看到了一个博主写的觉得比较容易理解
深入 AXI4 总线(C0)旧版存档:突发传输机制 - LogicJitterGibbs的文章 - 知乎