AXI:AMBA Advanced eXtensible Interface (AXI) Protocol Specification

目录

chapter 1 Introduction

about the AXI protocol

Architecture

channel definition

Interface and interconnect

Register slices

Basic transactions

read burst example

overlapping read burst example

write burst example

Transaction ordering

additional feature

chapter 2 Signal Descriptions

global signals

Write address channel signals

Write data channel signals

Write response channel signals

Read address channel signals

Read data channel signals

Low-power interface signals

Chapter 3 Channel Handshake

handshake process

Write address channel

Write data channel

Write response channel

Read address channel

Read data channel

Relationships between the channels

Dependencies between channel handshake signals

read transcation中的依赖关系

write transcation中的依赖关系

chapter 4 Address option

burst length

burst size

burst type

fixed burst

increment burst

wrapping burst

burst address的计算过程

确定burst中每个transfer的地址

确定每个burst中的第一个transfer的地址

确定burst中之后所有transfer的地址

wrapping burst中计算wrapping boundary

确定burst的第一个transfer使用哪些byte lane来传输数据(重点理解)

确定burst中第一个transfer之后,使用哪些byte lane来传输数据(重点理解)

Chapter 5 Additional Control Information

cache support

ACACHE[0]:bufferable(B)

ACACHE[1]:cacheable(C)

ACACHE[2]:read allocate(RA)

ACACHE[3]:write allocate(WA)

Protection unit support

Normal or privileged

Secure or non-secure

Instruction or data

Chapter 6 Atomic Accesses

atomic signals

Exclusive access

Exclusive access process的流程

从Master的角度来观察exclusive access

从Slave的角度来观察exclusive access

exclusive access的限制条件

Locked access

Chapter 7 Response Signaling

Response types

Normal access success

Exclusive access

Slave error

Decoder error

Chapter 8 Ordering Model

transfer ID field

Read Ordering

normal write ordering

wirte data interleave

read and write interaction

interconnect use of ID field

recommended width of ID field

Chapter 9 Data Buses

about the data bus

write strobe

narrow transfers

Byte invariance

Chapter 10 Unaligned Transfers

chapter 11  clock and reset

CLOCK

RESET

chapter 12 low-power interface

About the low-power interface

Lower-power clock control

Acceptance of low-power request

Denial of a low-power request

Exiting a low-power state

Clock control sequence summary

Combining peripherals in a low-power domain


chapter 1 Introduction

about the AXI protocol

AXI协议适用于高性能、高频率的系统设计,适用于高速的亚微米连接(submicron interconnect)。

最新一代的AMBA interface的主要目的是:

1、适用于高带宽、低延迟设计

2、不用复杂的bridge也能实现高频运行

3、适应于多种元件的interface要求

4、适用于具有较高初始访问延迟的内存控制器

5、在实现interconnect 架构的时候,提供了更多的灵活性

6、向下兼容AHB interface和APB interface

而AXI协议主要有以下特点:

1、将address/control 和data传输过程分开

2、利用byte strobe支持非对齐的数据传输

3、基于burst的数据传输,因此只需要提供burst开始时的address

4、将read data channel和write data channel分开,从而能够支持低成本的DMA

5、在Master方实现多个outstanding addresses

6、out-of-order transcation

7、可以比较容易地添加寄存器级,以此来实现时序收敛

Architecture

由下图可以看出,在整个AXI协议中共包含5个channel,其中包含read address channel、read data channel、write address channel、write data channel、write response channel。结构图如下所示:(注意:是不存在read response channel的,可以理解为,read data就算是response了)

channel definition

上述5个channel,每个都包含了一组信号线(具体是啥,之后会详细描述),利用双向的VALID和READY握手机制(information source利用VALID来表明我已经准备好发送数据了;而information destination利用READY来表明我已经准备好接收数据了)

read data channel和wirte data channel都包含了一个LAST信号,来表明data 的最后一个transfer发生。

read/write address channel

提供所需的address 和control information,AXI协议支持以下机制:

1、可变长度的burst,一个burst中可以包含1-16个transfer

2、burst中的transfer的size的大小可以为8-1024bits

3、支持increment、wrapping和non-incrementing burst

4、atomic operation(即operation要么不发生,要么完整发生,中间不允许中断,之后会详解)

5、系统级caching 和buffering control(通过ARCACHE和AWCACHE signals来确认,之后会讲解)

6、secure和privileged access(通过AWPORT和ARPORT signals来确认,之后会详解)

read data channel

在read data线上同时传递着read data 和read response information

1、data bus的宽度可以为8/16/32/64/128/256/512/1024

2、read response信号显示了read transction的完成

wirte data channel

write data channel将data 从master传递至slave

1、data bus的宽度可以为8/16/32/64/128/256/512/1024

2、每隔8个data bits就有一个byte lane strobe,以此来显示data bus上的哪个Bytes是有效的

(就是通过这个来实现unaligned transfer的,这个之后会详说)

因为wirte data information通常都是作为buffered的,因此master可以在不确认slave的ACK的情况下发送下一个transcation,也就是说wirte response实际上是可选的,而不是必须的。

write response channel

write response发生在每个burst完成的时候,而不是发生在burst内部的每个trasnfer完成的时候。

Interface and interconnect

(注意,这里的Master和Slave都是挂载在一个interconnect上面的,且这个interconnect是可以定制化的,而不是像之前的AHB和APB协议一样,简单地将所有的component全都挂载在总线bus上面)

大多数系统使用以下三种互联结构中的一种:

1、共享全部的address和data bus(也就相当于之前的总线连接方式)

2、共享全部的address bus和多个data buses

3、用多个address bus和data bus来组成多层结构(multilayer)

在大多数系统中,address channel的带宽远小于data channel的带宽,通过使用共享全部地址总线和多条data bus的方式来进行并行的数据传输,从而使得系统性能和interconnect复杂性之间达到平衡。(相当于一个折中方案)

Register slices

AXI中的transfer information是单向的,对各个channel之间的连接也没有固定的要求,这就使得在任何channel中增加register slice成为可能

register slice就是在原本互联的地方增加一级寄存器,虽然会增加一个cycle of latency,但是可以将一些性能不那么好的外设隔离在CPU直连结构以外,从而提升CPU的整体运行频率。

Basic transactions

VALID和READY在idle状态下的时候为低电平,高电平的时候表示有效。

read burst example

只有当valid和ready都为高电平的时候的时钟上升沿,才会完成数据的采集和传输

在每个burst的最后一个transfer时,拉高RLAST表示最后一个transfer

overlapping read burst example

由上面可以看出,在运行的时候address channel和data channel是分开运行的,二者其实不相互干扰

只要在传递data之前先传递address就可以。

