Proceso (2) en SystemVerilog --- control de procesos
Hola a todos, continuaremos explicando los diversos métodos de control para procesos en SystemVerilog siguiendo el Proceso (1) del último número: la forma de generar un proceso (haga clic para saltar).
En este número, el hermano Huang Ya le explica principalmente bloque con nombre, wait_order, wait_fork, deshabilitar y la clase integrada en SystemVerilog: clase de proceso.
1. Bloque con nombre
Bloque, también conocido como bloque de declaraciones, SystemVerilog proporciona dos tipos de bloques de declaraciones, a saber, bloques de declaraciones secuenciales representados por inicio...fin y declaraciones concurrentes. bloques representados por fork...join.
Estos dos tipos de bloques se utilizan comúnmente en proyectos de ingeniería, sin embargo, quizás no sepas que los bloques también pueden tener nombre. Al igual que cada uno de nuestros nombres, el nombre es un identificador de cada uno de nosotros.
A través de este identificador podemos acceder a variables, parámetros, etc. del bloque.
En la Figura 1, hay dos bloques con nombre en el inicio...final inicial, a saber, block_a para ejecución secuencial y block_b para ejecución concurrente.
Podemos escribir el nombre de identificación al principio y al final del bloque, o podemos escribirlo solo al principio
Si hay nombres de identificación correspondientes al principio y al final; del bloque, entonces los dos nombres de identificación deben ser iguales; de lo contrario, se informará un error de compilación.
También podemos ver en las Figuras 1 y 2 que el alcance de las variables y parámetros de tipo int están dentro del alcance de sus respectivos bloques.
Por lo tanto, debemos recordar que si necesitamos acceder a variables o parámetros en el bloque, debemos nombrar el bloque, y las variables y parámetros en el bloque son independientes entre sí.
2. wait_order, wait fork
SystemVerilog proporciona dos tipos principales de métodos de control de procesos, a saber, esperar y deshabilitar.
Esperar incluye tres subcategorías: esperar, esperar_orden y esperar bifurcación.
Entre ellos, esperar es relativamente simple, por lo que no entraré en detalles aquí. El hermano Huang Ya solo presenta los dos últimos.
Entonces, ¿qué es wait_order?
El hermano Huang Ya resume: wait_order bloqueará y esperará a que se activen múltiples eventos, y requiere que el orden de aparición de estos eventos sea coherente con la configuración.
¿Cómo entender esta frase? Echemos un vistazo a un ejemplo:
El ejemplo contiene 3 eventos. Los 3 eventos se activan en 3 procesos concurrentes. event_1 se activa en la unidad de tiempo 50 y event_2 se activa en la unidad de tiempo 30. Se activa en la unidad de tiempo número 100.
wait_order debe bloquearse hasta que se activen tres eventos en el orden de event_2, event_1 y event_3 antes de que pueda continuar. Así es como se usa wait_order.
Otro uso importante en espera es la bifurcación de espera. Con respecto a su uso, el hermano Huang Ya resumió tres oraciones:
① La bifurcación de espera hará que el proceso de llamada se bloquee hasta que finalicen todos los procesos secundarios.
② El propósito de la bifurcación de espera es garantizar que todos los procesos secundarios finalicen
③ La bifurcación de espera actúa sobre los procesos secundarios del proceso principal, sin incluir los procesos secundarios del proceso; .
El bloque de declaración inicial en la Figura 4 contiene 4 subprocesos, proc_1~proc_4.
Entre ellos, el subproceso proc_4 también contiene un subproceso proc_4_1, que es el subproceso del subproceso del bloque de declaración inicial.
De acuerdo con los tres puntos resumidos anteriormente por el hermano Huang Ya, la bifurcación de espera solo debería necesitar esperar hasta que el segundo proceso hijo: proc_2 finalice la ejecución, porque la bifurcación de espera solo afectará al proceso hijo, no al hijo. Un proceso hijo de un proceso (ya sea un proceso generado por fork…join, fork…join_any o fork…join_none).
Echemos un vistazo a los resultados de la simulación para verificar nuestra teoría:
Efectivamente, esperar a que la bifurcación solo espere hasta proc_2, y "esperar a que finalice la bifurcación" se imprime en la unidad de tiempo número 200. .
3. Deshabilitar, deshabilitar bifurcación
Después de hablar sobre la espera anterior, hablemos del segundo tipo más grande de método de control de procesos en SystemVerilog: deshabilitar.
Los diversos métodos comúnmente utilizados de la declaración de desactivación incluyen: deshabilitar bloque_nombre, deshabilitar nombre_tarea, deshabilitar bifurcación, etc. Llamar a la declaración deshabilitada finalizará el proceso especificado.
En la Figura 6, se llama a enable para terminar el bloque correspondiente con el nombre de identificación. Como se puede ver en la captura de pantalla de la simulación, el bloque_1 no terminó normalmente, sino que terminó a mitad de camino.
En la figura anterior, deshabilitar proc_a equivale a regresar, lo que finalizará directamente la tarea actual.
En cuanto a la bifurcación deshabilitada, este es el tipo más utilizado en nuestros proyectos de ingeniería, y también es el tipo más fácil de meterse en problemas. Recomiendo a todos que estudien el uso de la bifurcación deshabilitada y lean un artículo. por Brother P: desactiva la bifurcación, ¿realmente sabes cómo usarla?
Los estudiantes interesados pueden hacer clic y echar un vistazo. Tiene una descripción muy detallada. El hermano Huang Ya no entrará en detalles aquí.
4. Clase incorporada: proceso
SystemVerilog tiene una clase incorporada que puede acceder y controlar el proceso. Esta clase es el proceso. Prototipo de clase:
La clase de proceso define un estado de variable de enumeración, que representa varios estados de ejecución del proceso actual: FINALIZADO, EN EJECUCIÓN, EN ESPERA, SUSPENDIDO y MATADO.
Además, también se declaran varias tareas y funciones. Podemos entenderlas brevemente a través de la siguiente tabla:
Algunas personas pueden preguntar, ¿deberíamos recordar tantos métodos?
El hermano Huang Ya no lo cree así. Solo necesita recordar algunos métodos de uso común: self (), status (), Kill (). Echemos un vistazo a un ejemplo para profundizar la discusión. Comprensión:
La Figura 9 muestra el uso de estos tres métodos. Obtenga el control del proceso a través de self() y luego páselo a las dos clases de proceso definidas;
Llame. status() Se puede obtener el estado de ejecución de los procesos proceso_1 y proceso_2. A las 100 unidades de tiempo, el proceso_1 ha completado la ejecución, mientras que el proceso_2 está en un estado bloqueado;
Cuando pasan 100 unidades de tiempo nuevamente, se elimina kill(). Se puede ver a partir de esto que para finalizar un proceso, además de deshabilitar y deshabilitar la bifurcación, también puede llamar a Process.kill ().
Resumen
Eso es todo el proceso. Repasemos los puntos clave de hoy:
1. Los bloques pueden nombrarse y, después de nombrarlos, pueden identificarse. Puede acceder a las variables y parámetros dentro del bloque por nombre, y también puede finalizar este bloque deshabilitando el bloque_nombre.
2. Los dos principales métodos de control del proceso: esperar y deshabilitar.
3. La clase incorporada SystemVerilog, clase de proceso, puede acceder al proceso y controlarlo a través de la clase de proceso.
4. Tres formas de finalizar el proceso: deshabilitar, deshabilitar fork, process.kill().
El tiempo feliz siempre es corto, es hora de decir adiós nuevamente, la próxima vez Brother Yellow Duck te traerá un nuevo tema.
No te apresures a preguntar cuál es el nuevo tema, mantenlo en suspenso, ¡te traeremos nuevas sorpresas la próxima vez!