mirror of
https://github.com/myhdl/myhdl.git
synced 2024-12-14 07:44:38 +08:00
57 lines
1.1 KiB
Python
57 lines
1.1 KiB
Python
from myhdl import *
|
|
|
|
from random import randrange
|
|
|
|
def arbiter(grant_vector, request_vector):
|
|
|
|
@always_comb
|
|
def logic():
|
|
grant_vector.next = 0
|
|
for i in range(len(request_vector)):
|
|
if request_vector[i] == 1:
|
|
grant_vector.next[i] = 1
|
|
break
|
|
|
|
return logic
|
|
|
|
|
|
def check():
|
|
|
|
M = 8
|
|
|
|
request_list = [Signal(bool()) for i in range(M)]
|
|
|
|
request_vector = ConcatSignal(*reversed(request_list))
|
|
|
|
grant_vector = Signal(intbv(0)[M:])
|
|
|
|
grant_list = [grant_vector(i) for i in range(M)]
|
|
|
|
arb = arbiter(grant_vector, request_vector)
|
|
|
|
@instance
|
|
def stimulus():
|
|
for i in range(100):
|
|
for j in range(M):
|
|
request_list[j].next = randrange(2)
|
|
yield delay(10)
|
|
if 1 in request_list:
|
|
assert grant_list.index(1) == request_list.index(1)
|
|
assert grant_list.count(0) == M-1
|
|
#print bin(grant_vector, 8), bin(request_vector, 8)
|
|
raise StopSimulation()
|
|
|
|
return arb, stimulus
|
|
|
|
|
|
|
|
sim = Simulation(check())
|
|
sim.run()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|