How to Write an Effective Software Design Document
refactoringenglish.com
refactoringenglish.com
However if you do this as an executeable specification then the job of core functionality is finished with the specification, with significantly beeter quality, potentially.
This sounds a lot harder than it is - most behaviour is state based and it is possible to define such behaviour with an executeable specification.
In the Functional Safety world this is often your best option.
I wrote my own software package to enable such practices and once used to a slightly different way of thinking it works very well.