Este es un diseño simple que permite la utilización de FPGA para probar el estrés consumiendo todos los recursos lógicos disponibles (LUTS + FFS). El diseño implementa un GALOIS LFSR modificado para generar una gran cantidad de actividad de conmutación "caótica" / consumo de energía dinámica para probar las alimentaciones FPGA de prueba de estrés.
La mayoría de los conceptos para probar los requisitos de utilización máxima / potencia utilizan un registro de desplazamiento simple donde cada FF (FLIP FLOP / Registro) cambia en cada ciclo. Este tipo de conceptos se basan completamente en FFS pero también proporciona una actividad de conmutación máxima (solo en el FFS). fpga_torture también se basa en el consumo de todos los FFS disponibles. Además, también incluye todas las LUT disponibles (tablas de búsqueda) para utilizar todos los recursos lógicos de propósito general de la FPGA para producir un caso de uso más realista. Además, la actividad de conmutación resultante es más caótica (sin alternar monótona) que también proporciona un comportamiento más de la vida real.
El código VHDL proporciona una descripción agnóstica tecnológica, que no utiliza primitivas, atributos u otros elementos específicos de dispositivos/plataforma. Se ha probado en FPGA de red (Radiant, SinplifyPro) e Intel (Quartus Prime).
El diseño fpga_torture se basa en una cadena de registro, que básicamente implementa un GALOIS LFSR modificado "circular" (registro de cambio de retroalimentación lineal). El tamaño de la cadena se define por los diseños NUM_CELLS genéricos. Cada celda consiste en un FF y una LUT. La LUT en la posición de la cadena I utiliza las salidas de los tres FF anteriores para calcular el siguiente valor para el FF de la celda:
chain(i) <= combine_f(chain(i-3), chain(i-2), chain(i-1));
Se utiliza un XOR lógico de todas las entradas como función de combinación ( combine_f() ).
Vista de tecnología (recorte, Quartus Prime): cálculo del siguiente valor para chain[6] a través de una LUT utilizando los estados de los tres registros anteriores chain[3] , chain[4] y chain[5] y combinándolos a través de XOR:
El comienzo de la cadena usa un FF adicional, que alterna cada ciclo de reloj para "comenzar" la cadena. Después de un breve tiempo de "inicialización", la cadena oscila de una manera pseudo-aleatoria que genera una actividad de conmutación caótica muy alta y un consumo de energía dinámica.
La entidad superior es rtl/fpga_torture.vhd :
entity fpga_torture is
generic (
NUM_CELLS : positive -- number of LUT3+FF elements
);
port (
clk_i : in std_ulogic ; -- clock input
rstn_i : in std_ulogic ; -- low-active async reset
out_o : out std_ulogic -- dummy output (LED or unconnected FPGA pin)
);
end fpga_torture ; La señal de reinicio rstn_i es opcional si el objetivo FPGA admite la inicialización de FF a través de BitStream. En este caso, la señal rstn_i puede vincularse a 1 . Se requiere la señal de salida out_o para evitar que la herramienta de síntesis elimine toda la lógica de diseño. Conecte esta señal a un pasador de salida FPGA no crítico como un LED o un pin FPGA no conectado.
Simule/pruebe la configuración de NUM_CELLS utilizando el TestBench antes de hacer síntesis. Algunos valores NUM_CELLS (como 32) dan como resultado la máxima actividad de conmutación (todos los FFS alternando en cada ciclo).
Los proyectos proporcionan un TestBench simple ( sim/fpga_torture_tb.vhd ), que puede ser simulado por GHDL a través del script proporcional ( sim/ghdl.sh ):
fpga_torture/sim$ sh ghdl.sh
La simulación se ejecutará para 1 ms usando un reloj de 100 MHz. Los datos de la forma de onda se almacenan a sim/fpga_torture.vcd para que se pueda ver con gtkwave :
fpga_torture/sim$ gtkwave fpga_torture.vcd
El tamaño total de la cadena se define por el genérico NUM_CELLS . El diseño requerirá NUM_CELLS+1 FFS (registros) y NUM_CELLS+2 lut3s (tablas de búsqueda, 3 entradas cada una). Algunas FPGA/cadenas de herramientas también pueden introducir algunos LUT adicionales de ruta.
Ejemplo de mapeo: Lattice iCE40UP5K-UWG30ITR FPGA, SINPLIFYPRO, NUM_CELLS = 5278
Number of slice registers: 5279 out of 5280 (100%)
Number of I/O registers: 0 out of 63 (0%)
Number of LUT4s: 5280 out of 5280 (100%)
Number of logic LUT4s: 5280
Number of ripple logic: 0 (0 LUT4s)
Number of IO sites used: 3 out of 21 (14%)
Number of Clocks: 1
Net clk_i_c: 5279 loads, 5279 rising, 0 falling (Driver: Port clk_i)
Number of LSRs: 1
Net rstn_i_c_i: 5279 loads, 5279 SLICEs