(理解:可以理解为address channel将收来的burst初始地址存起来,每次发来data之后,取一个地址,然后根据control information来传递data,等到LAST信号接收到后,说明此地址已经传输完毕,然后就开始下一个address。这样就把address 的接受过程和data的接受过程分开,增加了系统的灵活性)

write burst example

每个transfer完成之后,给的response是WVALID和WREADY

每个burst完成后,既有WLAST信号拉高,还要额外在write response channel中回复一下

Transaction ordering

AXI会给与每个transaction一个ID tag,不同ID tag的transcation可以乱序传输,但是具有相同ID tag的transcation必须顺序传输。

out-of-order传输可以在以下两个方面提升系统性能:

1、可以让响应比较快的Slave优先完成transcation,之后再让比较慢的Slave来完成

2、比较复杂的外设也可以乱序返回read data。

如果master要让所有的transcation以相同的order来完成,则可以给予所有外设相同的ID tag

在多个master的系统中,interconnect负责扩展原本的ID tag,即在原本的ID tag上增加扩展位,以确保来自不同Master的ID tags都是独一无二的。

与之前AHB协议对比:

ID tag有点类似于多Master系统中的Master number,但是每一个Master可以在同样的port里面,利用分配多个不同的ID tag来表示多个不同的虚拟Master。这就是为什么AXI支持Master的多个outstanding transcation的原因了

additional feature

burst type:

包含了normal memory access、wrapping cache line burst和streaming data to peripheral FIFO location。(之后详细解释)

System cache support:cache和buffer的确定(之后详解)

Protection unit support:secure和privilege的确定(之后详解)

Atomic operations:原子传输,即通过exclusive和lock的方式确保burst不中断(之后详解)

Error support:错误传输(之后详解)

Unaligned address:非对齐地址(之后详解)

chapter 2 Signal Descriptions

虽然bus width和transcation ID width是在实现的时候确定的,可以修改。下面的说明中都确定的是data bus 的宽度为32bits,因此write data strobe的宽度为4bit。ID width为4bit。

global signals

reset信号上为低电平有效

ACLK信号为上升沿采样

以下的5个channel中各自都包含了VALID和READY信号,意义与之前描述的相同,就不赘述了。

Write address channel signals

之前一直说的ID tag其实就是通过AWID来实现的,这里的ID tag为4bit。

Write data channel signals

data传输的时候也需要有ID tag。其实每一个channel传输的时候都需要对应的ID tag。后续就不再赘述了。

WSTRB信号是一个探针信号,每个bit代表了wdata bus中的1个byte。在unaligned传输时用来表示当前哪个wdata byte是有效的。

Write response channel signals

write response channel也是有ID tag的,response一共分为四种,分别为OKAY、EXOKAY、SLVERR和DECERR。之后会详细解释这四种response的意义。

Read address channel signals

和之前的write address channel的信号差不多。

Read data channel signals

Low-power interface signals

CSYSREQ:系统时钟控制器向外设发送请求,请求其进入低功耗状态;

CSYSACK:外设确认系统时钟控制器的低功耗请求

CACTIVE:外设请求时钟信号。

进入低功耗模式的时候,外设的时钟会被关闭。退出低功耗模式的时候,外设向系统请求时钟,此时时钟打开。

Chapter 3 Channel Handshake

AXI中的握手机制是通过各个channel的VALID和READY来实现的。

这种双向握手机制让master和slave都可以data和control information的传播速度。

valid信号是由source来发送的,ready信号是由destination来发送的,均为高电平有效

transfer只有在valid和ready都为高电平的时候才会发生

无论是Master还是Slave,在输入和输出端口之间不应该有组合路径(理解为单纯由组合电路组成的通路)

handshake process

(上述的handshake过程话费了2个cycle的过程,在valid有效的时候,ready还是无效的,等了一个cycle,此时valid和information也同样继续保持了一个cycle)

(上述的handshake过程只话费了一个cycle,因为valid有效时,ready也是有效的,transfer直接完成采样)

(上述的handshake也只花费了1个cycle)

一般情况下,要将source和destination认为是两个object,二者之间没有任何联系,除了时钟同步以外。

Write address channel

master必须保持address和awvalid信号,直到接收到awready信号为止

awready默认可以为High或Low。

如果awready默认为高电平,(推荐也是高电平)则认为slave时刻准备且能够接收来自master的address信号

如果awready默认为低电平,(不推荐这样),则每一次的transfer至少需要2个cycle。

Write data channel

当最后一个wirte transfer传输的时候,必须将WLAST置位

当WVALID信号为低电平时(master还没有准备好数据发送),WSTRB可以为任意值,推荐设置为低电平或者保持上一个值。

Write response channel

wirte response通常在burst结束后发送,其中BREADY推荐为高电平,但必须是master时刻接受write response的状态。

Read address channel

推荐ARREADY为高电平,此时必须为Slave时刻准备好接受来自master的address的情况下。

Read data channel

RVALID信号就可以认为是对于data request的response。

当最后一个read data transfer发送时,必须将RLAST置位。

Relationships between the channels

当write address channel的寄存器级比write data channel的寄存器级多的时候,就可以让write data比write address提前。二者也有可能同时出现。

而interconnect必须重新对齐write address和write data。依次来确认write data只有对write address对应的slave才显示valid。

下面这两条是一定要遵守的规则:
1、read data一定要跟在read address后面
2、write burst的最后一个transfer传递之后一定要跟一个write response

上面的要求就印证了:
1、write data可以在write address 之前
2、read burst的最后一个transfer后面可以没有response,毕竟并没有read response channel

Dependencies between channel handshake signals

为了避免出现deadlock的情况,必须要搞清楚handshake signals之间的依赖关系:

在任何情况下:READY可以(可以的意思是可选,而非必须)对Vliad形成依赖,但是Valid不能对任何一个READY形成依赖,防止形成deadlock

read transcation中的依赖关系

write transcation中的依赖关系

Master一定不能等待Slave给的AWREADY和WREADY信号assert之后,再assert AWVALID和WVALID(也就是常说的valid一定不能对ready形成依赖关系)

因为Slave一般可以在assert AWREAD或WREADY之前等待AWVALID或WVALID(即ready对valid形成依赖关系)。如果Master反过来等待Slave的话,就有很大概率会造成dead lock

这里的意思是valid一定不能对ready形成依赖项,因为通常情况下是ready会对valid形成依赖的。

chapter 4 Address option

本章主要描述AXI协议中burst的类型、计算地址以及transfer中使用的byte lane

AXI协议中传输都是以burst为基础的,master在每次传输时发送的是burst的control information和第一个Byte的address,而Slave负责计算burst中之后每个transfer的地址。

