Ini adalah desain sederhana yang memungkinkan pemanfaatan FPGA uji stres dengan mengkonsumsi semua sumber daya logika yang tersedia (LUTS + FFS). Desain ini mengimplementasikan Galois LFSR yang dimodifikasi untuk menghasilkan banyak aktivitas switching "kacau" / konsumsi daya dinamis untuk juga stres pasokan daya FPGA uji.
Sebagian besar konsep untuk pengujian pemanfaatan maksimal / persyaratan daya menggunakan register shift sederhana di mana setiap FF (flip flop / register) beralih dalam setiap siklus. Konsep semacam ini didasarkan sepenuhnya pada FFS tetapi juga memberikan aktivitas switching maksimum (hanya di FFS). fpga_torture juga didasarkan pada mengonsumsi semua FFS yang tersedia. Selain itu, ini juga mencakup semua LUT yang tersedia (tabel pencarian) untuk memanfaatkan semua sumber daya logika tujuan umum FPGA untuk menghasilkan kasus penggunaan yang lebih realistis. Selain itu, aktivitas switching yang dihasilkan lebih kacau (tidak ada monoton yang berantakan) yang memberikan juga perilaku kehidupan yang lebih nyata.
Kode VHDL memberikan deskripsi teknologi-agnostik, yang tidak menggunakan primitif, atribut, atau elemen khusus perangkat/platform lainnya. Ini telah diuji pada kisi (Radiant, SinplifyPro) dan Intel (Quartus Prime) FPGA.
Desain fpga_torture didasarkan pada rantai register, yang pada dasarnya mengimplementasikan Galois LFSR yang dimodifikasi "melingkar" (register shift umpan balik linier). Ukuran rantai ditentukan oleh desain NUM_CELLS generik. Setiap sel terdiri dari FF dan LUT. LUT AT Rantai I menggunakan output dari tiga FF sebelumnya untuk menghitung nilai berikutnya untuk FF sel:
chain(i) <= combine_f(chain(i-3), chain(i-2), chain(i-1));
XOR logis dari semua input digunakan sebagai fungsi kombinasi ( combine_f() ).
Tampilan Teknologi (Cut-Out, Quartus Prime): Perhitungan Nilai Berikutnya untuk chain[6] melalui satu LUT dengan menggunakan keadaan dari tiga chain[3] , chain[4] dan chain[5] dan menggabungkannya melalui XOR:
Awal rantai menggunakan FF tambahan, yang mengubah setiap siklus clock untuk "memulai" rantai. Setelah waktu "inisialisasi" singkat rantai berosilasi dengan cara pseudo-acak menghasilkan aktivitas switching kacau yang sangat tinggi dan konsumsi daya dinamis.
Entitas teratas adalah 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 ; Sinyal reset rstn_i adalah opsional jika target FPGA mendukung inisialisasi FF melalui bitstream. Dalam hal ini sinyal rstn_i dapat diikat ke 1 . Sinyal output out_o diperlukan untuk mencegah alat sintesis menghapus seluruh logika desain. Hubungkan sinyal ini ke beberapa pin output FPGA FPGA yang tidak kritis seperti LED atau pin FPGA yang tidak terhubung.
Simulasi/uji konfigurasi NUM_CELLS menggunakan testBench sebelum melakukan sintesis. Beberapa nilai NUM_CELLS (seperti 32) menghasilkan aktivitas switching maksimum (semua FFS yang beralih di setiap siklus).
Proyek menyediakan testbench sederhana ( sim/fpga_torture_tb.vhd ), yang dapat disimulasikan oleh GHDL melalui skrip Menyediakan ( sim/ghdl.sh ):
fpga_torture/sim$ sh ghdl.sh
Simulasi akan berjalan untuk 1ms menggunakan jam 100MHz. Data bentuk gelombang disimpan ke sim/fpga_torture.vcd sehingga dapat dilihat menggunakan GTKwave :
fpga_torture/sim$ gtkwave fpga_torture.vcd
Ukuran total rantai ditentukan oleh NUM_CELLS generik. Desain akan membutuhkan NUM_CELLS+1 ffs (register) dan NUM_CELLS+2 lut3s (tabel pencarian, masing-masing 3-input). Beberapa FPGA/Toolchains mungkin juga memperkenalkan beberapa luts rute-through tambahan.
Contoh Pemetaan: 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