Microblaze优化选项

Microblaze提供了一些优化选项,正确理解这些选项的含义以及作用对于开发过程有很多帮助,本文主要总结介绍Microblaze Configuration Wizard中的选项内容

预定义配置

根据具体使用场景的不同,Microblaze提供了一些预定义的配置选项供用户选择

  • Microcontroller Preset

  • Real-time Preset

  • Application Preset

  • Minimum Area

  • Maximum Performance

  • Maximum Frequency

  • Linux with MMU

  • Low-end Linux with MMU

  • Typical

  • Frequency Optimized

这些选项实际上是Microblaze在频率、面积、性能这几个指标不同侧重情况下,对各个配置项的组合。选择Current Settings即为自定义模式

Implementation Optimization

该选项可选以下3种:

  • Performance

  • Area

  • Frequency

这个选项非常重要,它与Microblaze的流水线级数对应

  • 3级流水线:Area

  • 5级流水线:Performance

  • 8级流水线:Frequency

三级流水线

三级流水线对应Area,使用了最小化的硬件花费,只有取址(Fetch)、译码(Decode)和执行(Execute)

三级流水线没有数据阻塞,只有控制流程阻塞、多指令结构性阻塞和访问较慢的内存、从较慢的内存取址等情况。多周期的指令类别有桶形移位器(barrel shift)、乘法器(multiply)、除法器(divide)和浮点指令

五级流水线

五级流水线对应Performance,最大化性能考量,包括取址(Fetch,IF)、译码(Decode OF)、执行(Execute,EX)、内存访问(Access Memory,MEM)和写回(Writeback,WB)

五级流水线存在以下两种数据阻塞的情况

  • OF指令需要EX指令的结果作为源操作数。EX指令类别为加载、存储、桶形移位器、乘法器、触发器和浮点运算。这些会导致1-2周期的阻塞

  • OF指令需要MEM指令的结果作为源操作数。MEM指令类别包括加载、乘法器和浮点运算。这些会导致1个周期的阻塞

多周期指令有除法器和浮点运算

八级流水线

八级流水线对应Frequency,用于最大化频率,包括取址(Fetch,IF)、译码(Decode OF)、执行(Execute,EX)、内存访问0(Access Memory 0,M0)、内存访问1(Access Memory 1,M1)、内存访问2(Access Memory 2,M2)、内存访问3(Access Memory 3,M3)和写回(Writeback,WB)

八级流水线存在以下四种数据阻塞的情况

  • OF指令需要EX指令的结果作为源操作数。EX包括加载、存储、桶形移位器、乘法器、除法器和浮点运算,会导致1-5个周期的阻塞

  • OF指令需要M0指令的结果作为源操作数。M0包括加载、乘法器、除法器和浮点运算,会导致1-4周期的阻塞

  • OF指令需要M1或M2指令的结果作为源操作数。M1或M2包括加载、除法器和浮点运算,会导致1-3或1-2周期的阻塞

  • OF指令需要M3指令的结果作为源操作数。M3包括加载和浮点运算,会导致1周期的阻塞

在额外的多周期指令种,存在3种情况的结构性阻塞

  • OF中的指令是流指令,EX中的指令是流、加载、存储、除法或浮点指令,并实现了相应的异常,这导致一个1周期的阻塞

  • OF中的指令是流指令,M0、M1、M2或M3中的指令是装载、存储、除法或浮点指令,并实现了相应的异常,这导致一个1周期的阻塞

  • M0中的指令是加载或存储指令,M1、M2或M3中的指令是加载、存储、除法或浮点指令,并实现了相应的异常,这导致一个1周期的阻塞

多周期指令分为分割指令和浮点指令FDIV, FINT和FSQRT

Use Instruction and Data Caches

使用外部存储器时,激活高速缓存,可以显著提高性能,可以降低外部慢速设备访问的使用量

Enable Barrel Shifter

使能硬件桶形移位器(Barrel Shifter),可以提高程序在移位操作时的性能。当该选项使能时,编译器可以自动的选择使用bsrlbsrabsllbsrlibsraibslli等汇编指令来优化加速移位操作

Enable Floating Point Unit

浮点运算单元能够提升float类型数据进行运算时的效率,Microblaze的FPU遵循了IEEE 754-1985标准,支持加、减、乘、除、比较、转换和平方根运算。编译器会自动根据系统选择的FPU类型使用汇编浮点指令优化浮点运算

Enable Integer Multiplier

使用一个硬件乘法器,可以提升程序在乘法运算时的效率

Enable Integer Divider

使能整型除法器,可以使用idiv和idivu指令,提升除法运算效率

Enable Additional Machine Status Registers Instructions

使能MSR寄存器指令msrsetmsrclr,用于设置和清MSR的位。MSR包含了处理器的控制和状态位,读取该寄存器时bit[29]会被复制到bit[0]作为近进位复制。对MSR进行读写有两种方式,一种是使用MFSMTS指令,另一种是使用msrsetmsrclr。当使用msrsetmsrclr进行写时,进位立即生效,其余位在一个时钟周期后生效。当使用MTS写时,所有位都在一个时钟周期后生效。程序运行会非常频繁的使用MSR,因此使能该选项可以很大程度的提升性能

例如在使用FreeRTOS时,systick或者消息队列中会频繁调用microblaze_enable_interruptsdisable_enable_interrupts函数,这两个函数是汇编函数,例如microblaze_enable_interrupts函数的定义如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
	.text
.globl microblaze_enable_interrupts
.ent microblaze_enable_interrupts
.align 2
microblaze_enable_interrupts:
#if XPAR_MICROBLAZE_USE_MSR_INSTR == 1
rtsd r15, 8
msrset r0, 0x2
#else /*XPAR_MICROBLAZE_USE_MSR_INSTR == 1*/
#Read the MSR register
mfs r12, rmsr
#Set the interrupt enable bit
ori r12, r12, 0x2
#Save the MSR register
mts rmsr, r12
#Return
rtsd r15, 8
nop
#endif /*XPAR_MICROBLAZE_USE_MSR_INSTR == 1*/
.end microblaze_enable_interrupts

可以看到,如果定义了MSR_INSTR,使能中断只有两条指令完成,否则需要5条指令。因此开启额外MSR指令能够在多任务系统任务切换和上下文切换方面提升性能

Enable Pattern Comparator

使能模式比较器,可以使用pcmpbfpcmpeqpcmpne指令,提升程序在进行比较时的性能。编译器自动进行指令转换

Enable Reversed Load/Store and Swap Instructions

启用反向加载/存储和交换指令,可以使用lburlhurlwrsbrshrswrswapbswawph指令。反向加载/存储指令可以以相反的字节顺序读写数据,交换指令可以在寄存器中交换字节和字。这些指令在处理网络字节序(大端)和Microblaze字节序(小端)

时可以提升性能