在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 542|回复: 6

[求助] 求助FP16乘法器设计问题

[复制链接]
发表于 2024-7-23 01:07:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
最近一个项目需要用到fp16乘法器,网上找到一段代码但是其中有些疑问,求大佬赐教
第一个问题是exponent = floatA[14:10] + floatB[14:10] - 5'd15 ;这里为什么是减15,不是减30
第二个问题是尾数规格化代码为啥还要考虑到后边的20到12位





  1. module floatMult (floatA,floatB,product);

  2. input [15:0] floatA, floatB;
  3. output reg [15:0] product;

  4. reg sign;
  5. reg signed [5:0] exponent; //6th bit is the sign
  6. reg [9:0] mantissa;
  7. reg [10:0] fractionA, fractionB;        //fraction = {1,mantissa}
  8. reg [21:0] fraction;


  9. always [url=home.php?mod=space&uid=1801890]@[/url] (floatA or floatB) begin
  10.         if (floatA == 0 || floatB == 0) begin
  11.                 product = 0;
  12.         end else begin
  13.                 sign = floatA[15] ^ floatB[15];//异或,相异为1
  14.                 exponent = floatA[14:10] + floatB[14:10] - 5'd15 ;
  15.        
  16.                 fractionA = {1'b1,floatA[9:0]};//显示出隐藏位1来计算
  17.                 fractionB = {1'b1,floatB[9:0]};
  18.                 fraction = fractionA * fractionB;
  19.                
  20.                 if (fraction[21] == 1'b1) begin//规格化,将隐藏位再次隐藏起来
  21.                         fraction = fraction << 1;
  22.                         exponent = exponent + 1;
  23.                 end else if (fraction[20] == 1'b1) begin
  24.                         fraction = fraction << 2;
  25.                         exponent = exponent + 0;
  26.                 end else if (fraction[19] == 1'b1) begin
  27.                         fraction = fraction << 3;
  28.                         exponent = exponent - 1;
  29.                 end else if (fraction[18] == 1'b1) begin
  30.                         fraction = fraction << 4;
  31.                         exponent = exponent - 2;
  32.                 end else if (fraction[17] == 1'b1) begin
  33.                         fraction = fraction << 5;
  34.                         exponent = exponent - 3;
  35.                 end else if (fraction[16] == 1'b1) begin
  36.                         fraction = fraction << 6;
  37.                         exponent = exponent - 4;
  38.                 end else if (fraction[15] == 1'b1) begin
  39.                         fraction = fraction << 7;
  40.                         exponent = exponent - 5;
  41.                 end else if (fraction[14] == 1'b1) begin
  42.                         fraction = fraction << 8;
  43.                         exponent = exponent - 6;
  44.                 end else if (fraction[13] == 1'b1) begin
  45.                         fraction = fraction << 9;
  46.                         exponent = exponent - 7;
  47.                 end else if (fraction[12] == 1'b0) begin
  48.                         fraction = fraction << 10;
  49.                         exponent = exponent - 8;
  50.                 end
  51.        
  52.                 mantissa = fraction[21:12];
  53.                 if(exponent[5]==1'b1) begin //exponent is negative 1.exponent太大了溢出;2.exponent太小了,忽略,直接等于0
  54.                         product=16'b0000000000000000;
  55.                 end
  56.                 else begin
  57.                         product = {sign,exponent[4:0],mantissa};
  58.                 end
  59.         end
  60. end

  61. endmodule


复制代码



发表于 2024-7-23 09:56:57 | 显示全部楼层
1. 因为你就算减去了30,后面还要加上15,等于就是减去了15
2. 考虑这些bit是要把乘完后的mant的从左往右的第一个1找到。
发表于 2024-7-23 10:24:08 | 显示全部楼层
弱弱地问一下:这种乘法器有spec吗?
比如精度是怎么样的? 好像不同大小的数相乘,保留的有效位数不一样啊
16bit有符号数 x 16bit有符号数=最大31bit有符号数,那应该怎么四舍五入呢?
发表于 2024-7-23 10:57:26 | 显示全部楼层


hebut_wolf 发表于 2024-7-23 10:24
弱弱地问一下:这种乘法器有spec吗?
比如精度是怎么样的? 好像不同大小的数相乘,保留的有效位数不一样啊 ...


你说的这种是int类型的吧,float类型的会分各种类型,fp6,fp16,bfp16,fp32等等,这些类型都属于ieee745上有规定的
发表于 2024-7-23 10:59:56 | 显示全部楼层


ht_lch 发表于 2024-7-23 10:57
你说的这种是int类型的吧,float类型的会分各种类型,fp6,fp16,bfp16,fp32等等,这些类型都属于ieee74 ...


多谢了  我研究下ieee745
 楼主| 发表于 2024-7-23 14:57:22 | 显示全部楼层


ht_lch 发表于 2024-7-23 09:56
1. 因为你就算减去了30,后面还要加上15,等于就是减去了15
2. 考虑这些bit是要把乘完后的mant的从左往右的 ...


感谢感谢,明白了
发表于 3 天前 | 显示全部楼层


烈烈风中 发表于 2024-7-23 14:57
感谢感谢,明白了


这个不支持denorm的浮点吧。另外fractionA和B都在MSB pad 0了, fraction也扩位到22了,那么 fraction 21或者20必然有1把?后面的rtl应该没什么用,也找不到leading 1
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-25 02:53 , Processed in 0.019396 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表