And what's the purpose of building a soft M0 core in the fabric which cannot be achieved by the built-in A9 cores?
The A9 and your custom peripheral are going to sit at opposite ends of a bus, which is a shared resource and potential bottleneck, so often you're going to need to move any "thinking" to the peripheral end of the bus. The question as I see it isn't what a soft M1 can do that the A9 in a Zynq can't, but rather what kind of applications it excels at where other techniques like DSP blocks or sprawling logic/LUTs don't work as well, are difficult to get to work right, or are grossly resource inefficient. Or, where it can greatly reduce bus traffic; one such example might be a custom protocol bridge between two very different physical wires or networks. Say also add a monitoring port - with a soft M1 all this can be done in a peripheral without the back-and-forth copies across the bus. The M1 just interfaces directly to the transceivers, and has a control interface of higher level driver interactions (configurations, statistics, routing, error reporting, etc etc). The reason to use a CM of course instead of any ofter soft core is software familiarity (software quality improves with familiarity), tool chain quality and familiarity, and potential for code reuse. If you already have a protocol implementation in C/C++ with a long trusted history because you've used it in a bunch of projects already, then it's pretty sweet to just drop it into your soft core project and use without modification. You'll just need to figure out the platform end of things, like retransmit timers etc.