在System Verilog中计算浮点值的e ^ x?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在System Verilog中计算浮点值的e ^ x?相关的知识,希望对你有一定的参考价值。
我正在构建一个在FPGA上运行的神经网络,最后一个难题是在硬件中运行sigmoid函数。这是:
1/(1 + e^-x)
要么
(atan(x) + 1) / 2
不幸的是,这里的x是一个浮点值(SystemVerilog中的real
值)。
有没有关于如何在SystemVerilog中实现这些功能的提示?
这对我来说真的很混乱,因为这两个函数都很复杂,我甚至不知道从哪里开始实现它们,因为浮点值的复杂性增加了。
答案
一种更简单的方法是为此函数创建一个内存/数组。但是,该选项可能非常低效。
x
应该是内存的输入地址,该位置的值可以是函数的输出。
假设您的函数值如下。 (这只是一个例子)
x = 0 => f(0) = 1
x = 1 => f(0) = 2
x = 2 => f(0) = 3
x = 3 => f(0) = 4
因此,您可以为此创建一个存储输出值的数组。
int a[4] = `{1, 2, 3, 4};
另一答案
我刚刚用Vivado HLS完成了这个,它允许你用C编写电路。这是我的C代码。
#include math.h
void exp(float a[10],b[10])
{
int i;
for(i=0;i<10;i++)
{
b[i] = exp(a[i]);
}
}
但是有一个问题是不可能创建一个未实现的矩阵。也许还有另一种我不知道的方式。
另一答案
正如您似乎意识到的那样,键入real是不可综合的。你需要对类型整数尾数进行操作并单独输入整数指数,并在完成后将它们组合起来,跟踪符号。一旦你照顾(e ^ -x),剩下的应该是直截了当的。
试试这个页面快速解释:https://www.geeksforgeeks.org/floating-point-representation-digital-logic/
并搜索“浮点数字设计”以获得更多解释/示例。
以上是关于在System Verilog中计算浮点值的e ^ x?的主要内容,如果未能解决你的问题,请参考以下文章