He estado diseñando una computadora retro en verilog como un ejercicio y hasta ahora tengo una CPU simple de 8 bits que se comunica directamente con un solo chip RAM a través de un puerto de datos bidireccional. Esto funciona muy bien en mis pruebas, sin embargo, ha surgido la necesidad de incluir una segunda RAM en un bus diferente, como RAM de video con la que tanto la CPU como el procesador de gráficos pueden interactuar. Para lograr esto, implementé un módulo controlador de memoria. Este módulo se conecta directamente a ambos chips de RAM en buses separados, y las lecturas / escrituras en / desde la CPU ahora tienen que pasar por este módulo.
Conexiones de módulo simplificadas:
module memcontroller(inout[7:0] CPUdataBus, inout[7:0] RAMdataBUS, inout[7:0] VRAMdataBus)
Al conectar la CPU directamente con la RAM, solo configuraría el bus de datos en Hi-Z para usarlo como entrada y leer datos de la RAM. Sin embargo, ahora hago esto en el puerto "RAMdataBUS" y necesito una forma de "conectar" la entrada al puerto CPUdataBus, que no puedo entender.
Quizás ingenuamente, pensé que algo como esto funcionaría:
assign CPUdataBus = write ? CPUdataBus : RAMdataBUS;
assign RAMdataBUS = write ? CPUdataBus : 8'hZZ;
Lo que produce durante la síntesis:
RAMdataBus[7]" has multiple drivers due to the always-enabled I/O buffer "CPUdataBus[7]"
para cada bit
Es probable que haya una razón realmente obvia para que esto no sea válido, pero no obstante, no puedo encontrar una solución al problema o no entiendo el error por completo.