1
0
mirror of https://github.com/myhdl/myhdl.git synced 2025-01-24 21:52:56 +08:00
myhdl/scripts/benchmark/test_findmax_sigs.py
2016-03-10 20:27:07 +01:00

184 lines
4.2 KiB
Python

from __future__ import absolute_import
import myhdl
from myhdl import *
from glibc_random import glibc_random
def max2(z, a, b):
@always_comb
def logic():
if a > b:
z.next = a
else:
z.next = b
return logic
def maxn(z, a):
L = len(a)
assert L
assert L % 2 == 0
H = L // 2
W = len(a[0])
if L == 2:
comp2 = max2(z, a[1], a[0])
return comp2
else:
zlo = Signal(intbv(0)[W:])
zhi = Signal(intbv(0)[W:])
complo = maxn(zlo, a[H:])
comphi = maxn(zhi, a[:H])
comp2 = max2(z, zhi, zlo)
return comp2, complo, comphi
def test_findmax():
L = 32
W = 16
clock = Signal(bool())
stopped = Signal(bool())
a0 = Signal(intbv(0)[W:])
a1 = Signal(intbv(0)[W:])
a2 = Signal(intbv(0)[W:])
a3 = Signal(intbv(0)[W:])
a4 = Signal(intbv(0)[W:])
a5 = Signal(intbv(0)[W:])
a6 = Signal(intbv(0)[W:])
a7 = Signal(intbv(0)[W:])
a8 = Signal(intbv(0)[W:])
a9 = Signal(intbv(0)[W:])
a10 = Signal(intbv(0)[W:])
a11 = Signal(intbv(0)[W:])
a12 = Signal(intbv(0)[W:])
a13 = Signal(intbv(0)[W:])
a14 = Signal(intbv(0)[W:])
a15 = Signal(intbv(0)[W:])
a16 = Signal(intbv(0)[W:])
a17 = Signal(intbv(0)[W:])
a18 = Signal(intbv(0)[W:])
a19 = Signal(intbv(0)[W:])
a20 = Signal(intbv(0)[W:])
a21 = Signal(intbv(0)[W:])
a22 = Signal(intbv(0)[W:])
a23 = Signal(intbv(0)[W:])
a24 = Signal(intbv(0)[W:])
a25 = Signal(intbv(0)[W:])
a26 = Signal(intbv(0)[W:])
a27 = Signal(intbv(0)[W:])
a28 = Signal(intbv(0)[W:])
a29 = Signal(intbv(0)[W:])
a30 = Signal(intbv(0)[W:])
a31 = Signal(intbv(0)[W:])
a = [
a0,
a1 ,
a2 ,
a3 ,
a4 ,
a5 ,
a6 ,
a7 ,
a8 ,
a9 ,
a10,
a11,
a12,
a13,
a14,
a15,
a16,
a17,
a18,
a19,
a20,
a21,
a22,
a23,
a24,
a25,
a26,
a27,
a28,
a29,
a30,
a31
]
z = Signal(intbv(0)[W:])
dut = maxn(z, a)
@instance
def clockgen():
clock.next = 0
yield delay(10)
while not stopped:
clock.next = not clock
yield delay(10)
@instance
def stimulus():
stopped.next = 0
exp = intbv(0)[W:]
val = intbv(0)[W:]
v = [intbv(0)[W:] for i in range(L)]
random_word = intbv(0)[32:]
random_word[:] = 93
for i in range(2**18):
exp[:] = 0
for s in range(L):
random_word[:] = glibc_random(random_word)
val[:] = random_word[W:]
if exp < val:
exp[:] = val
v[s][:] = val
a0.next = v[0]
a1.next = v[1]
a2.next = v[2]
a3.next = v[3]
a4.next = v[4]
a5.next = v[5]
a6.next = v[6]
a7.next = v[7]
a8.next = v[8]
a9.next = v[9]
a10.next = v[10]
a11.next = v[11]
a12.next = v[12]
a13.next = v[13]
a14.next = v[14]
a15.next = v[15]
a16.next = v[16]
a17.next = v[17]
a18.next = v[18]
a19.next = v[19]
a20.next = v[20]
a21.next = v[21]
a22.next = v[22]
a23.next = v[23]
a24.next = v[24]
a25.next = v[25]
a26.next = v[26]
a27.next = v[27]
a28.next = v[28]
a29.next = v[29]
a30.next = v[30]
a31.next = v[31]
yield clock.negedge
assert z == exp
stopped.next = 1
yield delay(10)
return dut, clockgen, stimulus
if __name__ == '__main__':
sim = Simulation(test_findmax())
sim.run()