burst的地址不能穿过4KB边界,类似于AHB协议中不能穿过1KB边界,因为可能穿过这个边界后,地址就到另一个Peripheral里面去了

burst length

用来确定每个burst内部的data number,单位为Byte。(实际的number= ALEN + 1)

限制了一个burst中最多包含16个data

重要原则:

对于wrapping burst来说,burst length只能为2/4/8/16

burst是不能terminate的,ALEN中确定了一个burst中包含了多少个data transfer就必须打多少了,一个都不能少。在write transfer中,如果不想写数据了,可以将所有的write strobe都deasserted;在read transfer中,如果不想读数据了,可以将之后的数据都discard掉。但是burst中剩余的transfer必须全部完成,无法直接terminate

burst size

ASIZE用来确定在每次data transfer或beat中,可以传输的最大data byte的数量。

这里是按照WDATA和RDATA的宽度来计算出来的,WDATA和RDATA的宽度为8, 16, 32, 64, 128, 256, 512, or 1024,其实是硬件设计的时候WDATA的硬件宽度,也就实际上决定了RSIZE和WSIZE的实际数据传输过程中的最大值
由于RSIZE和WSIZE都是Byte计数的,因此对应于RDATA和WDATA的宽度除以8

transfer在理解时可以类比于beat,beat等同于一个CLK周期,数据如果在一个周期内传输完毕,则transfer等于beat;如果不能,则一般transfer大于beat,包含了Master或Slave的等待时间。

实际的byte数量=2^(ASIZE)

AXI通过transfer的地址来确定每个transfer到底使用哪个byte lane来传输数据

对于increment 或wrapping burst,如果transfer size比data bus的宽度小,则在burst中的每个beat,data transfer都是在不同的byte lane上进行的。如果固定地址的fixed burst,每个transfer使用的是相同的byte lane。

每个transfer的size都不能超过data bus的宽度

burst type

包含了3中类型的burst,分别为FIXED、INCREMENT、WRAPPING.

fixed burst

在burst的每个transfer过程中,address是固定不变的,通常用于读写外设的FIFO时进行。(FIFO无论读写都是通过FIFO的固定位置来进行的)

increment burst

burst中每个transfer的地址都是前一个地址递增的结果,递增数量大小取决于transfer size

wrapping burst

wrapping burst内部与increment burst基本类似,只是wrapping burst有一个边界。

(边界大小= 每个transfer的size * 每个burst中transfer的数量)

在wrapping burst中需要注意两点:

1、wrapping burst的初始地址必须与transfer size对齐

2、wrapping burst的burst length只能为2/4/8/16

burst address的计算过程

计算过程中使用的值所代表的意义如下所示:

确定burst中每个transfer的地址

前三个都是将signal的值与实际代表的值进行对应

aligned address计算中先用start_addresss/number_byte,然后向下取整。最后乘以Number_byte,实际上是遵循了burst中以transfer作为地址对齐的标准,且实际的对齐地址小于start_address

确定每个burst中的第一个transfer的地址

注意这个地方的初始地址是signal中显示的,而与之前的对齐地址不一样,二者要区分开来。

也就是说每个burst中的第一个transfer使用的地址是初始地址,而非对齐地址

确定burst中之后所有transfer的地址

这里的N指的是2-16,不包含1。

也就是说burst中之后transfer的地址是按照aligned address对齐来计算出来的。

也就是说如果start address本身不是按照transfer size对齐的话,burst中的第一个transfer的data可能会不完整。

wrapping burst中计算wrapping boundary

wrapping boundary其实就是整个burst传输数据Byte数量,离start address最近的两个倍数。(左边界一般小于等于start address,是number_byte * burst_length 的倍数,右边界是下一个倍数)

(上图其实就是在计算左边界,向下取整,wrapping_boundary其实是比start_address小)

确定burst的第一个transfer使用哪些byte lane来传输数据(重点理解)

