Verilog: escribir en un registro sucede un ciclo de reloj tarde

0

Tengo un módulo Verilog que actúa como un archivo de registro (una serie de registros y algunos puertos de acceso) con una señal de control que proviene de otro módulo que controla cuándo ocurre la escritura en uno de los registros.

La idea es que levante un pin de control y el registro especificado se establezca en el valor en una de las entradas de datos del módulo de la siguiente manera:

module RegisterFile(
input CLK,
input [4:0] RegA_Name,
input [4:0] RegB_Name,
input [4:0] RegC_Name,
input [31:0] RegA_In,
input [31:0] RegC_In,
input RegA_WrtEn,
input RegC_WrtEn,
output reg [31:0] RegA_Out,
output reg [31:0] RegB_Out
);

reg [31:0] r [31:0];

integer i;
initial begin
    for(i = 0; i < 32; i = i + 1'b1)
        r[i] = 0;
end


always@(posedge CLK) begin

    RegA_Out <= r[RegA_Name];
    RegB_Out <= r[RegB_Name];

    if(RegA_WrtEn) begin
        r[RegA_Name] <= RegA_In;
    end

    if(RegC_WrtEn) begin
        r[RegC_Name] <= RegC_In;
    end
end

Estoy apuntando a que el contenido del registro se establezca y que el contenido aparezca en la salida en el mismo ciclo de reloj que la activación de escritura se establece alto.

Veo el comportamiento que tomo cuando pruebo el módulo desde un banco de pruebas, pero cuando lo conecto al módulo que realmente lo va a controlar y lo prueba, la escritura no ocurre en el ciclo del reloj que escribe. la habilitación se establece en alto, pero dos ciclos de reloj después (se muestra en la forma de onda a continuación). ¿Por qué podría ser esto? ¿Cómo puedo editar mi código para lograr el comportamiento que estoy buscando o algo parecido?

    
pregunta apabst

1 respuesta

1

Su código está haciendo exactamente lo que describió en su HDL.

En cada borde positivo del reloj ( always @ (posedge CLK) begin ), haga lo siguiente:

  1. Actualice los registros de salida para mostrar el valor de r que se guardó en el registro en el ciclo del reloj anterior ( RegA_Out <= r[RegA_Name]; )
  2. Si las señales de activación de escritura son altas ( if (RegA_WrtEn) ), entonces actualice el valor de r a los datos entrantes.

Como resultado, se requieren dos bordes de reloj positivos / ascendentes después de que se afirma WrtEn para que los datos aparezcan en la salida. Esto es exactamente lo que está viendo en su simulación.

He numerado los ciclos de reloj en la salida de tu simulación:

  • En el ciclo 1 del reloj, usted afirma las señales WrtEn y RegA_In .
  • En el siguiente flanco ascendente, ciclo 2, la primera palabra de datos se bloquea en el registro r (verías esto si lo probaras).
  • A continuación, en el ciclo 3, los datos en el registro r se enclavan en el registro RegA_Out , y la segunda palabra de datos se enclava en el registro r .
  • Finalmente, en el ciclo 4, la segunda palabra de datos se lee del registro r y se engancha en el registro RegA_Out .
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas