VHDL: ¿cuándo se activa la lista de sensibilidad de proceso?

4

En la simulación de VHDL, hay un concepto de "tiempo delta", que se interpreta de manera general como "grupo de eventos desencadenados por el tiempo delta anterior". Después de un cambio, una vez que todos los cambios en cascada se han solucionado y no se generan más eventos de tiempo delta, el tiempo de simulación avanza. (Además, el tiempo de simulación puede avanzar después de N eventos de tiempo delta, ya que hay algún límite superior a la longitud de una cascada).

En un proceso dado, ¿cuándo se activa un cambio en la lista de sensibilidad del proceso? ¿Se dispara solo cuando el estado de una señal es diferente en un momento de simulación en comparación con el tiempo de simulación anterior, o puede activarse como resultado de cualquier evento de tiempo delta? Si se desencadena en cualquier momento delta, ¿se puede desencadenar un proceso más de una vez si hay una lógica combinatoria efímera?

Considera este ejemplo:

simular este circuito : esquema creado usando CircuitLab

Digamos que comenzamos con el estado estacionario A = 1, B = 0, C = 1. Además, supongamos que no hay una entidad externa que inspeccione la señal B, es puramente interna.

Ahora, introduce un evento de simulación: A = 0.

Esto generará un evento de salida para B = 1, y un evento de salida para C = 0, para la próxima hora delta. En el siguiente tiempo delta, se generará un nuevo evento de salida para C = 1, y no se generarán más eventos, por lo que el tiempo de simulación puede avanzar.

Ahora, digamos que tengo un proceso con C en la lista de sensibilidad. Digamos que este proceso incrementa un contador cada vez que se invoca.

¿Se incrementará ese contador dos veces como resultado de un cambio? Ese sería el caso si los cambios en tiempo delta provocan / desencadenan / invocan procesos.

¿O ese contador se incrementará cero veces? Ese sería el caso si solo los cambios en el tiempo de simulación provocan / desencadenan / invocan procesos.

¿O es indefinida la relación entre el cambio en A y el contador de procesos? Por ejemplo, si el simulador (o sintetizador, para hardware) optimiza la tabla de verdad NO y XOR, dirá que C siempre es 1, pero si no lo optimiza, puede generar dos cambios para C y ¿Entonces desencadenar el proceso dos veces?

Segunda pregunta: ¿Cuál es la palabra correcta que se debe usar para "provocar / desencadenar / invocar" un proceso al cambiar alguna señal en su lista de sensibilidad?

    
pregunta Jon Watte

1 respuesta

2

El tiempo solo avanza cuando ningún evento puede despertar más procesos. Si el proceso "P" es activado por su lista de sensibilidad, se ejecutará en tiempo cero y programará las asignaciones de señal, y estas asignaciones pueden despertar otros procesos. Si en el próximo delta (que no avanza el tiempo) algún proceso (incluso a sí mismo) afecta la lista de sensibilidad de P, entonces se volverá a activar P. Esto sucede tantas veces como sea necesario (o hasta que el simulador se rinda o se haya producido el número máximo establecido de deltas).

En el ejemplo particular de tu pregunta con ABC = 101 , si tuvieras:

process(A,B) begin 
    B <= not A; 
    C <= A xor B;
end process;

process(C) begin
end process;

Cuando A cambia a 0 , BC se programan con asignaciones de 10 . Un delta pasa, B se convierte en 1 y vuelve a despertar el proceso, que hace que C vuelva a 1 . Al final de este segundo delta, los valores son 011 , y no hay más eventos que podrían despertar el proceso, y cuando no se puede despertar ningún otro proceso, el tiempo avanza.

En consecuencia, process(A,B) se despierta una vez cuando A cambia, y una segunda vez cuando se cambia B . Como resultado, el "contador de despertar del proceso" cuenta dos veces.

En el caso de process(C) , también se activará dos veces, porque C hará un "glitch delta" debido a process(A,B) .

Sin embargo, si B era implícito:

process(A) begin 
    C <= A xor (not A);
end process;

process(C) begin
end process;

O si B era una variable local:

process(A) 
    variable B : std_logic_vector;
begin 
    B := not A;
    C <= A xor (not B);
end process;

process(C) begin
end process;

Entonces el proceso (A) solo se activará una vez, pero el proceso (C) permanecerá suspendido.

    
respondido por el apalopohapa

Lea otras preguntas en las etiquetas