文/刘明,佳沐,许志良,傅文佳,张霆廷
基于Gold-Schmidt 迭代算法,笔者采用IEEE-754(2008)标准中的128 位浮点标准数据格式,模块化地实现了浮点平方根运算单元的VLSI 电路设计。随后,笔者对实现的128 位浮点平方根运算单元进行了仿真测试,结果表明,本文设计的硬件运算单元满足全浮点域的精度要求。接着,笔者使用TSMC 65nm 标准工艺库对该硬件运算单元做了逻辑综合,结果表明,本文设计的硬件运算单元工作频率可达800MHz,完成一次完整的128 位浮点计算需要4 个时钟周期,最大计算误差小于1 比特位,硬件电路面积为0.8216mm2,硬件功耗为13.87MW。
目前常见的开方算法有以下几类。
(1)数字递归法。该方法操作简单,易于实现,但延迟较长,这点在精度较大的浮点数运算过程中表现得尤为明显。
(2)函数迭代法。如Newton–Raphson 法、Householders 法和Gold-Schmidt 迭代算法,此类算法需要更多的硬件成本,却不能保证运算结果的完全准确,此类算法的优点是快速、可扩展、易于流水线化。
(3)高基数运算法。该方法运算速度快,但实现起来较为复杂,且通常需要消耗相当大的硬件面积。
(4)查表法。该方法简单、快速,但硬件成本较高,可扩展性较差。
基于此,本文采用Gold-Schmidt 法来设计并实现高精度、低时延的浮点平方根运算单元。Gold-Schmidt 法的迭代公式如下:
式(1)中,ri表示平方根变量;xi表示调变因子x 变量;hi表示调变因子h 变量。
初始值设置如式(2)所示:
其 中,r0≈1/X1/2是1/X1/2的近似值(查表获取)。经过n 次迭代,笔者得到xn=X1/2。此时,笔者结合式(1),得到Gold-Schmidt 法的迭代示意图,如图1 所示。
基于Gold-Schmidt 法的浮点平方根运算单元的结构如图2所示。
如图2 所示,sqrt_preconfig模块主要负责对输入的128 位浮点数data 进行异常检测与预处理。首先,该模块会将输入的data分解为符号data_in_sign、指数data_in_exp以及尾数data_in_m,并计算指数偏差值exp_out;随后,进行异常检测,输出异常检测旗帜信号exception。exception 有5种可能的值:3′b000(输入不存在异常情况),3′b001(输入为非数,输出为非数),3′b010(输入为负数,输出为非数),3′b011(输入为正无穷,输出为正无穷),3′b100(输入为0,输出为0)。同时,在检查输入浮点数的指数为奇数还是偶数后,该模块还会调整尾数部分,例如将其由113 位调整为116 位,并输出mantissa_out,以便后续sqrt_mantissa_calculation 模块的分组计算。
在本研究中,仿真验证共分为三大部分,分别是浮点异常验证、边界数据验证和逻辑功能验证。其中,浮点异常验证主要针对的是输入的非数(NaN)、正负无穷、0 或者不符合定义域的输入数值,边界数据验证的一般是定义域边界的输入数值,而逻辑功能验证的则是定义域内的浮点正规数。
基于此,笔者对此次设计的浮点平方根运算单元进行大量的随机数据测试,测试数据包括非数、正负无穷、0、浮点正规数以及边界数。仿真验证结果如表1 所示。
表1 浮点平方根运算单元仿真验证结果对比
在电路设计得到仿真验证之后,本文根据TSMC 65nm标准工艺库,在0.9V 的工作电压下完成了逻辑实现和综合,最终得到有关硬件的工作频率、面积等逻辑综合结果,如表2 所示。
表2 浮点平方根运算单元综合结果
本文对128 位浮点平方根运算单元实现了RTL 级(寄存器传输级)建模,并基于ModelSim硬件仿真平台完成了平方根运算单元的逻辑功能的仿真验证;在TSMC 65nm的标准工艺完成了逻辑实现和综合。结果表明,本文所设计的浮点平方根运算硬件单元完成一次128位浮点计算需要4 个时钟周期,计算误差最大不超过128 位浮点尾数的最低位,满足精度高、延迟低的特征。DC 逻辑综合结果表明,当电路的工作频率为800MHz 时,硬件电路面积为0.8216mm2,功耗为13.87MW。