Este é um design simples que permite a utilização do FPGA de teste de estresse consumindo todos os recursos lógicos disponíveis (LUTS + FFS). O design implementa um Galois LFSR modificado para gerar muitas atividades "caóticas" de comutação / consumo dinâmico de energia para também fontes de alimentação FPGA de teste de estresse.
A maioria dos conceitos para testar os requisitos máximos de utilização / energia usa um registro de mudança simples, onde cada FF (FLIP FLOP / REGISTER) alterna em todos os ciclos. Esse tipo de conceitos é baseado inteiramente no FFS, mas também fornece uma atividade de comutação máxima (apenas nos FFs). fpga_torture também se baseia no consumo de todos os FFs disponíveis. Além disso, também inclui todas as LUTs disponíveis (tabelas de pesquisa) para utilizar todos os recursos lógicos de uso geral do FPGA para produzir um caso de uso mais realista. Além disso, a atividade de comutação resultante é mais caótica (sem alternância monótona), proporcionando um comportamento mais real da vida real.
O código VHDL fornece uma descrição agnóstica de tecnologia, que não usa nenhum primitivo, atributos ou outros elementos específicos do dispositivo/plataforma. Foi testado em treliça (radiante, sinplifypro) e fpGas Intel (Quartus prime).
O design fpga_torture é baseado em uma cadeia de registros, que basicamente implementa um Galois LFSR modificado "circular" (registro linear de mudança de feedback). O tamanho da cadeia é definido pelos projetos NUM_CELLS genéricos. Cada célula consiste em um FF e um LUT. O LUT na posição da cadeia I usa as saídas dos três FFs anteriores para calcular o próximo valor para o FF da célula:
chain(i) <= combine_f(chain(i-3), chain(i-2), chain(i-1));
Um XOR lógico de todas as entradas é usado como função de combinação ( combine_f() ).
Visualização da tecnologia (corte, quartus prime): cálculo do próximo valor para chain[6] via um LUT usando os estados das três chain[3] , chain[4] e chain[5] e combinando-os via XOR:
O início da corrente usa um FF adicional, que alterna todos os ciclos do relógio para "iniciar" a corrente. Após um curto tempo de "inicialização", a cadeia oscila de maneira pseudo-aleatória, gerando atividade de comutação caótica muito alta e consumo dinâmico de energia.
A entidade superior é 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 ; O sinal de redefinição rstn_i é opcional se o FPGA de destino suportar a inicialização do FF via BitStream. Nesse caso, o sinal rstn_i pode ser vinculado a 1 . O sinal de saída out_o é necessário para impedir que a ferramenta de síntese remova toda a lógica de design. Conecte esse sinal a algum pino de saída FPGA acrítico como um pino FPGA LED ou LED ou desconectado.
Simule/teste a configuração de NUM_CELLS usando o TestBench antes de fazer a síntese. Alguns valores NUM_CELLS (como 32) resultam em atividade de comutação máxima (todos os FFs alternando em cada ciclo).
Os projetos fornecem um teste simples de teste ( sim/fpga_torture_tb.vhd ), que pode ser simulado pelo GHDL por meio do script ( sim/ghdl.sh ):
fpga_torture/sim$ sh ghdl.sh
A simulação será executada para 1ms usando um relógio de 100 MHz. Os dados da forma de onda são armazenados em sim/fpga_torture.vcd para que possam ser visualizados usando GTKWave :
fpga_torture/sim$ gtkwave fpga_torture.vcd
O tamanho total da cadeia é definido pelo NUM_CELLS genérico. O design exigirá NUM_CELLS+1 ffs (registros) e NUM_CELLS+2 lut3s (tabelas de pesquisa, 3 entradas cada). Algumas FPGAs/cadeias de ferramentas também podem introduzir algumas LUTs adicionais de rota.
Exemplo de mapeamento: 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