概要
windowsでiverilogやってみた。
polyphonyで浮動小数点やってみる。
tanh関数書いてみた。
計算手順
①符号、指数、仮数に分ける。
②指数部から、整数化の指数を求める。
③仮数に掛ける。(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 tanh:
def __init__(self):
self.a = Port(bit32, 'in')
self.b = Port(bit32, 'in')
self.c = Port(bit32, 'out')
self.t = [
0xbf7f0bb0,
0xbf7e8cf1,
0xbf7dccba,
0xbf7ca996,
0xbf7af177,
0xbf785a09,
0xbf747658,
0xbf6ea9b9,
0xbf66197c,
0xbf59a267,
0xbf47dce7,
0xbf2f433d,
0xbf0e908f,
0xbecabea1,
0xbe536260,
0xa6000000,
0x3e536260,
0x3ecabea1,
0x3f0e908f,
0x3f2f433d,
0x3f47dce7,
0x3f59a267,
0x3f66197c,
0x3f6ea9b9,
0x3f747658,
0x3f785a09,
0x3f7af177,
0x3f7ca996,
0x3f7dccba,
0x3f7e8cf1,
0x3f7f0bb0
]
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 = tanh()
@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)
python実行結果
1.0
bf7e8cf1
4.0
bf7af177
以上。