Which types of memory you could use depends on memory compiler your company has (notice that memory compilers are extremelly expencive tools).
Still usage of 1-port memory is the best whenever it is possible, because small arbitration logic is much less costly that memory area increase (it is up to 50% for memories with 1R, 1W port, single clock). Personally I have never seen support for full dual-port memory (2 RD/WR ports on trully asynchronous clocks) - except on FPGA, of course.
One typical usage of 2-port memory (1 RD, 1 WR port) with 2 asynchronous clocks is resynchronization between different clock domains.
Reasons for usage of 2-port memories in real designs are almost infinite, but frequently it is designers lazzyness to do arbitration between different clients even there are enough bandwidth. Somethimes type of design requires lot of dual-port memories, but usually 90+% of memories are 1-port in good designs.