Respuestas:
En realidad hay varias razones.
Primero y probablemente lo más importante, los datos que se almacenan en la memoria caché de instrucciones generalmente son algo diferentes de lo que se almacena en la memoria caché de datos; junto con las instrucciones en sí, hay anotaciones para cosas como dónde comienza la siguiente instrucción, para ayudar a los decodificadores. Algunos procesadores (por ejemplo, Netburst, algunos SPARCs) usan un "caché de rastreo", que almacena el resultado de decodificar una instrucción en lugar de almacenar la instrucción original en su forma codificada.
En segundo lugar, simplifica un poco los circuitos: el caché de datos tiene que lidiar con lecturas y escrituras, pero el caché de instrucciones solo trata con lecturas. (Esto es parte de por qué el código de modificación automática es tan costoso: en lugar de sobrescribir directamente los datos en la memoria caché de instrucciones, la escritura pasa a través de la memoria caché de datos a la memoria caché L2, y luego la línea en la memoria caché de instrucciones se invalida y se vuelve a -cargado de L2).
En tercer lugar, aumenta el ancho de banda: la mayoría de los procesadores modernos pueden leer datos de la caché de instrucciones y la caché de datos simultáneamente. La mayoría también tiene colas en la "entrada" al caché, por lo que en realidad pueden hacer dos lecturas y una escritura en cualquier ciclo.
Cuarto, puede ahorrar energía. Si bien es necesario mantener la energía de las celdas de memoria para mantener su contenido, algunos procesadores pueden apagar algunos de los circuitos asociados (decodificadores y demás) cuando no se están utilizando. Con cachés separadas, pueden encender estos circuitos por separado para obtener instrucciones y datos, lo que aumenta las posibilidades de que un circuito permanezca sin alimentación durante un ciclo determinado (no estoy seguro de que ningún procesador x86 haga esto; AFAIK, es más un ARM cosa).
Al igual que en el sector inmobiliario, el uso de la memoria caché se basa en tres cosas: ubicación, ubicación, ubicación. El punto principal de tener un caché es que la mayoría de los programas exhiben patrones de ubicación: si acceden al byte 1111111, entonces el siguiente byte al que accederán es probablemente 1111110 u 1111112, y no tanto el byte 9999999. Sin embargo, la mayoría de los programas exhibirán muy diferente patrones de ubicación para sus instrucciones y sus datos. Esto significa que es poco probable que las instrucciones y los datos puedan compartir la memoria caché de manera eficiente. Porque las instrucciones y los datos no están necesariamente cerca uno del otro en la memoria. Un acceso a los datos aumentaría las instrucciones del caché, y las instrucciones de carga elevarían los datos del caché.