Microblaze RISC-V Zephyr Device-Tree Generation
Overview
Microblaze RISC-V Zephyr-specific device-tree generation is a multi-step process that transforms a system device-tree into a Zephyr-compatible format. This process involves generating domain-specific device-trees, creating Zephyr-specific configurations, and handling processor-specific requirements for interrupt controllers.
Generation Process
The complete process consists of three main steps:
Step 1: Generate Domain-Specific Device-Tree
This initial step processes the system device-tree and generates a processor/domain-specific device-tree tailored for the target processor.
Purpose: Extract and configure processor-specific components from the system device-tree.
Input Parameters:
{workspace}: Output directory for generated fileslop-microblaze-riscv.dts: Hardware configuration file containing tuning flags in YAML format for the assist{sdt}: System device-tree input file{proc}: Processor name (refer to the processor name in thepl.dtsifile - this varies based on the processor configuration in the Vivado design)
Output: system-domain.dts - Domain-specific device-tree file
Command:
lopper -f --enhanced -O {workspace} -i lop-microblaze-riscv.dts {sdt} {workspace}/system-domain.dts -- gen_domain_dts {proc}
Step 2: Generate Zephyr-Specific Device-Tree
This step transforms the domain-specific device-tree from Step 1 into a Zephyr-compatible device-tree format.
Purpose: Convert the domain-specific device-tree into Zephyr RTOS compatible format with appropriate bindings and configurations.
Input Parameters:
{workspace}: Output directory for generated fileslop-microblaze-riscv.dts: Hardware configuration file containing tuning flags in YAML formatsystem-domain.dts: Domain-specific device-tree file generated in Step 1{proc}: Processor name (same as Step 1)Optional:
{zephyr_board_dts}: Zephyr board-specific device-tree configuration. When provided, it will be compared against the domain-specific device-tree and removes unneeded nodes as per design configuration or mapping requirements
Output: system-zephyr.dts - Zephyr-specific device-tree file
Command:
lopper -f --enhanced -O {workspace} -i lop-microblaze-riscv.dts {workspace}/system-domain.dts {workspace}/system-zephyr.dts -- gen_domain_dts {proc} zephyr_dt {zephyr_board_dts}
Step 3: Generate MBV32 Generic Board-Specific Device-Tree
This final step addresses a specific requirement for RISC-V code compatibility by adding interrupt controller configurations.
Purpose: Handle the architectural difference where RISC-V code expects the interrupt controller to be part of the processor node, while AMD Microblaze RISC-V designs place the interrupt controller outside the processor. This step adds a dummy interrupt controller node that references the actual interrupt controller in the design.
Input Parameters:
{workspace}: Output directory for generated fileslop-mbv-zephyr-intc.dts: Configuration file that generates interrupt controller node under the processorsystem-zephyr.dts: Zephyr-specific device-tree file from Step 2
Output: mbv32.dts - Zephyr MBV32 generic board device-tree
Command:
lopper -f --enhanced -O {workspace} -i lop-mbv-zephyr-intc.dts {workspace}/system-zephyr.dts {workspace}/mbv32.dts
Prerequisites
Before running these commands, ensure you have:
System Device-Tree: Generated from Vivado design using SDTGen tool
Processor Name: Identified from the
pl.dtsifile in your designLopper Tool: Installed and accessible in your environment
Configuration Files: Required
.dtsconfiguration files:lop-microblaze-riscv.dtslop-mbv-zephyr-intc.dts
Example Workflow
Basic Workflow (without board-specific device-tree):
# Step 1: Generate domain-specific device-tree
lopper -f --enhanced -O ./output -i lop-microblaze-riscv.dts system.dts ./output/system-domain.dts -- gen_domain_dts microblaze_0
# Step 2: Generate Zephyr-specific device-tree
lopper -f --enhanced -O ./output -i lop-microblaze-riscv.dts ./output/system-domain.dts ./output/system-zephyr.dts -- gen_domain_dts microblaze_0 zephyr_dt
# Step 3: Generate MBV32 board-specific device-tree
lopper -f --enhanced -O ./output -i lop-mbv-zephyr-intc.dts ./output/system-zephyr.dts ./output/mbv32.dts
Advanced Workflow (with board-specific device-tree optimization):
# Step 1: Generate domain-specific device-tree
lopper -f --enhanced -O ./output -i lop-microblaze-riscv.dts system.dts ./output/system-domain.dts -- gen_domain_dts microblaze_0
# Step 2: Generate Zephyr-specific device-tree with board optimization
lopper -f --enhanced -O ./output -i lop-microblaze-riscv.dts ./output/system-domain.dts ./output/system-zephyr.dts -- gen_domain_dts microblaze_0 zephyr_dt board.dts
# Step 3: Generate MBV32 board-specific device-tree
lopper -f --enhanced -O ./output -i lop-mbv-zephyr-intc.dts ./output/system-zephyr.dts ./output/mbv32.dts
Output Files
After completing all three steps, you will have:
system-domain.dts: Domain-specific device-treesystem-zephyr.dts: Zephyr-compatible device-treembv32.dts: Final board-specific device-tree for Zephyr
Known Issues
Design Support Limitations:
Currently, the Microblaze RISC-V Zephyr device-tree generation supports only pure PL (Programmable Logic) based designs.
Unsupported Configurations: - PS + PL hybrid designs: Designs that combine PS (Processing System) processors with PL Microblaze processors are not currently supported - Mixed processor architectures: Systems that include both PS processors (e.g., Cortex-A78, Cortex-R52) and PL-based Microblaze RISC-V processors in the same design
Impact: If your design includes both PS and PL processors, the device-tree generation process may not produce correct results or may fail entirely. For such designs, consider: - Implementing pure PL-based designs for Microblaze RISC-V targets
Future Support: Support for PS + PL hybrid designs may be added in future releases.
Troubleshooting
Common Issues:
Processor Name Mismatch: Verify the processor name in your
pl.dtsifile matches the{proc}parameterMissing Configuration Files: Ensure all required
.dtsconfiguration files are availableOutput Directory: Verify the workspace directory exists and has write permissions
Next Steps: After generating the device-tree files, integrate them into your Zephyr project following the Zephyr documentation guidelines.