mirror of
https://github.com/myhdl/myhdl.git
synced 2025-01-24 21:52:56 +08:00
184 lines
4.2 KiB
Python
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()
|