Verilog: cómo superar el hecho de que no puedo combinar disparadores de borde y nivel, escribir en la memoria

0

Tengo un módulo ram de 32x32 que construí, el código simple:

Código Verilog

module RAM32X32(
    input clk,
    input rst,
    input WE,
    input [4:0] ADDRESS,
    input [31:0] D_IN,
    output  [31:0] D_OUT
    );
//////internal//////////////// 
reg [31:0] mem [31:0];//,r;
wire [31:0] data ;
integer i;
/////////////////////////////

initial begin 
  for (i = 0; i < 32; i = i +1) begin
      mem[i] = 32'b0;  
  end
end
assign data = WE ? D_IN : 32'bz;

always @ (posedge clk) begin
    if  (WE == 1'b1) begin 
        mem[ADDRESS] = data;
    end
end
assign D_OUT = mem[ADDRESS]; 
endmodule

ahora veo que cuando escribo en el ram, lleva tiempo, y en la simulación veo que la memoria cambia solo el CC después, como se ve a continuación (R31 está en la última fila, ahí quiero escribir):

Cambié mi lista de sensibilidad y agregué:

(posedge clk or data) 

Y obtuve lo que quería en la simulación. Pero ... sintetizar no lo permitió debido a:

  

No hay soporte para la síntesis de desencadenantes mixtos de borde y nivel.

Así que pensé en hacer un ariete disparado con tri-estado para protegerlo. ¿Qué piensas? ¿Es incluso legítimo utilizar el nivel activado en estos días? Cualquier ayuda será útil!

¡Gracias!

    
pregunta albert1905

1 respuesta

0

Necesitas cambiar tu banco de pruebas porque tienes una condición de carrera de simulación. Use asignaciones no bloqueantes a sus entradas, o cambie sus entradas en el borde negativo del reloj. De esa manera se colocarán en las entradas de RAM antes del reloj de posición.

    
respondido por el dave_59

Lea otras preguntas en las etiquetas