*.dtsi are Device Tree Source Include files.
*.dts are Device Tree Source files.
*.dtb are Devide Tree Blob files.
*.dtbo are Device Tree Blob Overlay files.
dtb/dtbo are machine readable binary device tree files. The dts/dtsi files in the linux kernel source code are human readable, that the dtb and dtbo files were generated from using a dtc (device tree compiler). dtsi files are include files, so they can contain anything that is in common between multiple dts files.
So then the next question is what are dtb files used for, they are a format expected by the Linux kernel (or u-boot/spl-u-boot) to communicate with hardware. So that the same kernel for one architecture can be used with multiple boards with different SoC’s provided it has access to information held in one or more dtb. I guess it is a way of providing information to software that wants to talk to the hardware in the form of a tree. It can contain information like memory locations and registers and the same information can be accessible through multiple branches. It can also contain information about the multiplexed pins underneath the SoC and the configuration that should be selected for their function on a VF2 board.
tree root -+-> SOC -+-> GPIO -> UART3
| |
| +-> I2C ...
|
+-> GPIO -> UART3
|
+-> I2C -+-> I2C0 -> WM8960 -+-> CPU0
| |
| +-> CPU1
+-> SPI-> ...
|
+-> PCI-> ...
|
+-> AXI bus -> ...
|
+-> APB ->...
|
+-> USB -> ...
|
...
And the next question is why is there not just one dtb, because there can be, at the spi-u-boot stage much less information is needed than at the u-boot+opensbi stage. So why waste memory when you have so little, it makes a lot of sense to have multiple dtb files. dtbo is just an overlay file, for when you want to replace information that has changed between stages in the boot.