# Develop and validate firmware pre-silicon on Arm Neoverse CSS V3

## In this learning path

- [Introduction](https://learn.arm.com/learning-paths/servers-and-cloud-computing/neoverse-rdv3-swstack/)
- [Learn about the Arm RD-V3 Platform](https://learn.arm.com/learning-paths/servers-and-cloud-computing/neoverse-rdv3-swstack/1_introduction_rdv3/)
- [Understand the CSS-V3 boot flow and firmware stack](https://learn.arm.com/learning-paths/servers-and-cloud-computing/neoverse-rdv3-swstack/2_rdv3_bootseq/)
- [Build the RD-V3 Reference Platform Software Stack](https://learn.arm.com/learning-paths/servers-and-cloud-computing/neoverse-rdv3-swstack/3_rdv3_sw_build/)
- [Simulate RD-V3 Boot Flow on Arm FVP](https://learn.arm.com/learning-paths/servers-and-cloud-computing/neoverse-rdv3-swstack/4_rdv3_on_fvp/)
- [Simulate Dual Chip RD-V3-R1 Platform](https://learn.arm.com/learning-paths/servers-and-cloud-computing/neoverse-rdv3-swstack/5_rdv3_modify/)
- [Next Steps](https://learn.arm.com/learning-paths/servers-and-cloud-computing/neoverse-rdv3-swstack/_next-steps/)

## About this Learning Path

| Skill level:        | Advanced                 |
|----------------------|-------------------------|
| Reading time:        | 1 hr 30 min             |
| Last updated:        | 02 Oct 2026             |

| Authors:             |
|----------------------|
| Odin Shen, Arm [GitHub](https://github.com/odincodeshen) [LinkedIn](https://linkedin.com/in/odin-shen-lmshen)<br>Ann Cheng, Arm [GitHub](https://github.com/anncheng-arm) [LinkedIn](https://linkedin.com/in/hello-ann) |

| Arm IP:              |
|----------------------|
| [Neoverse](https://support.arm.com/?tab=compute-ip&Product%20Type=Infrastructure%20Processors) |

| Tags:                |
|----------------------|
| [Containers and Virtualization](https://learn.arm.com/tag/containers-and-virtualization) [AWS Graviton](https://learn.arm.com/tag/aws-graviton) [Microsoft Azure Cobalt](https://learn.arm.com/tag/microsoft-azure-cobalt) [Google Axion](https://learn.arm.com/tag/google-axion) [Oracle Cloud Infrastructure (OCI) Ampere Compute](https://learn.arm.com/tag/oracle-cloud-infrastructure-oci-ampere-compute) [Linux](https://learn.arm.com/tag/linux) [C](https://learn.arm.com/tag/c) [Docker](https://learn.arm.com/tag/docker) [FVP](https://learn.arm.com/tag/fvp) |

### Who is this for?

This advanced topic is for firmware developers, system architects, and silicon validation engineers working on Arm Neoverse CSS platforms who require a pre-silicon workflow for the CSS-V3 reference design using Fixed Virtual Platforms (FVPs).

### What will you learn?

Upon completion of this Learning Path, you will be able to:

- Understand the CSS-V3 architecture and the RD-V3 firmware boot sequence.
- Set up a containerized build environment and sync sources with a pinned manifest using repo.
- Build and boot the RD-V3 firmware stack on FVP and map UART consoles to components.
- Interpret boot logs to verify bring-up and diagnose boot-stage issues.
- Modify platform control firmware such as System Control Processor (SCP) and Manageability Control Processor (MCP), and validate changes through pre-silicon simulation.
- Launch a dual-chip RD-V3-R1 simulation and verify application processor (AP) and MCP coordination.

### Prerequisites

Before starting, you will need the following:

- Access to an Arm Neoverse-based Linux machine (cloud or local) with at least 80 GB of free storage
- Familiarity with Linux command-line tools and basic scripting
- Understanding of firmware boot stages and SoC-level architecture
- Docker installed, or a GitHub Codespaces-compatible development environment

### Summary

You’ll build the Arm Neoverse RD-V3 firmware stack and test it on an Arm FVP before hardware is available. First, you’ll prepare a repeatable environment, sync pinned sources, compile the boot chain, and select the FVP version that matches your release. You’ll then map UART consoles, follow the boot to a Buildroot Linux shell, validate firmware changes, and run the dual-chip RD-V3-R1 simulation.

### Frequently asked questions

<details>
<summary>How do I choose the correct FVP model for my RD-V3 build?</summary>
Match your FVP version to your RD-V3 release tag. For `RD-INFRA-2025.07.03`, use FVP version `11.29.35`. Check the release tags list for other version mappings.
</details>

<details>
<summary>What result should I expect when the single-die simulation boots successfully?</summary>
In `terminal_ns_uart0`, select **RD-V3 Buildroot** from the GRUB menu and press **Enter**. You should see `Welcome to Buildroot`, then a `buildroot login:` prompt. Log in as `root` to reach the Linux shell.
</details>

<details>
<summary>Where can I find the UART logs from the RD-V3 simulation?</summary>
Look in `~/rdv3/model-scripts/rdinfra/platforms/rdv3/rdv3`, where each UART is redirected to its own log file. Use the UART-to-terminal mapping to identify the subsystem you want to inspect, such as Linux, TF-A and UEFI, SCP, RSE, MCP, or LCP.
</details>

<details>
<summary>How do I validate the MCP firmware change on RD-V3-R1?</summary>
Add `FWK_LOG_CRIT("[FWK] Customer code here");` in `fwk_module_start()` in `~/rdv3r1/host/scp/framework/src/fwk_module.c`. Rebuild and repackage with `rdv3r1` build commands, then relaunch the FVP. Check your MCP UART output for `[FWK] Customer code here` to confirm that your change executes.
</details>

<details>
<summary>How do I know the dual-chip RD-V3-R1 simulation is running correctly?</summary>
After launching `./boot-buildroot.sh -p rdv3r1`, check the UART consoles to verify that both application processors, AP0 and AP1, boot in coordination. You can inspect the additional MCP console and logs in `~/rdv3r1/model-scripts/rdinfra/platforms/rdv3r1/rdv3r1`.
</details>
