系统 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);
在您的测试用例中,您需要将a
和b
声明为浮点数:
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 中的浮点除法的主要内容,如果未能解决你的问题,请参考以下文章