Cambiar los valores de la señal en la simulación de Verilog

Uso el comando "forzar" en modelsim para forzar una señal interna a un valor específico (no entradas primarias). A veces, el valor que fuerzo es el mismo que el valor original.

¿Hay algún comando que pueda cambiar el valor de la señal en modelsim o cualquier otro simulador de verilog? En ese caso, definitivamente cambiaré el valor de la señal.

¿Quieres hacerlo usando un script? ¿O simplemente forzarlo? Porque siempre puedes forzar una señal desde la GUI. De lo contrario, puede forzar una señal escribiéndola o en su script de simulación.
@FarhadA, quiero forzarlo en mi script en lugar de en mi banco de pruebas. Porque tengo un algoritmo para manipular mucho las señales. Si lo hago en el banco de pruebas, tengo que compilar el banco de pruebas cada vez que actualizo las señales forzadas.
@rex si compilar su banco de pruebas lleva demasiado tiempo, probablemente desee refactorizar sus pruebas. Considero que los beneficios de probar en el mismo idioma (en lugar de golpearme la cabeza contra TCL) valen la pena. Pero luego mis bancos de prueba toman un tiempo insignificante para compilar...
@MartinThompson, tienes un buen punto. Tengo un montón de equipos de prueba. Puedo escribirlos en un banco de pruebas, pero tal vez sea un dolor de cabeza ejecutar y registrar las señales (me preocupaba que el simulador fallara). Pero también necesito cambiar la señal sin saber su valor, lo que significa que solo puedo hacer esto en el banco de pruebas en lugar del archivo tcl. Entonces necesito compilar muchos bancos de prueba. Parece que de ninguna manera será más rápido que forzarlo desde tcl, pero tcl no puede cambiar el valor de la señal...
Si tiene muchos conjuntos de prueba, no todos tienen que ir en un banco de prueba. Parece (sin conocer todos los detalles de su configuración) que necesita reorganizar un poco sus pruebas... ¿quizás?

Respuestas (2)

No hay comandos de simulador que yo sepa para invertir una señal. Sin embargo, si está haciendo la fuerza desde dentro de la fuente de Verilog, simplemente debería poder hacer esto:

force path.to.signal = ~path.to.signal;

Si lo está forzando desde el simulador, probablemente pueda hacer el equivalente de la declaración anterior en TCL. Necesitaría obtener el valor actual, invertirlo y luego aplicar una fuerza con el valor invertido.

Supongo que esta es la única forma de cambiar la señal sin saber su valor.

En ModelSim el comando para forzar una señal es:

force signal_name value time

Por ejemplo:

force reset 0 100

O si desea una forma más avanzada de hacerlo, suponiendo que su tiempo esté configurado en 1 ns:

force clk 0 20, 1 20 -repeat 100

Puede obtener más información si lee el manual: ModelSim SE Command Reference

Aquí está el extracto de ese archivo:

    force input1 0
Forces input1 to 0 at the current simulator time.
    force bus1 01XZ 100 ns
Forces bus1 to 01XZ at 100 nanoseconds after the current simulator time.
    force bus1 16#f @200
Forces bus1 to 16#F at the absolute time 200 measured in the resolution units selected at simulation start-up.
    force input1 1 10, 0 20 -r 100
Forces input1 to 1 at 10 time units after the current simulation time and to 0 at 20 time units after the current simulation time. This cycle repeats starting at 100 time units after the current simulation time, so the next transition is to 1 at 100 time units after the current simulation time.
    force input1 1 10 ns, 0 {20 ns} -r 100ns
Similar to the previous example, but also
specifies the time units. Time unit expressions
preceding the "-r" must be placed in curly braces.
    **force s 1 0, 0 100 -repeat 200 -cancel 1000**
Forces signals to alternate between values 1 and 0 every 100 time units until time 1000.
Cancellation occurs at the last simulation delta cycle of a time unit. So,
    force s 1 0 -cancel 0
will force signals to 1 for the duration of the current time period.
    when {/mydut/siga = 10#1}
       {
        force -deposit /mydut/siga 10#85
       }
Forces siga to decimal value 85 whenever the value on the signal is 1.
Gracias por la respuesta. Yo se como hacer eso. Pero eso no es lo que pregunté.
Bueno, si revisa el documento al que me referí, encontrará el comando FORCE en TCL que hace EXACTAMENTE lo que está buscando. Puede engañar a la jerarquía forzando la señal en la GUI, luego copie el comando de la ventana de transcripción y colóquelo en su archivo TCL.
Sí. Tienes razón. Creo que la pregunta no es lo suficientemente clara. Me refiero a cambiar la señal sin saber el valor del valor de la señal. Tomaría la solución provista por dwikle esta vez. Gracias por tu ayuda también.