¿Cómo se ejecuta el código verilog siguiente cuando encuentra el borde positivo del reloj?

0
rd=1;
case1=2 ;          
i=2;          
n1=23;        
always @(posedge clka)             
begin           
    counter=counter+1;             
    if (rd==1) begin                        
        #5 window[i]<=douta;     ~~~~~~~~~~~ Statement1             
        case(i)            
            case1: addra=n1;
            case2: addra= n2;
        endcase                    
        #5 addra<=addra+1;            ~~~~~~~~~~~Statement2    
        #5 i<=i+1;            
    end 
end            

La instrucción dentro del bloque siempre en verilog es secuencial. En el borde positivo del reloj:

counter=counter+1 
if (rd==1) (true)

Confusión: Mi confusión es que la declaración del caso se produce primero porque la ventana [i] = douta (después de 5 unidades de tiempo). Después de que aparezca esta declaración 2 o la instrucción 1 y la declaración aparecen al mismo tiempo.

Por favor, cualquiera puede despejar mi duda después de que la instrucción dentro siempre se bloquee en este caso. Gracias

    
pregunta SW.

1 respuesta

1

En este caso, el orden de ejecución debe ser el siguiente (en este orden exacto):

Time X:    if-statement
Time X+5:  case
Time X+5:  Statement 1
Time X+10: Statement 2

Lo que estás encontrando es una confusión acerca del bloqueo vs la asignación de no bloqueo. Este es un buen ejemplo de por qué se llama asignación sin bloqueo. Cuando llegue a la línea #5 window[i]<=douta; , el simulador esperará 5 unidades de tiempo, luego programará a window[i] para tomar el valor de douta al final del paso de tiempo actual. Debido a que utilizó el operador de asignación no bloqueante, la ejecución del bloque always continúa con las siguientes declaraciones, que es la instrucción case . Como las asignaciones aquí están bloqueando asignaciones, se ejecutan inmediatamente. Luego, se golpea el #5 (después del caso), por lo que el programador programa la siguiente ejecución para 5 unidades de tiempo en el futuro. Luego pasa a cualquier otra cosa que necesite hacer. Finalmente, vuelve (aún dentro del paso de tiempo X + 5) y completa todas las asignaciones no bloqueantes (como window[i]<=douta ). Es por eso que está viendo lo que parece ser una ejecución no en orden de su bloque always .

    
respondido por el Unn

Lea otras preguntas en las etiquetas