系统 Verilog 中的浮点除法

Posted

技术标签:

【中文标题】系统 Verilog 中的浮点除法【英文标题】:Floating Point Division in System Verilog 【发布时间】:2014-07-12 13:55:22 【问题描述】:

我想在 System Verilog 中使用 real 数据类型的浮点数。我尝试了以下代码,但它似乎不起作用。我得到了2.000000,我期望2.500000

模块:

module real_check(input [31:0]a, [31:0]b,
                  output real c);
    assign c = a/b;
endmodule

测试台:

module tb_real_check();

real c;
reg[31:0] a, b;
real_check dut(a, b, c);

initial 
begin

  a <= 5;
  b <= 2;
  #50;
  $display("Answer : %f ", c);

end
endmodule

【问题讨论】:

【参考方案1】:

你正在做integer division。在计算int/int (reg[31:0]/reg[31:0]) 时,结果是一个整数。因此,当您计算 5/2 时,您会将 2.5 截断 转换为 2,然后将其转换为浮点数 (real),即 2.000...。如果您想要浮点除法(丢弃小数),您需要将操作数(除数和除数)设为浮点数。

因此,要修复您的代码,您的模块需要将两个浮点数作为输入:

module real_check(input real a, real b,
                  output real c);

在您的测试用例中,您需要将ab 声明为浮点数:

real a, b;

【讨论】:

如果我想要某个位浮点怎么办?我的意思是如果我想要一个浮点数 a = 0.5,我想要它 4 位宽度。我可以得到类似 4'b0100 的东西吗?我正在为 Newton-Raphson 部门建立一个查找表。该表包含 128 个 24 位值,值 X = 48/17 - 32/17*D,其中 D 为 8 位二进制,区域为 [0.5, 1]。我正在努力编写一个 .sv 代码来自动生成查找表。 @ShuaiyuJiang 你的意思是指定精度的浮点数?那么,不是 32 位精度(单精度),而是 4? 对不起,让我简化一下我的问题。我想要一个 24 位输出逻辑 a[23:0] 和 a = 48/17(例如)。我知道如果我只使用逻辑类型,答案将是 2,因为余数被截断。我尝试使用语句“real”,我得到了 = 2.823529 .....问题是,我实际上想要一个二进制逻辑输出,而不是一个实数,有什么方法可以帮助我获得 48/ 的逻辑输出17?天哪,我的英语演讲很糟糕,你能明白我的意思吗?达

以上是关于系统 Verilog 中的浮点除法的主要内容,如果未能解决你的问题,请参考以下文章

verilog中除法运算在modelsim仿真中只要一个时钟周期就能完成,实际上也是这样吗?

在System Verilog中计算浮点值的e ^ x?

Verilog无符号除法器-状态机实现

Verilog无符号除法器-状态机实现

verilog中$disllay中的$是啥意思

verilog问题