这是一个简单的设计,可以通过消耗所有可用逻辑资源(LUTS + FFS)来强调FPGA利用率。该设计实现了修改的Galois LFSR,以生成许多“混乱”的切换活动 /动态功耗,以应对fpga电源。
测试最大利用率 /功率要求的大多数概念都使用一个简单的移位寄存器,每个FF(flip flop /寄存器)在每个周期中都可以切换。这些概念完全基于FF,但也提供了最大的切换活动(仅在FFS中)。 fpga_torture还基于消费所有可用的FF。此外,它还包括所有可用的LUTS(查找表),以利用FPGA的所有通用逻辑资源来生产更现实的用例。此外,由此产生的切换活动更加混乱(无单调切换)也提供了更现实的行为。
VHDL代码提供了技术 - 静态描述,该描述不使用任何原始属性,属性或其他设备/平台特定的元素。它已在晶格(Radiant,Sinplifypro)和Intel(Quartus Prime)FPGA上进行了测试。
fpga_torture设计基于寄存器链,该寄存器链基本上实现了“圆形”修改的Galois LFSR(线性反馈移位寄存器)。链的大小由Designs NUM_CELLS通用定义。每个细胞由FF和LUT组成。 LUT在链位置我使用前三个FF的输出来计算单元格的下一个值:
chain(i) <= combine_f(chain(i-3), chain(i-2), chain(i-1));
所有输入的逻辑XOR用作组合函数( combine_f() )。
技术视图(剪切,Quartus Prime):通过使用前三个寄存器chain[3] , chain[4]和chain[5]的状态通过一个LUT计算寄存器chain[6] ,并通过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 ;如果目标FPGA通过Bitstream支持FF初始化,则重置信号rstn_i是可选的。在这种情况下, rstn_i信号可以绑定到1 。需要out_o输出信号以防止合成工具删除整个设计逻辑。将此信号连接到一些非批判性的FPGA输出引脚,例如LED或未连接的FPGA引脚。
进行合成之前,请使用TestBench仿真/测试NUM_CELLS的配置。一些NUM_CELLS值(例如32)会导致最大的切换活动(所有FF在每个周期中都在切换)。
这些项目提供了一个简单的测试台( sim/fpga_torture_tb.vhd ),可以通过GHDL通过提供脚本( sim/ghdl.sh )模拟该项目:
fpga_torture/sim$ sh ghdl.sh
模拟将使用100MHz时钟以1ms的速度运行。波形数据存储到sim/fpga_torture.vcd因此可以使用GTKWAVE查看:
fpga_torture/sim$ gtkwave fpga_torture.vcd
链的总大小由NUM_CELLS通用定义。该设计将需要NUM_CELLS+1 ffs(寄存器)和NUM_CELLS+2 lut3s(查找表,每个3输入)。一些FPGA/工具链也可能会引入一些其他路线。
映射示例: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