Detectar registros que no se restablecen

8

Cuando escribo Verilog, utilizo una variedad de "linters" que darán errores y advertencias. Estos son mi simulador (ModelSim), mi compilador (Quartus II), junto con un linter (Verilator). Juntos, tengo una buena cobertura para problemas comunes, como desajustes de tamaño de bus y cierres inferidos.

Desafortunadamente, ninguna de las tres herramientas detecta registros que no se están restableciendo. Para ver a qué me refiero, considere lo siguiente.

reg a;
reg b;

always @(posedge clk_i or posedge rst_i) begin
  if(rst_i) begin
    a <= 1'b0; // Reset a
    // Ooops, forgot to reset b
  end else begin
    // Do stuff with a and b
  end
end

¿Cómo puedo hacer que mis herramientas detecten automáticamente registros que no se restablecen?

Randomblue
fuente
2
Los "registros que no se restablecen" no son necesariamente algo malo (al menos en un diseño de silicio), por lo que pueden no ser advertencias en las herramientas de pelusa. En general, solo desea restablecer los registros que deben restablecerse, ya que agregar restablecimientos a los flip flops aumenta su área y la carga en la red de restablecimiento. Si tiene un bus de datos de 256 bits y una señal 'válida' de un bit, no es necesario restablecer los datos si restablece la válida.
Tim
Synplicity (herramienta de síntesis) da advertencias sobre tales cosas. Molesto porque a menudo son intencionales ... pero pueden ayudar con su situación (suponiendo que Synplicity sea Verilog, nunca lo he intentado)
Brian Drummond
La pregunta indica que se están utilizando una variedad de linters, ModelSim, Quartus II y Verilator. Estas herramientas tienen capacidades limitadas de linting y los tipos de problemas que verifican son bastante limitados.
travisbartley

Respuestas:

3

Ninguna de las herramientas que mencionó es una verdadera herramienta de enlace. No se supone que estas herramientas le brinden una buena cobertura.

Vi dos herramientas comerciales de linting y ambas tenían reglas para detectar fracasos sin reinicio.

Veo tres opciones:

  1. Si la respuesta de David Kessner funciona para usted, camino a seguir.
  2. Obtenga una herramienta de linting decente que haga el trabajo.
  3. Escriba una secuencia de comandos que detecte los fallos sin reinicio.

Ahora, el # 2 puede no ser tan simple. No sé si hay buenos linters gratuitos, y los profesionales son caros y te tomará mucho tiempo configurarlos.

# 3 es el enfoque que usaría. Si conoce algún lenguaje de secuencias de comandos (Perl, Python, ...), le llevará un día como máximo escribir una secuencia de comandos que busque fracasos no reiniciados. Si no conoce ningún lenguaje de secuencias de comandos, hay StackOverflow donde puede solicitar ayuda, unos días y ya está. Esto también agregará otra herramienta a su caja de herramientas personal que es muy valorada entre los diseñadores front-end: escribir scripts de procesamiento de texto.

¡Buena suerte!

Vasiliy
fuente
4

Cuando ejecuto Modelsim en mis diseños VHDL, me da advertencias en Time = 0ps sobre la lógica con señales de entrada de tipo 'X' o 'U'. Olvidé el mensaje de advertencia exacto. Revisar estas advertencias puede decirme lo que no he inicializado.


fuente
1

Me baso en pruebas funcionales en lugar de herramientas de linting para esto, tiendo a alternar restablecer y reproducir partes del banco de pruebas. Si el dispositivo funciona correctamente después del reinicio, entonces ha reiniciado el espacio de estado lo suficiente, ¡o su banco de pruebas no es bueno!

shuckc
fuente
0

A veces, las herramientas de diseño generarán una serie de informes que le proporcionarán todo tipo de información interesante. Por ejemplo, Xilinx podría llamar a esto un Informe de mapa, que le indica qué componentes lógicos se asignaron a qué componentes físicos.

En el ejemplo anterior, reg a se asignaría a un FDCE (Flip flop, D, con Clear asíncrono y Clock Enable), mientras que reg b se asignaría a un FDE (Flip flop, D y clock Enable). Esto le dirá que reg b no tiene reinicio.

ajs410
fuente