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支持
- 仅单独支持stage-1和stage-2,不支持stage-1和stage-2同时起作用
- 参考Qemu support for SMMUv3
- 新增Synopsys ethernet QoS支持
- 仅支持在U-Boot下收发功能,中断未模拟实现
- 新增synopsys GPIO and I2C Controller支持
新增的平台
在我们开发Qemu machine之前,我们需要先熟悉芯片的基础架构:
- 芯片的地址映射(memory map)
- 芯片的中断映射(interrupt map)
- 芯片的指令集架构(ARM、RISC-V等)
- 芯片涉及的外设(GIC、timer、UART和ethernet等)
目前新支持的平台
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
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)
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)
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 |