I'm getting increasingly fed up with making SPI peripherals in software because you have unnecessarily tight hard realtime constraints to make the protocol work (if you don't respond within the set time the other side reads garbage).
In gateware you can easily enforce cycle accurate timing and on the host side the timing isn't critical.