System Verilog中的浮点数除法

3
我希望使用 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个回答

8
您正在进行整数除法。当计算(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这样的东西吗?我正在为牛顿-拉弗森除法构建查找表。该表包含128个24位值,值X = 48/17 - 32/17*D,其中D是8位二进制数,区间为[0.5,1]。我正在努力编写一个.sv代码来自动生成查找表。 - Shuaiyu Jiang
@ShuaiyuJiang 你的意思是指定精度的浮点数吗?因此,与其说是32位精度(单精度),你有4位? - Cole Tobin
抱歉,让我简化我的问题。我想要一个24位输出逻辑 a[23:0],并且 a = 48/17(例如)。我知道如果我只使用逻辑类型,答案将是2,因为余数被截断了。我试过使用“real”语句,我得到了 a = 2.823529.....的结果。问题是,我实际上想要一个二进制逻辑输出,而不是一个实数,有没有任何方法可以帮助我获得48/17的逻辑输出?天哪,我的英语表达很糟糕,你能理解我的意思吗?TAT - Shuaiyu Jiang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接