Altifigence Academy

17 / 37 · Práctica

Práctica: verifique reset, retorno modular e invariantes del contador

Compare cada flanco con una referencia y separe los efectos de inicialización, reset y ancho.

Circuito y condiciones de observación

Parta de 3 y aplique resetReset Control que devuelve el estado a un valor inicial especificado. Deben definirse su carácter síncrono o asíncrono y su prioridad frente a otros controles. Más información en el primer flanco ascendenteFlanco ascendente Instante en que el reloj pasa de 0 a 1. Se distingue del nivel alto, que abarca todo el intervalo con CLK=1. Más información. Después recorra 0,1,2,3,0. Aunque reset ya esté activo, el valor anterior se conserva hasta el flanco.

Antes de empezar

Prepare un proyecto Desktop de Digital Design Studio con permisos de ejecución. Guarde cada ejemplo como rtl/top.sv en su propia carpeta.

Código SystemVerilog

SystemVerilog
module top (
    input logic clk,
    input logic rst,
    output logic [1:0] count
);
    // Active-high synchronous reset: sampled only at the rising clock edge.
    always_ff @(posedge clk)
        if (rst) count <= 2'b00;
        else count <= count + 2'b01;
endmodule

Ejecución

En New analysis, seleccione Two-state single-clock v1. Clock port es clk y el periodo, 1000ps. Ejecute Preflight y Run RTL simulation con estos valores y compare resultados.

ConfiguraciónValor
Valores iniciales de registros, desde el LSB[true,true]
Reset portrst · Active high · 1 cycle
Maximum cycles / time5 / 5000ps

Estímulos de entrada

json
[
  {
    "inputs": {}
  },
  {
    "inputs": {}
  },
  {
    "inputs": {}
  },
  {
    "inputs": {}
  },
  {
    "inputs": {}
  }
]

Cada columna registra un flanco: entradas previas y estados «después» posteriores a actualizarse. La alineación ordena muestras y no representa retardo de propagaciónRetardo de propagación Tiempo desde un cambio de entrada hasta que la salida se estabiliza en el valor correcto. La equivalencia lógica y el comportamiento temporal son propiedades distintas. Más información. E0–E4 son los flancos de 500,1500,2500,3500,4500ps. Compare todos los estados intermedios, además del final.

Los cinco flancos ascendentes de la práctica
Ver los datos de la forma de onda
Datos de la forma de onda: cada carácter es un intervalo; un punto conserva el estado anterior; p representa un ciclo de reloj.
SeñalForma de ondaValores del bus
flanco23452E0 → E1 → E2 → E3 → E4
reset10...
count antes2345211 → 00 → 01 → 10 → 11
count después2345200 → 01 → 10 → 11 → 00

Comparación de resultados

5 cycles · count=00. Confirme 00 → 01 → 10 → 11 → 00 en 500,1500,2500,3500,4500ps.

Se usa RTL 0/1 de un solo reloj, sin bancos de pruebas #delay, initial o X/Z. La marca de finalización de la lección registra aprendizaje, no una simulación real.

Calcule el estado esperado en cada flanco

El registroRegistro Circuito que almacena varios bits de estado. Los registros síncronos de este curso capturan la entrada especificada en el flanco de reloj. Más información inicia en 3, pero reset prevalece en el primer flanco. Inicialización y reset son conceptos distintos.

Flanco ascendenterstcount antescount después
500ps11100
1500ps00001
2500ps00110
3500ps01011
4500ps01100

Sin reset, cada flanco debe cumplir:

ck+1=(ck+1) mod 4c_{k+1}=(c_k+1)\bmod 4

Comprobar solo el 00 final permite pasar incluso tras estados intermedios incorrectos. Verifique la secuencia completa y la prioridad de reset por separado.

Cambie una condición cada vez

  • Con estado inicial 00, la secuencia posterior al primer reset debe ser idéntica. Así comprueba independencia respecto al estado inicial.
  • Con Reset cycles=2, count debe ser 00 en los dos primeros flancos; el incremento comienza un flanco más tarde.
  • Con ancho de tres bits, el retorno ocurre cada ocho incrementos. Revise también anchos de constantes, matriz de inicialización y duración de ejecución.

Generalice a módulo 10

Cuatro bits representan 0–15; incrementar sin más no pasa de 9 a 0. Defina otra función, con reset prioritario:

ck+1={0rk=10rk=0 ∧ ek=1 ∧ ck≥9ck+1rk=0 ∧ ek=1 ∧ ck<9ckrk=0 ∧ ek=0c_{k+1}=\begin{cases}0 & r_k=1\\0 & r_k=0\ \land\ e_k=1\ \land\ c_k\ge 9\\c_k+1 & r_k=0\ \land\ e_k=1\ \land\ c_k<9\\c_k & r_k=0\ \land\ e_k=0\end{cases}

Los estados no utilizados 10–15 vuelven a 0 al habilitar. Pueden elegirse otras políticas, pero especificación y referencia deben coincidir.

Inténtalo tú

En el contador original de dos bits, después del reset del primer flanco se incrementa 11 veces, sin enable. ¿Cuánto vale count? Calcule sin enumerar estados.

Leer la explicación

Después del reset vale 0 y 11 mod 4=311\bmod4=3, es decir, 11. «Once flancos totales» no equivale a «once incrementos después del reset»: si el primero resetea, solo hay diez incrementos.

Lesson files

counter-top.sv ↓counter-inputs.json ↓

Tu elección se aplica a este navegador. Puedes cambiarla en el pie de página.