นี่คือการออกแบบอย่างง่ายที่ช่วยให้การทดสอบความเครียด FPGA ใช้ประโยชน์จากการใช้ทรัพยากรตรรกะที่มีอยู่ ทั้งหมด (LUTS + FFS) การออกแบบใช้ Galois LFSR ที่ได้รับการดัดแปลงเพื่อสร้างกิจกรรมการสลับ "วุ่นวาย" / การใช้พลังงานแบบไดนามิกจำนวนมากเพื่อทดสอบการจ่ายไฟ FPGA
แนวคิดส่วนใหญ่สำหรับการทดสอบความต้องการการใช้ประโยชน์สูงสุด / ความต้องการพลังงานใช้การลงทะเบียนกะอย่างง่ายซึ่งแต่ละ FF (Flip Flop / register) สลับในทุกรอบ แนวคิดประเภทนี้ขึ้นอยู่กับ FF ทั้งหมด แต่ยังให้กิจกรรมการสลับสูงสุด (ใน FFS เท่านั้น) fpga_torture ยังขึ้นอยู่กับการบริโภค FFS ที่มีอยู่ทั้งหมด นอกจากนี้ยังมี LUTs ที่มีอยู่ทั้งหมด (ตารางค้นหา) เพื่อใช้ทรัพยากรตรรกะวัตถุประสงค์ทั่วไปของ FPGA ทั้งหมด เพื่อสร้างกรณีการใช้งานที่สมจริงยิ่งขึ้น นอกจากนี้กิจกรรมการสลับที่เกิดขึ้นนั้นวุ่นวายมากขึ้น (ไม่มีการสลับเสียงเดียว) ที่ให้พฤติกรรมในชีวิตจริงมากขึ้น
รหัส VHDL ให้คำอธิบายที่ไม่เชื่อเรื่องเทคโนโลยีซึ่งไม่ได้ใช้คุณสมบัติดั้งเดิมแอตทริบิวต์หรือองค์ประกอบอุปกรณ์/แพลตฟอร์มอื่น ๆ มันได้รับการทดสอบใน Lattice (Radiant, SinplifyPro) และ Intel (Quartus Prime) FPGAs
การออกแบบ fpga_torture นั้นขึ้นอยู่กับห่วงโซ่การลงทะเบียนซึ่งโดยทั่วไปใช้ Galois LFSR ที่ได้รับการดัดแปลง "แบบวงกลม" (การลงทะเบียนกะการตอบกลับเชิงเส้น) ขนาดของโซ่ถูกกำหนดโดยการออกแบบ NUM_CELLS ทั่วไป แต่ละเซลล์ประกอบด้วย FF และ LUT LUT ที่ตำแหน่งห่วงโซ่ ฉัน ใช้เอาต์พุตจาก FFS สามตัวก่อนหน้านี้เพื่อคำนวณค่าถัดไปสำหรับ FF ของเซลล์:
chain(i) <= combine_f(chain(i-3), chain(i-2), chain(i-1));
XOR เชิงตรรกะของอินพุตทั้งหมดใช้เป็นฟังก์ชันการรวมกัน ( combine_f() )
มุมมองเทคโนโลยี (ตัดออก, Quartus prime): การคำนวณค่าถัดไปสำหรับการลงทะเบียน chain[6] ผ่าน LUT หนึ่ง LUT โดยใช้สถานะของ chain[3] , chain[4] และ chain[5] และรวมเข้าด้วยกันผ่าน XOR:
จุดเริ่มต้นของห่วงโซ่ใช้ FF เพิ่มเติมซึ่งจะสลับทุกรอบนาฬิกาเพื่อ "เริ่ม" โซ่ หลังจากเวลาสั้น ๆ "เริ่มต้น" โซ่แกว่งในวิธีหลอกแบบสุ่มทำให้เกิดกิจกรรมการสลับที่วุ่นวายสูงมากและการใช้พลังงานแบบไดนามิก
เอนทิตีด้านบนคือ 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 ; สัญญาณรีเซ็ต rstn_i เป็นตัวเลือกหากเป้าหมาย FPGA รองรับการเริ่มต้น FF ผ่าน Bitstream ในกรณีนี้สัญญาณ rstn_i สามารถเชื่อมโยงกับ 1 สัญญาณเอาต์พุต out_o เป็นสิ่งจำเป็นเพื่อป้องกันไม่ให้เครื่องมือการสังเคราะห์ลบตรรกะการออกแบบทั้งหมด เชื่อมต่อสัญญาณนี้เข้ากับหมุดเอาต์พุต FPGA ที่ไม่สำคัญบางอย่างเช่น LED หรือพิน FPGA ที่ไม่ได้เชื่อมต่อ
จำลอง/ทดสอบการกำหนดค่าของ NUM_CELLS โดยใช้ testbench ก่อนทำการสังเคราะห์ ค่า NUM_CELLS บางค่า (เช่น 32) ส่งผลให้เกิดกิจกรรมการสลับ สูงสุด (FF ทั้งหมดสลับในทุกรอบ)
โครงการนี้ให้การทดสอบอย่างง่าย ( sim/fpga_torture_tb.vhd ) ซึ่งสามารถจำลองได้โดย GHDL ผ่านสคริปต์ที่ให้ ( sim/ghdl.sh ):
fpga_torture/sim$ sh ghdl.sh
การจำลองจะทำงานเป็นเวลา 1ms โดยใช้นาฬิกา 100MHz ข้อมูลรูปคลื่นจะถูกเก็บไว้ใน sim/fpga_torture.vcd เพื่อให้สามารถดูได้โดยใช้ GTKWave :
fpga_torture/sim$ gtkwave fpga_torture.vcd
ขนาดทั้งหมดของโซ่ถูกกำหนดโดย NUM_CELLS ทั่วไป การออกแบบจะต้องใช้ NUM_CELLS+1 ffs (ลงทะเบียน) และ NUM_CELLS+2 lut3s (ตารางค้นหา, 3 อินพุตแต่ละ) FPGAS/เครื่องมือบางอย่างอาจแนะนำ LUTs ผ่านเส้นทางเพิ่มเติม
ตัวอย่างการแม็พ: 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