概要
windowsでiverilogやってみた。
polyphonyで浮動小数点やってみる。
sigmoid関数書いてみた。
計算手順
①符号、指数、仮数に分ける。
②指数部から、整数化の指数を求める。
③仮数に掛ける。(2進数のシフト)
④テーブルから引く。
⑤32bitで返す。
サンプルコード
import polyphony
from polyphony import testbench, module, is_worker_running
from polyphony.io import Port
from polyphony.typing import bit, bit32, bit23, bit24, bit25
@module
class sigmoid:
def __init__(self):
self.a = Port(bit32, 'in')
self.b = Port(bit32, 'in')
self.c = Port(bit32, 'out')
self.t = [
0x3d29ac09,
0x3d4f341f,
0x3d7c80d6,
0x3d997663,
0x3db9f86f,
0x3de08c65,
0x3e06fc01,
0x3e217985,
0x3e400a67,
0x3e62dee1,
0x3e84ffbc,
0x3e9aa0af,
0x3eb21ee3,
0x3ecb2768,
0x3ee54a10,
0x3f000000,
0x3f0d5af8,
0x3f1a6c4c,
0x3f26f08e,
0x3f32afa8,
0x3f3d8022,
0x3f474848,
0x3f4ffd66,
0x3f57a19f,
0x3f5e4100,
0x3f63ee73,
0x3f68c0f2,
0x3f6cd134,
0x3f7037f3,
0x3f730cbe,
0x3f75653f
]
self.append_worker(self.worker)
def float2b(self, a:bit32):
a_sig:bit = (a >> 31) & 0x1
a_exp:bit8 = (a >> 23) & 0xff
a_fra:bit24 = a & 0x7fffff | 0x800000
return (a_sig, a_exp, a_fra)
def b2float(self, a_sig:bit32, a_exp:bit32, a_fra:bit32):
return (a_sig << 31) | (a_exp << 23) | a_fra
def worker(self):
while is_worker_running():
b0:bit32 = self.b.rd()
(b_sig, b_exp, b_fra) = self.float2b(b0)
b_exp = 127 - b_exp + 23
b_exp = b_exp & 0xff
frac:bit48 = b_fra
frac = frac >> b_exp
frac = frac & 0xffffff
if (frac < 31):
frac = self.t[frac]
c0:bit32 = frac
self.c(c0)
m = sigmoid()
@testbench
def test(m):
m.b.wr(0x3f800000)
print ("1.0")
c = m.c.rd()
print('{:08x}'.format(c))
m.b.wr(0x40800000)
print ("4.0")
c = m.c.rd()
print('{:08x}'.format(c))
test(m)
実行結果
1.0
3d4f341f
4.0
3db9f86f
以上。