MicroBlaze IP核是Xilinx公司提供的一个嵌入式软核处理器,广泛应用于FPGA设计中。在MicroBlaze IP核中,AXI4和ACE接口提供了高性能的数据传输和缓存一致性管理功能。
1 内存映射接口
1.1 外设接口
MicroBlaze处理器中的AXI4 内存映射外设接口AXI4是一种在Xilinx FPGA设计中常见的通信协议,用于在处理器和内存或其他外设之间传输数据。
指令外设接口(M_AXI_IP):MicroBlaze提供了多种AXI4内存映射外设接口,这些接口可以作为32位或64位的主设备(master)来工作。每个接口在任何时候都只有一个未完成的事务(transaction),并且所有的事务都是按顺序完成的。指令外设接口是一个32位的主设备,仅执行单字(single word)的读访问。它总是被设置为使用AXI4-Lite的子集。
数据外设接口(M_AXI_DP):是一个32位或64位的主设备,执行单次的访问。默认情况下,它被设置为使用AXI4-Lite的子集,但当启用LWX和SWX指令的独占访问时,它可以被设置为使用AXI4。半字(halfword)和字节(byte)的写操作是通过设置适当的字节选通(strobes)来实现的。每个写交易都会等待M_AXI_DP_BVALID
信号,以确保存储指令在完成之前数据已经被正确写入。
当启用MMU物理地址扩展(PAE)时,指令外设接口(M_AXI_IP)地址宽度可以在32-64位的范围内,这取决于C_ADDR_SIZE的参数值。
数据外设接口(M_AXI_DP)的地址宽度可以在32-64位的范围内,这取决于C_ ADDR_SIZE的参数值。
1.2 缓冲器接口
AXI4内存映射缓存接口可以根据缓存行长度和数据宽度参数实现32位、128位、256位或512位的主设备(masters)。而AXI一致性扩展(ACE)接口实现为32位主设备(masters)。
ACE是AXI协议的一个扩展,它提供了一套机制,使得多个处理器IP核和其他主设备能够以一种高效且一致的方式访问共享内存。ACE通过定义一组事务类型、信号和协议来管理多个主控之间的缓存一致性和内存访问。它支持五种状态的缓存模型,用于管理缓存行状态并确保数据一致性。
使用32位主机时,指令缓存接口
当使用32位主机时,指令缓存接口(M_AXI_IC 或 M_ACE_IC)可以执行突发读访问(burst read accesses),这意味着在单个请求中可以连续读取多个字(word)。可能的突发读访问长度包括4字、8字或16字。突发读访问的长度(即每次连续读取的字数)取决于缓存行(cache line)的长度。缓存行是缓存中存储数据的基本单位。
当使用更宽的主机接口(如128位、256位或512位)时,指令缓存接口只能执行单次读访问(single read accesses),即每次请求只读取一个数据块(这个数据块的大小取决于主机的位宽)。
当使用32位主机时,接口可以拥有多个未决事务。默认情况下,可能支持高达2个未决事务。当启用流缓存(stream cache)时,未决事务的数量可以增加。流缓存允许提前请求两个缓存行,这意味着在某些情况下,可以同时有5个未决事务。然而,如果设置了未决读操作的数量,它必须是一个2的幂次方。因此,在可以拥有5个未决事务的情况下,通常会将其设置为8个,因为8是大于5的最小2的幂次方。对于128位、256位或512位更宽的主机接口,指令缓存接口通常只支持单个未决事务。
参数 C_ICACHE_ALWAYS_USED
控制了如何访问内存位置,特别是与指令缓存(Instruction Cache)相关的内存范围。
当 C_ICACHE_ALWAYS_USED
为 1 时,缓存的内存范围总是通过 AXI4 或 ACE 缓存接口进行访问。
这意味着无论缓存是否由软件启用或禁用,访问缓存内存范围时都会使用缓存接口。
当 C_ICACHE_ALWAYS_USED
为 0 时:缓存的内存范围将通过 AXI4 外设接口进行访问。MSR(Machine Status Register)中的 ICE 位用于控制指令缓存的启用/禁用。当 ICE=0 时,指令缓存被禁用。
使用32位主机时,数据缓存接口
当使用32位主机时,数据缓存接口可以执行单个字(word)的访问,也可以执行突发访问(burst accesses),具体取决于缓存行的长度。突发访问的长度可以是4个字、8个字或16个字。
突发写访问(burst write accesses)仅在使用AXI4的写回缓存时执行。写回缓存是一种缓存策略,其中修改的数据首先被写入缓存,并在之后的某个时间点写回到主存中。如果没有使用写回缓存或使用了不同的缓存策略,则可能只执行单个字的写访问。
对于这些更宽的主机接口,数据缓存接口只执行单个访问,无论是读还是写。
未决事务是指在某个时间点内,接口已经开始但尚未完成的事务数量。在数据缓存接口中,这通常指的是正在等待响应的读写请求。
读取时:最多可以有2个未决事务。这意味着在读取操作之间,接口可以并行处理最多两个读取请求,而不会阻塞其他请求。
写入时:最多可以有32个未决事务。这意味着在写入操作之间,接口可以并行处理多达32个写入请求,而不会阻塞其他请求。
MicroBlaze是一个软处理器核,它必须维护一个有序的内存模型。这意味着在处理器看来,内存的读写操作必须按照程序中的顺序执行,即使底层硬件(如AXI4或ACE接口)可能使用不同的顺序来处理这些操作。AXI4和ACE接口为读写操作提供了单独的通道,即读操作和写操作可以在不同的通道上并行执行,而不会相互干扰。然而,这些接口本身并不保证读写操作的顺序性。允许有多达32个未决写事务可以显著提高性能。这是因为当处理器有多个写入请求时,它可以并行地发送这些请求,而不需要等待每个请求都完成后再发送下一个。这减少了处理器的等待时间,从而提高了整体的处理速度。
字、半字和字节的写入是通过设置适当的字节选通来执行的。
可以为LWX和SWX指令启用Exclusive访问。
C_DCACHE_ALWAYS_USED
是一个配置参数,通常用于描述硬件(如FPGA中的处理器或SoC)的数据缓存(Data Cache)行为。这个参数决定了数据缓存是否总是被用于访问特定的内存区域。
当 C_DCACHE_ALWAYS_USED
为 1 时:数据缓存总是被用于访问缓存内存范围。这意味着,无论软件是否禁用了缓存(例如,通过修改某个特定的内存状态寄存器MSR的DCE位),数据缓存都会被用来访问这部分内存。在这种情况下,内存访问通常通过AXI4或ACE缓存接口进行,因为这些接口支持缓存一致性和缓存管理功能。
当 C_DCACHE_ALWAYS_USED
为 0 时:数据缓存的使用是可选的,取决于软件配置和缓存状态。如果软件禁用了数据缓存(例如,通过设置MSR[DCE]=0),那么对缓存内存范围的访问将通过AXI4的外围接口(Peripheral Interface)进行,而不是通过缓存接口。使用外围接口意味着这些内存访问不会受到数据缓存的影响,即它们将绕过缓存直接访问物理内存。这可以用于确保某些内存操作的一致性,例如非缓存写或绕过缓存的读取。
2 Stream Interfaces(流接口)
MicroBlaze AXI4-Stream 接口(如 M0_AXIS、M15_AXIS、S0_AXIS、S15_AXIS)被实现为32位的主设备和从设备。这意味着这些接口在数据传输时,数据的位宽是32位。
写操作
当MicroBlaze处理器通过流接口进行写入操作时,会使用put或putd指令之一。写入操作将寄存器的内容传输到AXI4输出接口。
在阻塞模式(blocking mode)下,只要接口不繁忙,put和cput指令的传输可以在单个时钟周期内完成。
当MicroBlaze使用put或cput指令写入流接口时,它会在发送数据后等待,直到数据被成功传输到AXI4接口。如果AXI4接口当前正忙,MicroBlaze会“停滞”(stall),即它会暂停执行后续指令,直到AXI4接口变得可用。
非阻塞模式的指令(如带有n前缀的指令)总是会在单个时钟周期内完成,无论AXI4接口是否正忙。如果AXI4接口正忙,写入操作将被抑制(inhibited),并且处理器状态寄存器(MSR)中的进位位(carry bit)将被设置,以指示写入操作未能成功执行。
控制指令(带有c前缀的指令)用于设置AXI4-Stream接口的TLAST输出信号为'1'。这个TLAST信号被用来指示数据包的边界。
读操作
当MicroBlaze处理器从流接口(如AXI4-Stream)读取数据时,它会使用get或getd指令之一。读取操作将AXI4输入接口的内容传输到通用寄存器中。
在阻塞模式下,get或getd指令会等待数据可用,然后将AXI4输入接口的内容传输到通用寄存器。只要数据可用,这个传输通常在两个时钟周期内完成。如果数据不可用,处理器会在这个指令上“停滞”(stall),即暂停执行后续指令,直到数据变得可用。
在非阻塞模式下(即带有n前缀的指令),无论数据是否可用,传输都会在一个或两个时钟周期内完成。如果数据不可用,数据传输不会发生,并且处理器状态寄存器(MSR)中的进位位(carry bit)会被设置,以指示读取操作未能成功执行。
MicroBlaze处理器的数据获取指令(不带c前缀的指令,如get或getd)期望AXI4-Stream的TLAST输入信号被清除为'0'。如果在读取操作期间TLAST信号为'1',这些指令会将MicroBlaze的状态寄存器(MSR)中的FSL(First-in-Stream Last)位设置为'1'。这通常表示在数据流的开始位置意外地接收到了TLAST信号,这可能是一个错误情况或数据包边界的误检。
相反,控制获取指令(带有c前缀的指令,如cget)期望TLAST输入信号被设置为'1'。这是因为这些指令通常用于读取数据包的最后一个数据项,而TLAST信号用于标识数据包的边界。如果在执行这些指令时TLAST信号不为'1',它们同样会将MSR中的FSL位设置为'1',这表示在期望的数据包边界位置没有接收到TLAST信号,可能也是一个错误情况。