【问题标题】:Floating Point Division in System Verilog系统 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

【问题讨论】:

    标签: floating-point verilog division system-verilog integer-division


    【解决方案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?天哪,我的英语演讲很糟糕,你能明白我的意思吗?达
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多