Qemu新增的芯片平台

随着芯片开发的规模越来越大,验证无处不在,在整个开发流程中能够将系统软件的开发尽量向左前移,那么我们开发的芯片就能够更早地推向市场,甚至抢占先机。

使用Qemu来模拟仿真我们开发的芯片,从而能够让软件开发人员与芯片设计人员并行开发,但是Qemu通常是没有我们自研芯片的虚拟平台(VP),因此我们要根据芯片手册,新增实现一个虚拟原型或者虚拟芯片平台,也就是说基于Qemu现有的代码,我们新开发一个自研芯片的虚拟原型(VP),基于这个开发的虚拟原型(VP),我们可以开始进行BSP代码开发,不用再等待FPGA原型验证环境准备好,就能够提前推进系统软件代码的开发验证。


  • Qemu: v7.2.0
  • Host OS: Ubuntu-20.04
  • GCC: 9.4.0

Qemu特征

  • 新增Cortex-A78ae CPU支持
  • 新增Cortex-R52 CPU支持
  • 新增THead-E907 CPU支持
    • 移植THead扩展指令集
  • 新增PCIe UFS支持
  • 新增eMMC和SD Card支持
    • 支持RPMB分区
    • 支持Boot分区
    • 支持Synopsys和Cadence SDHCI
  • 新增ARM SMMUv3支持
  • 新增Synopsys ethernet QoS支持
    • 仅支持在U-Boot下收发功能,中断未模拟实现
  • 新增synopsys GPIO and I2C Controller支持

新增的平台

在我们开发Qemu machine之前,我们需要先熟悉芯片的基础架构:

  1. 芯片的地址映射(memory map)
  2. 芯片的中断映射(interrupt map)
  3. 芯片的指令集架构(ARM、RISC-V等)
  4. 芯片涉及的外设(GIC、timer、UART和ethernet等)

目前新支持的平台

表1 Qemu支持的平台
SoC Platform Machine Name Arch U-Boot defconfig Kernel defconfig
hobot hobot-sigi-virt aarch64 hobot-sigi-virt_defconfig hobot_sigi_tiny_defconfig
lambert lmt-virt aarch64 lambert-qemu-virt_defconfig lambert-tiny_defconfig
lambert safety lmt-riscv-virt riscv32(M-mode only) lambert-qemu-riscv-without-dram_defconfig NA

hobot平台

支持的设备如下:

  • four CPUs (ARM Cortex-A78ae)
  • GICv3 (GIC-600)
  • four NS16550 UARTs (synopsys)
  • two SDHCI (Cadence)
  • OCM (32 MiB)
  • two GPIO Ctrl (synopsys)
  • DRAM (96 GiB)
  • PCIe (ECAM)
  • USB (synopsys)
  • NVMe
表2 hobot平台的内存映射和中断映射
IP name memory
base address
memory
map size
interrupt
OCM 0x0400_0000 0x0200_0000
flash 0x1800_0000 0x0800_0000
pmu 0x2319_0000 0x0001_0000
gicv3 0x30b0_0000 0x0001_0000
gicv3 redist 0x30b6_0000 0x0010_0000
PCIe Ctrl 0x3400_0000 0x0040_0000 127~130
PCIe PIO 0x7000_0000 0x1000_0000
PCIe MMIO 0x8000_0000 0x4000_0000
PCIe high MMIO 0x80_0000_0000 0x80_0000_0000
sdhci0 0x3903_0000 0x0001_0000 120
sdhci1 0x3904_0000 0x0001_0000 122
UART0 0x3905_0000 0x0001_0000 73
UART1 0x3906_0000 0x0001_0000 74
UART2 0x3907_0000 0x0001_0000 75
UART3 0x3908_0000 0x0001_0000 76
low DRAM 0xC000_0000 0x4000_0000
high DRAM 0x30_0000_0000 0x18_0000_0000

lambert平台

基于aarch64的lmt-virt

支持的设备如下:

  • 8 CPUs (ARM Cortex-A76)
  • 2 NS16550 UART (synopsys)
  • DWC Ethernet QoS (synopsys)
  • GICv2 (GIC-400)
  • DRAM (48 GiB)
  • iRAM (128 KiB)
  • Safety iRAM (512 KiB)
表3 lmt-virt平台的内存映射和中断映射
IP Name Memory
Base Address
Memory
Map Size
Interrupt
iRAM 0x0000_0000 0x0002_0000
GICv2 0x0044_8000 0x0000_8000
UART0 0x1068_a000 0x0000_1000 73
UART1 0x1068_b000 0x0000_1000 74
ETH 0x6082_4000 0x0000_4000 112
iRAM safety 0x60c0_0000 0x0008_0000
DRAM 0x4_0000_0000 0xC_0000_0000
基于riscv32的lmt-riscv-virt

支持的设备如下:

  • 2 CPUs (THead E907 or base rv32)
  • CLINT (timer interrupt or SGI)
  • CLIC
  • 2 NS16550 UART (synopsys)
  • iRAM (512 KiB)
  • fake DRAM (4 MiB)
表4 lmt-riscv-virt平台的内存映射和中断映射
IP Name Memory
Base Address
Memory
Map Size
Interrupt
iRAM 0x60c0_0000 0x0008_0000
CLINT 0x60c8_0000 0x0008_0000
CLIC 0x60d2_4000 0x0000_1000
UART0 0x60d4_2000 0x0000_1000 16
UART1 0x60d4_3000 0x0000_1000 17
fake DRAM 0x60e0_0000 0x0040_0000