对以上公式进行分析:(这里分析的是使用的lane,而非data 最后到达的地址,一定要区分这两者的区别。地址仍然是按照transfer size来对齐的。一般来说,lane的总数肯定是要大于等于transfer size的大小的

【总结】使用lane的时候是按照data bus的宽度来对齐的,传输的destination 地址是按照transfer size来对齐的

第一个传输的起始对齐地址以data bus byte对齐,而非以transfer size来进行对齐。lower_byte_lane指的是start address比以data bus byte对齐的address大多少,则从lane的这1bit开始传输,不至于覆盖start address和data bus byte对齐的 address之间的数据

upper_byte_lane则指的是从start address之前的一个以data bus byte 对齐的address开始,与之后的另外一个以transfer size对齐的aligned address 2 之间的差值

也就是说第一个transfer 对齐的时候是按照data bus byte来对齐的,而不是按照transfer size来对齐的,所以究竟是哪个,需要进一步查询

确定burst中第一个transfer之后,使用哪些byte lane来传输数据(重点理解)

这里着重说的是Lower Byte lane,这个通常是用以transfer size对齐的地址减去以data bus byte对齐的地址来计算出来的。

upper byte lane通常是在lower byte lane的基础上增加一个transfer size。

Chapter 5 Additional Control Information

AXI支持系统级的cache和保护单元

cache support

系统级的cache support和其他性能增强措施主要是通过信号线ARCACHE和AWCACHE来实现的。

ARCACHE[3:0]和AWCACHE[3:0]通常为4bit,从高到低依次表示:

ACACHE[0]:bufferable(B)

当这1bit为HIGH的时候,意味着interconnect或其他component可以让transcation延迟任意多个cycles到达destination,通常只与wirte 有关。

ACACHE[1]:cacheable(C)

当这1bit为HIGH的时候,意味着到达destination的transcation的特征并不一定要和原本的transcation的特征一样

在write过程中,意味着多个不同的write可以合并成一个write

在read过程中,意味着可以read的slave可以提前获取要read的地址,然后一次性将多个read transcation的结果返回

决定一个transcation是否可以cache,这1bit应该和RA和WA联合使用

ACACHE[2]:read allocate(RA)

当RA为HIGH的时候,意味着如果transfer是read且在cache中还不存在的话,则应该给它分配一个地址

(理解为将read来的数据先放在cache中,然后等够了之后,一次性返回)

如果C为低电平的时候,RA一定不能为高电平

ACACHE[3]:write allocate(WA)

当WA为HIGH的时候,意味着如果transfer是write且cache中还不存在的话,就应该给它分配一个地址

(理解为将write来的数据先放在cache中,然后等够了之后,一次性返回)

如果C为低电平的时候,WA一定不能为高电平

在write transcation的过程中,AWCACHE信号可以用于确定哪个component来提供write response。如果wirte transcation 被确定为bufferable的,则可以由bridge系统级cache来提供write response。如果wirte transcation被确定为non-bufferable的,则write response必须由transcation的destination来提供。

AXI的协议中并没有规定buffer和cache究竟以何种机制来实现,可以是系统级cache或bridge之类的。

Protection unit support

AWPORT和ARPORT用于确定三种级别的访问保护机制,避免非法的transcation

Normal or privileged

这1bit通常被一些Master用于确定process mode。通常情况下privilege access 相比较normal access拥有更高的访问优先级。

当然也可以表示其他的,主要由用户自己来确定。

Secure or non-secure

在需要更大程度区分处理模式的系统中使用。(具体定义是怎样的,还需要用户自己来确定)

Instruction or data

这1bit通常在需要区分当前的transcation到底是instruction或data的时候使用

这个地方的data和instruction只是一个hint,并不是在所有情况下都accurate。就只是个标记,而非强制要求
因为在某些情况下,可能会有存在一个transcation里面同时包含了包含了instruction和data,此时你说它到底算data还是instruction呢?
因此默认情况下,除非能准确确定是个instrcuction,否则都标记为data。

Chapter 6 Atomic Accesses

本章主要描述了AXI协议中的exclusive 访问和locked访问机制。

在编程中,原子操作是指在一次发生中生效。一个原子操作不能在中途停止:它要么完整发生,要么不发生。

对引用类型变量和大部分基本类型变量(除long和double)的读、写是原子的

所有声明为volatile变量的读和写都是原子的

atomic signals

主要通过ARLOCK[1:0]和AWLOCK[1:0]来确定atomic access机制

Exclusive access

Exclusive access机制支持semaphore type operation,而不用让bus在operation期间一直锁定在一个特定master上。

exclusive access的优点是semaphore type operation并不会影响cirtical bus access latency或最大可实现的bandwidth

当确定为exclusive access的时候,可以通过RRESP[1:0]或BRESP[1:0]来确定exclusive access的success或failure。

Slave也必须有额外的logic来支持exclusive access。AXI 协议支持fail-safe机制用于显示当Master试图开展exclusive access但是slave不支持的情况。

Exclusive access process的流程

1、master开启一个在某个地址上的exclusive read operation

2、一段时间后,master通过在相同的地址上开启一个exclusive write operation来完成之前的exculsive read operation

3、如果在这段时间内,其他的master已经在这个地址上写了数据了,则返回为fail;

如果在这段时间内,没有其他的master在这个地址上写了数据,则返回为success;

对于一个master来说,它可能在一个exclusive operation中完不成wirte的部分。但是exclusive access监控硬件对于每一个transcation ID只能监控一个address。因此如果master完不成write的话,后续的另外一个exclusive read也会改变exclusive access监控硬件中的硬件地址。

从Master的角度来观察exclusive access

【重点理解】Exclusive access的主要用途是对同一个地址不能同时进行多个操作。

(例如地址A存放了一个数据2,操作1想要将地址A的数据读出来然后加1再放回去;操作2想要将地址A的数据读出来加2然后再放回去。那么在实际执行时这两个操作就必须设置成atomic access,必须为一前一后,“读写读写”,至于税前税后不要紧,才能最终结果恒定且正确。否则如果两个操作同时进行或交叉进行,“读读写写”,就会导致两个操作有其中一个被覆盖,结果不恒定且错误。)

对一个地址的操作无非就是读写两个操作,因此一个exclusive access operation包含了一个读操作和一个写操作。

下面是一个实际的exclusive access monitor的实现过程

1、Master通过exclusive read来开启一个exclusive operation

2、如果slave回复EXOKAY,则表示Slave已经记录了需要被监控的地址

如果slave不支持exclusive access,则会回复OKAY,表示slave不支持。Master收到后也就意识到了,推荐master就不要做exclusive access operation后续的write 部分了。

3、当Slave回复EXOKAY,exclusive read一段时间后,Master在相同的地址发起exclusive write。如果对当前的AWID有对应的ARID,且AWID写入的address与monitor中记录的ARID的address相同,则说明自从上次read之后没有其他Master对这一地址进行过读写操作。则返回EXOKAY。此时write操作就可以更新当前address上的值。

如果发现monitor中不存在这样的ID或ID存在但是address不存在,这说明这个address已经被其他的atomic operation访问过了,对当前操作已经无法完成完整atomic operation,因此返回OKAY,且不更新当前地址的数据。

对于一个exclusive operation来说,write部分不一定会执行,如果write不执行的话,slave会持续monitor这个地址,知道下一个exclusive read对同一地址开启了一个exclusive read过程。(也就是说read 之后是可以直接接read的

但是wirte必须要在read 执行后才能进行

从Slave的角度来观察exclusive access

slave要支持exclusive access的之后必须要有额外的monitor硬件电路(上面图片描述的就是这个电路的实现过程)。

一般要求对每一个具有exclusive operation的master ID都必须有这样一个monitor unit。

对于一个单端口的slave来说,可以使用标准的外部access monitor ,但是多端口的slave必须要有内部的monitor。

在exclusive read的过程中,slave的exclusive access monitor会记录ARID和address,直到下一个对相同地址的wirte出现或具有相同ARID的master的read来重置monitor到另外一个不同address。(这里的意思是,Exclusive read可以通过另外一个同样address的exclusive write或另外一个同样ARID的read operation来载入另外一个address

这里的意思是说每一个ARID其实只能对一个address进行监控

如果在进行exclusive write的时候发现这个地址已经没有被monitor了,则有可能是以下原因:

1、在exclusive read之后,这个地址上的数据被更新过。(或者尝试更新过,上面实现中,如果尝试更新,也会被删除monitor的)

2、当前monitor重置过检测地址(当前的master已经改为对另外一个地址进行monitor了)

exclusive access的限制条件

对于exclusive access有如下限制:

1、归于给定的ID ,wirte是的length和size必须和之前对应ID的read过程中的size和length相同。

2、exclusive access的地址必须按照整个transcation的大小来对齐(这里应该指的是一个完整的burst)

3、exclusive read 和exclusive write的地址必须相同。

4、read 和write过程中的control signal必须相同

5、exclusive access中的burst的大小必须为2的幂指数,如1/2/4/8/16/32/64/128个byte

6、在一个exclusive burst中可以传输的最大byte为128

7、exclusive access的slave不能被标注为cacheable,因为这二者相互矛盾
因为exclusive是为了在操作过程种不能有其他操作打断;而cache本身就打断了一个操作的全过程,而将其与其他的操作merge到一起,因此相互矛盾。

用于monitor的最小bytes是是通过length和size来确定的,但是monitor的时候可以监控一个比length*size更大的值,最大为128 byte。然而这可能会造成实际的exclusive access成功了,但是因为你监控的范围比实际burst的范围大,导致burst以外的部分被更新了,从而导致显示的时候显示为exclusive access 失败。

不支持exclusive access的slave

对于不支持exclusive access的slave,在exclusive read 之后可以返回OKAY来表征exclusive access的失败

对不支持exclusive access的slave进行exclusive wirte操作,总是可以成功更新对应地址的数据。

对于支持exclusive access的slave进行exclusive write操作,只有大红exclusive write成功的时候,才能更新对应地址的数据。

Locked access

ARLOCK[1:0]和AWLOCK[1:0]用来表征transcation的lock特性

当lock之后,interconnect必须保证只有当前master可以访问这个slave,直到最后一个unlock transfer完成。interconnect内部的arbiter用于执行这一限制。

当一个master开启一个locked dequence的时候,必须确保当前master没有其他的outstanding transcation

每个locked sequence的最后一个transcation必须设定为unlocked access,用于移除lock。

locked sequence的最后一个unlocking transcation执行之前,必须保证前面所有的transcation都完成了。

在新的transcation开始之前一定要保证locked sequence的最后一个unlocking transcation完成。

master必须保证locked sequence中的所有transcation包含相同的ARID和AWID。(意思就是locked sequence是针对同一个master而言的)

locked access要求interconnect在locked sequence发生期间,阻止其他的transcation发生,因此会对interconnect的性能有一定的影响(相当于独占了总线结构),所以locked access只推荐用于支持一些传统设备。

Chapter 7 Response Signaling

这里要区分response和handshake。之前所有的5个channel都需要handshake机制,也就是5个channel都需要valid和ready。但是只有write response channel和read data channel才有response信号。分别为BRESP[1:0]和RRESP[1:0]。

BRESP[1:0]来自Slave,用于确定刚才的wirte是否成功或错误

RRESP[1:0]来自Slave,用于确定刚才的read是否成功或错误

write burst的过程中,Slave只给整个burst一个response信号,而非burst中每个transfer都给response

read burst的过程中,slave可以给每一个transfer都给response,且response可以互不相同

这里再次强调之前说的burst无法被terminate,即使出现了error。error response并不会terminate burst,而是会让整个burst执行完毕,哪怕其中所有的transfer得到的response都是error。

这部分对那些支持多个outstanding address和precise error的master提出了限制。这样的master必须能够在下一个transfer进行的时候处理上一个transfer的error response。

Response types

一共包含了四种类型的response,其实就是上面描述过的。

Normal access success:OKAY

Exclusive access:EXOKAY

Slave error:SLVERR

Decoder error:DECERR

Normal access success

表示了:1、normal access 的success

2、exclusive access的failure

3、master发起了exclusive access,但是slave不支持

Exclusive access

表示了exclusive access的success

Slave error

表示一个不成功的transcation,比如:

1、FIFO或buffer出现overrun或underrun的情况。

overrun:接口输入方的速率超过了接收方的处理能力(可以理解为FIFO产生了overflow,即满溢)

underrun:输出接口的缓存从输出队列中取数据时,发现没有数据帧(可以理解为FIFO产生了underflow)

2、不合法的transfer size

3、对一个read-only的地址进行write操作的时候

4、slave产生了time-out

5、访问那些没有寄存器的地址(一般来说AXI是对外设通过内存映射上来的地址进行操作,每个地址对应外设的寄存器。但是也有空余出来的地址空间,没有被映射到,这些空间不一定能直接读写)

6、对一个已经disable或power-down的功能块进行访问时。

为了简化系统监控和debug,推荐只将error response用于error 请款函个,而不要用于一些normal或可预期的事件。

Decoder error

在一个没有被完全映射的地址空间内,存在一些没有slave对应的地址。再这样的系统中,interconnect必须提供一个合适的error response来响应对这些非法地址的访问,避免系统在试图访问一个不存在的slave的时候lock up;

当interconnect无法decode slave access(无法解析出当前访问的address属于哪个slave)的时候,必须将其转至default slave,这个default 返回一个DECERR response。

AXI要求所有的transcation都必须完成,即使遇到错误,因此DECERR response的时候也必须要完成之后的transcation

Chapter 8 Ordering Model

AXI利用ID tags来产生multiple outstanding address和out-of-order transcation。这两个特征能够使系统采用更高性能的interconnect,最大化数据吞吐量(throughput)和系统效率。

(之前在AMBA2.0里面一个Slave其实可以有多个outstanding transcation的,是根据Master的number来区分的。但是1个Master不能有多个outstanding transcation,因为无法区分Slave)

但是在AXI协议中,无论是来自Master的transcation,还是来自Slave的transcation,都是带有ID tag的,因此双方都可以支持multiple outstanding transcation。

具有相同ID 的transcation必须是order传输的,具有不同ID 的transcation可以是out-of-order传输的。

以下是5中类型的ID tag

transcation的order是相对其他的transcation来说的,在一个burst内部的data transfer的order是不能改变的。也就是说order和out-of-order是相对transcation来说的,而不是针对burst内部的transfer来说的。

transfer ID field

每个channel里面的ID signals共同构成了ID field。

transcation的order必须满足如下要求:

1、来自不同Master的transcation没有任何order限制,可以以任何order完成;

2、来自相同Master,但是有不同的ID tag的话,可以以任何方式执行。(同一master的不用ID tag其实就相当于一个master开了多个虚拟机)

3、write transcation的sequence中,具有相同AWID的必须以和address发布顺序相同的order来完成

4、read transcation的sequence中,具有相同ARID的必须:

① 当ARID相同,且来自相同的Slave时,必须由Slave确保这些transcation就必须以和address发布顺序相同的order来完成

② 当ARID相同,且来自不同的Slave时,必须由interconnect来确保这些transcation以和address发布顺序相同的order来完成

当AWID和ARID相同时,read transcation和write transcation之间的顺序并没有什么限制。

【总结】AWID和ARID都是来自Master。通过interconnect中加在ID tag前面的前缀来确定是不是同一个Master,通过AWID和ARID来确定到底来自于这个Master中的哪个虚拟Master。(来自同一个Master虚拟机的都必须按照地址的发布顺序来order执行。)

Read Ordering

在master的interface上来看,具有相同ARID的transcation,data到达master的顺序必须与master发布address的顺序相同。具备不同的AIRD的transcation的data可以以任何顺序返回,或者也可以在不同的ARID field之间交替返回数据。(相同transcation中的ARID和RID是一一对应的)

Slave的责任:Slave必须保证返回的read data中的RID的值与当时接收地址时所给的ARID的值相对应

interconnect的责任:interconnect必须保证来自不同的slave,但是具有相同ARID的transcation必须顺序执行。(具备相同的AIRD就说明是针对某个master的同一个虚拟master,当然要顺序执行)

下面这句话其实是站在Slave的角度来说明的:

read data reordering depth指的是Slave可以reorder的最大pending address数量,是一个静态值,由Slave的设计者来确认。如果slave要将所有的transcation都按照接收address的顺序来执行,则read data reordering depth=1;否则就必须在设计阶段确定一个静态值。

(这里其实就是Slave可以用于存储乱序地址的地方,看最多能存储多少个,然后在返回data时进行reorder)

normal write ordering

如果slave不支持交叉写入输入,则master就必须以发布address的顺序来写入data。

之前说过,具备不同的AWID的时候,wirte transcation可以out-of-order来执行。但是这有个前提条件:那就是Slave必须支持master interleave ,否则一切都免谈

大多数的slave都不支持交叉写入数据(多个不同的ARID的transcation交叉乱序写入data),因此写数据的时候就必须按照address发布的顺序来写入data;如果interconnect将不同master的write transcation的数据combine到一起,返回给一个Slave,那么它就必须保证在combine data的时候按照address发布顺序来combine。(即使是AWID不相同的transcation也必须满足这种限制)

wirte data interleave

write data interleaving能够让slave 的interface交替接收来自不同AWID的数值。write data interleaving depth是slave用来表征究竟能interleaved接收多少个不同AWID的数据。(类比之前read transcation中的read data reorder depth参数。)这是一个静态值,默认情况下为1.(即不支持interleaved wirte data)

【重点】拥有相同AWID的transcation是不允许interleave write data的。

write data interleaving depth指的是当前可以给slave interface提供data的different address的数量(这里应该是表述有误,wirte data interleaving depth是个静态值,这里应该指的是different address数量的最大值,而不是当前值。)。

每次transcation中接收的第一个data必须与它接收的第一个address相对应。(也就是后面的你可以随便乱序,但是第一个data必须与第一个address相对应)

write data interleaving可以将指向同一个slave的多个stream组合起来,避免出现stall(抛锚,熄火)的情况,从而提高系统性能。

如果两个不同的AWID的transcation对同一个address进行操作或overlapping了同一个块地址,那么这两个transcation其实是可以out-of-order传输的,因此需要一个更高层的协议来确定transcation执行的顺序。

【总结】

如果write data interleaving depth的深度为1,则产生write data的顺序就和当时发送wite address的时候一样
如果不为1,则write不同的WID的数据write data时,顺序可以与发布write address的顺序不一样

【应用场景】

对于那些自己内部可以产生write data的master来说,其实用不上interleave write,它可以以产生write address 的顺序来产生write data。
但是还有另外一种,master用来传递来自不同sources的data,且这些source的顺序快慢不一,因此为了最大化利用interconnect,所以master会采用interleave的方式来进行

【注意点】

为了防止产生deadlock,当slave需要连续接收interleaved wirte data时,它的wirte interleaving depth必须大于1。slave决不能slave决不能故意延迟接收write data以试图改变write data的顺序(就是说你阻拦了可以接受的数据,去等待一个暂时还来不了的数据,就会造成deadlock

read and write interaction

AXI中对于read transcation和write transcation没有固定的顺序要求,可以相互interleaving传输
如果Master一定要给这两个定个顺序的话,那就必须保证下一个transcation开始之前,前一个transcation已经complete

【怎么算complete】

对于read transcation来说,最后一个data发给Master的时候,就意味着transcation结束了
对于write transcation来说,只有response信号被接收到之后,才认为transcation已经complete了,不能认为所有的数据发送出去就以为write transcation完成了。

【注意点】

对于内存区间,master在开始一个新的transcation之前,要检查一下outstanding transcation,看新的是否与原来的存在内存区间冲突或重叠的部分。如果不冲突,则不需要等原来的transcation完成就可以开始;如果冲突,则需要等原来的transcation完成。

interconnect use of ID field

当master的interface连接到interconnect上时,interconnect会在原本的ARID、AWID和WID上增加扩展bit,保证来自这个master的这三个ID field是独一无二的。这会造成两种影响:

1、master无需知道其他的master使用的ID 是怎样的,因为这是interconnect的职责,来让ID扩展为unique

2、导致在slave端的ID interface 比master端的ID interface更宽了

当读数的时候,interconnect用RID上额外的bit来确定read data是给哪一个master的,interconnect在将RID 值传给对应的master之前就将这些多余的bit取消掉了

recommended width of ID field

为了充分利用AXI out-of-order transcation的优势,建议遵循如下:

1、建议在master端的ID为4bit

2、建议在interconnect端给transcation ID额外增加4个bits

3、建议在slave端的ID 为8bit

(对于那些支持single ordered interface的master,ID 的宽度可以为一个恒定值,如0)

对于那些原本设计的并不支持ID的Slave来说,可以通过一个现成的模块增加到Slave上面,让其能够支持order information

Chapter 9 Data Buses

about the data bus

因为AXI协议中的read data和wirte data 都有独立的data bus,且有各自独立的handshake signal,因此可以让data transfer的read 和write在同时进行。

Master产生的每次transfer的宽度最大只能和data bus的宽度一致,不能更宽了

write strobe

write strobe信号可以write transcation过程中write data bus上的进行sparse data transfer。(理解为data transfer不占满整个data bus,而是占据部分)

write strobe的每一bit对应的是data bus上的每一个Byte,如果strobe的某一bit asserted,则认为在data bus上对应的Byte lane上有有效数据。用于确定当前数据究竟在哪个lane上传输

narrow transfers

当传输的数据比data bus窄的时候,通过地址和control information来确定到底是在哪个Byte lane上来传输

当使用increment or wrapping burst的时候,每次beat使用的byte lane都是不相同

但是对于fixed burst,使用的byte lane是不变

以下是两个例子,也可以看出,transfer data的MSB与data bus的MSB相同

【从data bus的低位开始传输】

【从data bus的高位开始传输】

Byte invariance

【具体等用到的时候再体会吧】

为了访问那些相同地址空间中具有mixed-endian 的data struct(可以理解为这个data结构体中某一部分是大端模式,某一部分是小端模式),AXI协议使用了一种byte-invariant endian 方案。

【重点】Byte-invariant指的是到给定address的byte transfer会将在相同data bus上传输的数据传递至相同的address location。(还是不太理解

【理解】对于上面这句话,理解为:例如data bus的宽度为32bit,而每次写入时的address开始的内存块也是32bit。则在data bus的[31:24]上传输的byte只会传递至地址空间的[31:24],在data bus的[7:0]上传输的byte只会传递至地址空间的[7:0]。这样做的好处就是大端模式和小端模式的数据不会混淆,要大端,就从data bus的高bit开始,要小端,就从data bus的低bit开始。

那些只支持one transfer width的元件,必须让其byte lane连接至data bus中的合适的byte lane中;那些支持多个transfer size width的元件就需要更加复杂的interface来将原本不是byte-invariant的interface转换成合适的interface。

大多数小端模式的元件可以直接连接至一个byte-invariant interface。只支持大端模式的元件就需要一个转换功能块,来支持byte-invariant

例如,下面的传输中,header的部分使用的是小端模式,而payload的部分使用的是大端模式

byte invariant确保了访问小端模式的header的时候,不会破坏data struct内部大端模式的data。

Chapter 10 Unaligned Transfers

本章主要描述了unligned transfer是如何传输实现的。

AXI是一种基于burst地址的传输方式,transcation中包含了多个data transfer。通常情况下,这些data transfer都是按照transfer size的大小来对齐的。如32bit的transfer都是按照4Byte来进行地址对齐的。但是在某些情况下,需要在一些不是aligned的地址开始burst传输。比如一个32bit的data packet想要从0x1002的位置开始传输,显然这个地址是不对齐于4byte的(二进制最低两位为0)。

AXI针对这种情况,Master使用low-order address line来表示burst 的start address 不对齐的情况。此时low-order address line必须和byte lane strobe中的信息保持一致。(此时SLave是不用做什么额外的事情的)

low-order address指的是master先提供1个aligned address,然后借助byte lane strobe来确定哪条data lane上的数据可以使用。

举例说明:(灰色表示没有数据传输的部分)

从下面的图中,也可以验证之前对于burst中每个transfer到底使用哪个data lane的公式

下面图中的012345678等数字起止指的是地址。0x01,0x02等

【32bit的transfer,32bit的data bus】

这个地方的意思是
对齐的时候还是按照0x00来对齐,但是实际传递的时候的,第一个transfer里面的低8bit bus不用,因此实际的数据从0x01开始覆盖

【32bit的transfer ,64bit的data bus】

chapter 11  clock and reset

CLOCK

每个AXI元件都要用到一个单时钟信号ACLK,AXI的输入和输出均以上升沿作为敏感边沿

无论是在master方还是在slave方,在输入和输出信号之间不能有组合电路通路。(理解为:输入和输出之前不能通过组合电路直连)

RESET

复位信号低电平有效,可以异步置位同步释放

reset期间将5个channel的valid信号拉低,对于其他信号没有要求

Master interface必须仅在ARESETn为高电平后的ACLK上升沿才开始将ARVALID,AWVALID或WVALID驱动为高电平。

chapter 12 low-power interface

本章主要介绍在进入和离开low-power state时的时钟控制过程

About the low-power interface

low-power interface是针对data transfer protocol的可选择性扩展,主要针对两种类型的外设:

1、这类外设需要power-down sequence,只有在进入low-power state之后才会将时钟关闭。这类外设需要接受一个来自system clock controllerindication信号来决定什么时候开始power-down sequence

2、这类外设没有power-down sequence,可以独立的指出其什么时候可以接受其关闭自身时钟

Lower-power clock control

主要包含了如下三个控制信号:

CACTIVE:

来自外设的信号,用于外设表示什么时候它的时钟可以被enabled或disabled。此信号被asserted之后,表明外设需要时钟你信号,system clock controller必须立刻给时钟信号;此信号被deassert之后,表明外设外设不需要时钟信号,system clock controller就可以决定是否要enable或disablewishes时钟

【注意】对于那些需要随时控制时钟enable或disable的外设,可以将其CACTIVE信号永久设置为低电平;对于那些总是需要将时钟enable的外设,必须将CACTIVE永久拉高。(理解:CACTIVE永久拉低,则给了system clock controller以控制权,system clock controller可以选择将其enable或disable;CACTIVE永久拉高,则没有给system clock controller控制权,必须将时钟enable。)

CSYSREQ:

handshake信号。通常情况下,CSYSREQ为高电平,system clock controller将拉低为低电平表示请求外设进入low-power state。

CSYSACK:

handshake信号。外设利用CSYSACK信号来确认entry或exit low-power state。

以下为handshake的时序图:

对于上图的分析解释:

1、normal 时钟运行时,CSYSREQ和CSYSACK都为HIGH。

2、T1时刻,system clock controller 将CSYCREQ拉低,发起request,要求外设进入low-power state

3、T2时刻,外设将CSYSACK拉低,表示外设确认了请求entry

4、T3时刻,system clock controller 将CSYSREQ拉高,发起request,要求外设exit low-power state

5、T4时刻,外设将CSYSACK拉高,表示外设确认了请求exit。

外设可以选择accept或deny系统时钟控制器的request。当外设将CSYSACK拉低确认request的时候,可以用CACTIVE来表征外设到底是accept还是deny请求。

(【理解】这里的意思是说:handshake的过程是一定的。只是在ACK的时候通过CACTIVE来确认到底是accept还是deny请求

Acceptance of low-power request

T1:system clock controller 发起了了request,要求外设进入low-power state

T2:外设收到request之后,确认自己可以进入low-power state,于是将CACTIVE拉低(可以认为T2和T3之间需要进行low-power state的一些准备工作)

T3:外设发起ACK信号,向system clock controller表明外设要进入low-power state了。(此时系统看一下CACTIVE,表明外设accept了)时钟信号可以断了

(此期间无时钟信号)

T4:system clock controller发起request,要求外设退出low-power state。(这之后时钟信号就已经给了,外设要接受request以及accept或deny)

T5:外设确认自己可以exit low-power state,于是拉高CACTIVE

T6:外设发起ACK信号,向system clock controller表明外设要退出low-power state了。(此时系统看了一下CACTIVE,表明accept了)

【总结】

也就是说CSYSREQ和CSYSACK是handshake信号,这个过程是必须的。而系统时钟控制器在接收ACK的时候通过CACTIVE来确定deny还是accept

enter low-power state的handshake结束时,停止时钟供给;exit low-power state的handshake开始时,开始时钟供给

Denial of a low-power request

entry low-power state的req被拒绝了,因为在ACK之前,CACTIVE并没有拉低,表示我还是要时钟的,不能停;

exit low-power state的req被接收了,因为一直就没有进去过。时钟一直没有停。

Exiting a low-power state

外设和系统时钟controller都可以要求退出low-power state。根据定义,在处于low-power state的时候,CACTIVE和CSYSREQ都处于低电平LOW。因此将这两个信号中的任意一个拉高HIGH都能够开启exit sequence

由系统时钟controller发起的退出机制

通过将CSYSREQ拉高HIGH来启动exit sequence。(之后就restore 时钟)外设就可以开始power-on sequence,然后将CACTIVE拉高。当完成exit sequence之后,将CSYSACK拉高。

由外设发起的退出机制

通过将CACTIVE拉高HIGH来启动exit sequence。此时system clock controller 必须立刻restore clock。然后将CSYSREQ拉高HIGH来启动handshake sequence。外设完成exit sequence之后将CSYSACK拉高。在外设进行exit sequence的时候,外设需要将CSYSACK持续拉低。

Clock control sequence summary

Combining peripherals in a low-power domain

系统时钟控制器可以将多个外设组成low-power clock domain。只要能够遵循如下要求:

1、时钟域的CACITVE信号是时钟域内每个外设CACTIVE信号的逻辑或。因此只有当所有的外设都要disable clock的时候,系统时钟控制器才能disbale clock。

2、系统时钟控制器可以将一个CSYSREQ连接至此时钟域内的所有外设

3、时钟域的CSYSACK信号如下产生:(也就是说只有最后一个handshake完成后,才能算所有的都完成了handshake)

a :当所有外设中的CSYSACK的信号中的最后一个下降沿产生时,时钟域的CSYSACK产生下降沿。

b :当所有外设中的CYSYACK的信号中的最后一个上升沿产生时,时钟域的CSYSACK产生上升沿。

(【理解】:CSYSACK的下降沿可能发生在disable clock的时候,因此必须所有的外设都handshake完毕,才能disable 时钟

CSYSACK的上升沿可能发生在exit sequence完成的时候,此时反正clock早就在REQ之后就供上了,功能上无所谓。只是表征domain中所有wishes都exit sequence的handshake完成了。)

数字IC设计--------AMBA AXI协议(英文原版)相关推荐

  1. 数字IC设计----AMBA总线协议(来自英文原版)

    第一章  AMBA总线介绍 1.AMBA总线协议总览 AMBA(Advanced Microcontroller Bus Architecture)总线协议是一种面向高性能嵌入式微控制器设计的片上联接 ...

  2. 数字ic设计——AMBA总线(1)AMBA总线介绍

    AMBA总线介绍 AMBA(Advanced Microcontroller Bus Architecture) 总线是由ARM公司提出的一种开放性的片上总线标准,它独立于处理器和工艺技术,具有高速度 ...

  3. linux mipi驱动分析_寒武纪社招内推数字IC设计、DSI驱动、软件架构、产品经理、芯片架构、工具链开发、深度学习、FAE工程师...

    点击上方蓝字关注我吧! 为什么内推更靠谱?内推是基于人脉关系链的推荐,其背后有一定的信用背书,靠谱的人推荐的人相对也会比较靠谱,所以企业一般职位都是从内部开始分享的,相较于自己海投简历,内推的效率和成 ...

  4. 数字IC设计的一些英语术语总结

    数字IC设计的一些英语术语总结(持续更新...) AXI (Advanced eXtensible Interface ) 一种总线协议(AMBA3.0 一部分) AMP (Asymmetric Mu ...

  5. 数字IC设计SOC入门进阶

    声明:本系列文章全部来自网络公开资料整理,并在文后附上网页链接.仅用于学习交流. 前言 硕士毕业从事FPGA逻辑开发已N年,对于未来的发展方向.技术提升等充满了困惑.迷茫.此时,恰逢数字IC设计岗位兴 ...

  6. verilog hdl数字集成电路设计原理与应用_数字IC设计经典书籍推荐

    数字IC设计流程很复杂,从前端到后端,也有很多职位.在这里整理了个数字IC各个环节的经典必读书籍.市面上的书籍种类纷繁复杂,这里每种只推荐两本左右,如果需要,建议知识类的书籍还是购买正版,尊重作者,也 ...

  7. 数字IC设计经典书籍

    1 <Verilog HDL高级数字设计> 中文版和原著.这本书本人以为是讲Verilog方面的最好的一本书,看完此书后,相信大家的code水平会有很大提高.书中例子及其丰富,涵盖了RIS ...

  8. 数字IC设计工程师笔试面试经典100题

    1:什么是同步逻辑和异步逻辑? 同步逻辑是时钟之间有固定的因果关系.异步逻辑是各时钟之间没有固定的因果关系.同步时序逻辑电路的特点:各触发器的时钟端全部连接在一起,并接在系统时钟端,只有当时钟脉冲到来 ...

  9. 数字IC设计工程师要具备哪些技能

    数字IC设计工程师要具备哪些技能 本文同步发表于:http://exasic.com/article/index.php?md=talk-01 本篇简单罗列了作为数字IC设计工程师的必备知识和学习建议 ...

最新文章

  1. labview实现字符串转16进制
  2. 滁州布局创新链服务链~农业大健康·万祥军:谋定功能性农业
  3. 【转】 ubuntu12.04更新源 官网和163等
  4. 那一年,我考入了西北师范大学GIS专业,然而我很迷茫,GISer的职业规划到底是怎样的?
  5. 一文快速理解Java反射(详细对比图)
  6. IE6 透明遮挡falsh解决方案
  7. java同步synchronized,锁
  8. larveral 直接拷贝安装_2020年mac系统下制作win10引导安装盘,亲测可用
  9. 二叉树遍历(递归与非递归版本)
  10. 完全免费的公众号文章批量下载器
  11. 分布式服务框架选型:面对Dubbo,阿里巴巴为什么选择了HSF?
  12. Golang sync.Cond 简介与用法
  13. python编写程序判断今天是今年的第几天_python怎么判断当前日期是今年的第几天...
  14. 2022年8月最新运维面试题-服务器上下架流程
  15. esp32c3 nvs存取大数组结构体方法
  16. hive 计算周几_【hive】求日期是星期几
  17. mysql悲观锁for update
  18. 探秘亿联网络最新声学实验室
  19. 音视频从入门到精通——FFmpeg分离出PCM数据实战
  20. swapidc不能连接到主机_用SWAPIDC架设一个虚拟主机销售网站

热门文章

  1. Linux下的中文美化问题
  2. 【我的JS第三本】JavaScript_DOM编程艺术第二版读书笔记
  3. 2021年安全员-B证(江西省)考试APP及安全员-B证(江西省)考试试卷
  4. 发现了一个在freebsd12和linux下比较好用的刻录u盘的工具可以刻录win8.1启动盘
  5. 毕莹python_网易云课堂 - 我的职业课堂
  6. Python数据分析:数据分析实战 —— 阿里云天池
  7. 下载drivegoogle文件;cmd安装出现黄色警告;DGL下载;torch版本;(最全)GPU-torch下载;WARNING: Retrying Retry(total=4, connect报错
  8. Linux桌面应用问答(转)
  9. STM32CubeMX芯片包下载失败
  10. Civil3D道路模型导入Infraworks2020中曲面的有关问题