mirror of
https://github.com/myhdl/myhdl.git
synced 2024-12-14 07:44:38 +08:00
added
This commit is contained in:
parent
a26c42185a
commit
1aa24190e0
221
myhdl/test/toVHDL/test_fsm.py
Normal file
221
myhdl/test/toVHDL/test_fsm.py
Normal file
@ -0,0 +1,221 @@
|
||||
import os
|
||||
path = os.path
|
||||
|
||||
from myhdl import *
|
||||
from myhdl.test import verifyConversion
|
||||
|
||||
# SEARCH, CONFIRM, SYNC = range(3)
|
||||
ACTIVE_LOW = bool(0)
|
||||
FRAME_SIZE = 8
|
||||
t_State_b = enum('SEARCH', 'CONFIRM', 'SYNC')
|
||||
t_State_oh = enum('SEARCH', 'CONFIRM', 'SYNC', encoding="one_hot")
|
||||
t_State_oc = enum('SEARCH', 'CONFIRM', 'SYNC', encoding="one_cold")
|
||||
|
||||
def FramerCtrl(SOF, state, syncFlag, clk, reset_n, t_State):
|
||||
|
||||
""" Framing control FSM.
|
||||
|
||||
SOF -- start-of-frame output bit
|
||||
state -- FramerState output
|
||||
syncFlag -- sync pattern found indication input
|
||||
clk -- clock input
|
||||
reset_n -- active low reset
|
||||
|
||||
"""
|
||||
|
||||
index = Signal(intbv(0)[8:]) # position in frame
|
||||
|
||||
@always(clk.posedge, reset_n.negedge)
|
||||
def FSM():
|
||||
if reset_n == ACTIVE_LOW:
|
||||
SOF.next = 0
|
||||
index.next = 0
|
||||
state.next = t_State.SEARCH
|
||||
else:
|
||||
index.next = (index + 1) % FRAME_SIZE
|
||||
SOF.next = 0
|
||||
if state == t_State.SEARCH:
|
||||
index.next = 1
|
||||
if syncFlag:
|
||||
state.next = t_State.CONFIRM
|
||||
elif state == t_State.CONFIRM:
|
||||
if index == 0:
|
||||
if syncFlag:
|
||||
state.next = t_State.SYNC
|
||||
else:
|
||||
state.next = t_State.SEARCH
|
||||
elif state == t_State.SYNC:
|
||||
if index == 0:
|
||||
if not syncFlag:
|
||||
state.next = t_State.SEARCH
|
||||
SOF.next = (index == FRAME_SIZE-1)
|
||||
else:
|
||||
raise ValueError("Undefined state")
|
||||
|
||||
return FSM
|
||||
|
||||
|
||||
def FramerCtrl_alt(SOF, state, syncFlag, clk, reset_n, t_State):
|
||||
|
||||
""" Framing control FSM.
|
||||
|
||||
SOF -- start-of-frame output bit
|
||||
state -- FramerState output
|
||||
syncFlag -- sync pattern found indication input
|
||||
clk -- clock input
|
||||
reset_n -- active low reset
|
||||
|
||||
"""
|
||||
|
||||
|
||||
def FSM():
|
||||
index = intbv(0)[8:] # position in frame
|
||||
state_var = t_State.SEARCH
|
||||
while True:
|
||||
yield clk.posedge, reset_n.negedge
|
||||
if reset_n == ACTIVE_LOW:
|
||||
SOF.next = 0
|
||||
index[:] = 0
|
||||
state_var = t_State.SEARCH
|
||||
state.next = t_State.SEARCH
|
||||
else:
|
||||
SOF_var = 0
|
||||
if state == t_State.SEARCH:
|
||||
index[:] = 0
|
||||
if syncFlag:
|
||||
state_var = t_State.CONFIRM
|
||||
elif state == t_State.CONFIRM:
|
||||
if index == 0:
|
||||
if syncFlag:
|
||||
state_var = t_State.SYNC
|
||||
else:
|
||||
state_var = t_State.SEARCH
|
||||
elif state == t_State.SYNC:
|
||||
if index == 0:
|
||||
if not syncFlag:
|
||||
state_var = t_State.SEARCH
|
||||
SOF_var = (index == FRAME_SIZE-1)
|
||||
else:
|
||||
raise ValueError("Undefined state")
|
||||
index[:]= (index + 1) % FRAME_SIZE
|
||||
SOF.next = SOF_var
|
||||
state.next = state_var
|
||||
|
||||
FSM_1 = FSM()
|
||||
return FSM_1
|
||||
|
||||
|
||||
def FramerCtrl_ref(SOF, state, syncFlag, clk, reset_n, t_State):
|
||||
|
||||
""" Framing control FSM.
|
||||
|
||||
SOF -- start-of-frame output bit
|
||||
state -- FramerState output
|
||||
syncFlag -- sync pattern found indication input
|
||||
clk -- clock input
|
||||
reset_n -- active low reset
|
||||
|
||||
"""
|
||||
|
||||
index = intbv(0, min=0, max=8) # position in frame
|
||||
while 1:
|
||||
yield clk.posedge, reset_n.negedge
|
||||
if reset_n == ACTIVE_LOW:
|
||||
SOF.next = 0
|
||||
index[:] = 0
|
||||
state.next = t_State.SEARCH
|
||||
else:
|
||||
SOF.next = 0
|
||||
if state == t_State.SEARCH:
|
||||
index[:] = 0
|
||||
if syncFlag:
|
||||
state.next = t_State.CONFIRM
|
||||
elif state == t_State.CONFIRM:
|
||||
if index == 0:
|
||||
if syncFlag:
|
||||
state.next = t_State.SYNC
|
||||
else:
|
||||
state.next = t_State.SEARCH
|
||||
elif state == t_State.SYNC:
|
||||
if index == 0:
|
||||
if not syncFlag:
|
||||
state.next = t_State.SEARCH
|
||||
SOF.next = (index == FRAME_SIZE-1)
|
||||
else:
|
||||
raise ValueError("Undefined state")
|
||||
index[:]= (index + 1) % FRAME_SIZE
|
||||
|
||||
|
||||
|
||||
|
||||
def FSMBench(FramerCtrl, t_State):
|
||||
|
||||
SOF = Signal(bool(0))
|
||||
SOF_v = Signal(bool(0))
|
||||
syncFlag = Signal(bool(0))
|
||||
clk = Signal(bool(0))
|
||||
reset_n = Signal(bool(1))
|
||||
state = Signal(t_State.SEARCH)
|
||||
state_v = Signal(intbv(0)[8:])
|
||||
|
||||
framerctrl_inst = FramerCtrl(SOF, state, syncFlag, clk, reset_n, t_State)
|
||||
|
||||
def clkgen():
|
||||
clk.next = 0
|
||||
reset_n.next = 1
|
||||
yield delay(10)
|
||||
reset_n.next = 0
|
||||
yield delay(10)
|
||||
reset_n.next = 1
|
||||
yield delay(10)
|
||||
for i in range(1000):
|
||||
yield delay(10)
|
||||
clk.next = not clk
|
||||
|
||||
table = (12, 8, 8, 4, 11, 8, 8, 7, 6, 8, 8)
|
||||
|
||||
def stimulus():
|
||||
for i in range(3):
|
||||
yield clk.posedge
|
||||
for i in range(len(table)):
|
||||
n = table[i]
|
||||
syncFlag.next = 1
|
||||
yield clk.posedge
|
||||
syncFlag.next = 0
|
||||
for i in range(n-1):
|
||||
yield clk.posedge
|
||||
raise StopSimulation
|
||||
|
||||
def check():
|
||||
while True:
|
||||
yield clk.negedge
|
||||
print state
|
||||
# print clk
|
||||
# print state
|
||||
# print "MyHDL: %s %s" % (SOF, hex(state))
|
||||
# print "Verilog: %s %s" % (SOF_v, hex(state_v))
|
||||
|
||||
return framerctrl_inst, clkgen(), stimulus(), check()
|
||||
|
||||
|
||||
verifyConversion(FSMBench, FramerCtrl, t_State_b)
|
||||
|
||||
## def testRef(self):
|
||||
## for t_State in (t_State_b, t_State_oc, t_State_oh):
|
||||
## tb_fsm = self.bench(FramerCtrl_ref, t_State)
|
||||
## sim = Simulation(tb_fsm)
|
||||
## sim.run()
|
||||
|
||||
|
||||
|
||||
## def testAlt(self):
|
||||
## for t_State in (t_State_b, t_State_oc, t_State_oh):
|
||||
## tb_fsm = self.bench(FramerCtrl_alt, t_State)
|
||||
## sim = Simulation(tb_fsm)
|
||||
## sim.run()
|
||||
|
||||
## def testDoc(self):
|
||||
## tb_fsm = self.bench(FramerCtrl, t_State_oh)
|
||||
## sim = Simulation(tb_fsm)
|
||||
## sim.run()
|
||||
|
149
myhdl/test/toVHDL/test_inc.py
Normal file
149
myhdl/test/toVHDL/test_inc.py
Normal file
@ -0,0 +1,149 @@
|
||||
import sys
|
||||
import os
|
||||
path = os.path
|
||||
import unittest
|
||||
from unittest import TestCase
|
||||
import random
|
||||
from random import randrange
|
||||
random.seed(2)
|
||||
|
||||
from myhdl import *
|
||||
from myhdl.test import verifyConversion
|
||||
|
||||
|
||||
ACTIVE_LOW, INACTIVE_HIGH = bool(0), bool(1)
|
||||
|
||||
def incRef(count, enable, clock, reset, n):
|
||||
""" Incrementer with enable.
|
||||
|
||||
count -- output
|
||||
enable -- control input, increment when 1
|
||||
clock -- clock input
|
||||
reset -- asynchronous reset input
|
||||
n -- counter max value
|
||||
"""
|
||||
while 1:
|
||||
yield clock.posedge, reset.negedge
|
||||
if reset == ACTIVE_LOW:
|
||||
count.next = 0
|
||||
else:
|
||||
if enable:
|
||||
count.next = (count + 1) % n
|
||||
|
||||
def inc(count, enable, clock, reset, n):
|
||||
|
||||
""" Incrementer with enable.
|
||||
|
||||
count -- output
|
||||
enable -- control input, increment when 1
|
||||
clock -- clock input
|
||||
reset -- asynchronous reset input
|
||||
n -- counter max value
|
||||
|
||||
"""
|
||||
|
||||
@always(clock.posedge, reset.negedge)
|
||||
def incProcess():
|
||||
if reset == ACTIVE_LOW:
|
||||
count.next = 0
|
||||
else:
|
||||
if enable:
|
||||
count.next = (count + 1) % n
|
||||
|
||||
return incProcess
|
||||
|
||||
def inc2(count, enable, clock, reset, n):
|
||||
|
||||
@always(clock.posedge, reset.negedge)
|
||||
def incProcess():
|
||||
if reset == ACTIVE_LOW:
|
||||
count.next = 0
|
||||
else:
|
||||
if enable:
|
||||
if count == n-1:
|
||||
count.next = 0
|
||||
else:
|
||||
count.next = count + 1
|
||||
return incProcess
|
||||
|
||||
|
||||
def incTask(count, enable, clock, reset, n):
|
||||
|
||||
def incTaskFunc(cnt, enable, reset, n):
|
||||
if enable:
|
||||
cnt[:] = (cnt + 1) % n
|
||||
|
||||
@instance
|
||||
def incTaskGen():
|
||||
cnt = intbv(0)[8:]
|
||||
while 1:
|
||||
yield clock.posedge, reset.negedge
|
||||
if reset == ACTIVE_LOW:
|
||||
cnt[:] = 0
|
||||
count.next = 0
|
||||
else:
|
||||
# print count
|
||||
incTaskFunc(cnt, enable, reset, n)
|
||||
count.next = cnt
|
||||
|
||||
return incTaskGen
|
||||
|
||||
|
||||
def incTaskFreeVar(count, enable, clock, reset, n):
|
||||
|
||||
def incTaskFunc():
|
||||
if enable:
|
||||
count.next = (count + 1) % n
|
||||
|
||||
@always(clock.posedge, reset.negedge)
|
||||
def incTaskGen():
|
||||
if reset == ACTIVE_LOW:
|
||||
count.next = 0
|
||||
else:
|
||||
# print count
|
||||
incTaskFunc()
|
||||
|
||||
return incTaskGen
|
||||
|
||||
|
||||
def tb_inc():
|
||||
|
||||
NR_CYCLES = 200
|
||||
|
||||
m = 8
|
||||
n = 2 ** m
|
||||
|
||||
count = Signal(intbv(0)[m:])
|
||||
count_v = Signal(intbv(0)[m:])
|
||||
enable = Signal(bool(0))
|
||||
clock, reset = [Signal(bool(0)) for i in range(2)]
|
||||
|
||||
|
||||
inc_inst = inc(count, enable, clock, reset, n=n)
|
||||
|
||||
@instance
|
||||
def clockgen():
|
||||
clock.next = 0
|
||||
for i in range(NR_CYCLES):
|
||||
yield delay(10)
|
||||
clock.next = not clock
|
||||
|
||||
@instance
|
||||
def monitor():
|
||||
reset.next = 0
|
||||
enable.next = 1
|
||||
yield clock.negedge
|
||||
reset.next = 1
|
||||
yield clock.negedge
|
||||
while True:
|
||||
yield clock.negedge
|
||||
print count
|
||||
|
||||
return inc_inst, clockgen, monitor
|
||||
|
||||
|
||||
|
||||
verifyConversion(tb_inc)
|
||||
|
||||
|
||||
|
503
myhdl/test/toVHDL/test_ops.py
Normal file
503
myhdl/test/toVHDL/test_ops.py
Normal file
@ -0,0 +1,503 @@
|
||||
import os
|
||||
path = os.path
|
||||
import random
|
||||
from random import randrange
|
||||
random.seed(2)
|
||||
|
||||
from myhdl import *
|
||||
from myhdl.test import verifyConversion
|
||||
|
||||
def binaryOps(
|
||||
Bitand,
|
||||
Bitor,
|
||||
Bitxor,
|
||||
FloorDiv,
|
||||
LeftShift,
|
||||
Modulo,
|
||||
Mul,
|
||||
Pow,
|
||||
RightShift,
|
||||
Sub,
|
||||
Sum,
|
||||
EQ,
|
||||
NE,
|
||||
LT,
|
||||
GT,
|
||||
LE,
|
||||
GE,
|
||||
Booland,
|
||||
Boolor,
|
||||
left, right):
|
||||
while 1:
|
||||
yield left, right
|
||||
## Bitand.next = left & right
|
||||
## Bitor.next = left | right
|
||||
## Bitxor.next = left ^ right
|
||||
## if right != 0:
|
||||
## FloorDiv.next = left // right
|
||||
## if left < 256 and right < 40:
|
||||
## LeftShift.next = left << right
|
||||
## if right != 0:
|
||||
## Modulo.next = left % right
|
||||
## Mul.next = left * right
|
||||
# Icarus doesn't support ** yet
|
||||
#if left < 256 and right < 40:
|
||||
# Pow.next = left ** right
|
||||
## Pow.next = 0
|
||||
## RightShift.next = left >> right
|
||||
if left >= right:
|
||||
Sub.next = left - right
|
||||
Sum.next = left + right
|
||||
EQ.next = left == right
|
||||
NE.next = left != right
|
||||
LT.next = left < right
|
||||
GT.next = left > right
|
||||
LE.next = left <= right
|
||||
GE.next = left >= right
|
||||
## Booland.next = bool(left) and bool(right)
|
||||
## Boolor.next = bool(left) or bool(right)
|
||||
|
||||
|
||||
def binaryBench(m, n):
|
||||
|
||||
M = 2**m
|
||||
N = 2**n
|
||||
P = min(M, N)
|
||||
|
||||
left = Signal(intbv(0)[m:])
|
||||
right = Signal(intbv(0)[n:])
|
||||
Bitand = Signal(intbv(0)[max(m, n):])
|
||||
Bitor = Signal(intbv(0)[max(m, n):])
|
||||
Bitxor = Signal(intbv(0)[max(m, n):])
|
||||
FloorDiv = Signal(intbv(0)[m:])
|
||||
LeftShift = Signal(intbv(0)[64:])
|
||||
Modulo = Signal(intbv(0)[m:])
|
||||
Mul = Signal(intbv(0)[m+n:])
|
||||
Pow = Signal(intbv(0)[64:])
|
||||
RightShift = Signal(intbv(0)[m:])
|
||||
Sub = Signal(intbv(0)[max(m, n):])
|
||||
Sum = Signal(intbv(0)[max(m, n)+1:])
|
||||
EQ, NE, LT, GT, LE, GE = [Signal(bool()) for i in range(6)]
|
||||
Booland, Boolor = [Signal(bool()) for i in range(2)]
|
||||
|
||||
binops = binaryOps(Bitand,
|
||||
Bitor,
|
||||
Bitxor,
|
||||
FloorDiv,
|
||||
LeftShift,
|
||||
Modulo,
|
||||
Mul,
|
||||
Pow,
|
||||
RightShift,
|
||||
Sub,
|
||||
Sum,
|
||||
EQ,
|
||||
NE,
|
||||
LT,
|
||||
GT,
|
||||
LE,
|
||||
GE,
|
||||
Booland,
|
||||
Boolor,
|
||||
left, right)
|
||||
|
||||
def stimulus():
|
||||
## for i in range(P):
|
||||
## print i
|
||||
## left.next = intbv(i)
|
||||
## right.next = intbv(i)
|
||||
## yield delay(10)
|
||||
## for i in range(100):
|
||||
## left.next = randrange(M)
|
||||
## right.next = randrange(N)
|
||||
## yield delay(10)
|
||||
left.next = 1
|
||||
right.next = 1
|
||||
yield delay(10)
|
||||
left.next = 0
|
||||
right.next = 0
|
||||
yield delay(10)
|
||||
left.next = 0
|
||||
right.next = N-1
|
||||
yield delay(10)
|
||||
left.next = M-1
|
||||
right.next = 0
|
||||
yield delay(10)
|
||||
left.next = M-1
|
||||
right.next = N-1
|
||||
# raise StopSimulation
|
||||
|
||||
|
||||
def check():
|
||||
while True:
|
||||
yield left, right
|
||||
yield delay(1)
|
||||
# print "%s %s %s %s" % (left, right, Boolor, Boolor_v)
|
||||
## self.assertEqual(Bitand, Bitand_v)
|
||||
## self.assertEqual(Bitor, Bitor_v)
|
||||
## self.assertEqual(Bitxor, Bitxor_v)
|
||||
## self.assertEqual(FloorDiv, FloorDiv_v)
|
||||
## self.assertEqual(LeftShift, LeftShift_v)
|
||||
## self.assertEqual(Modulo, Modulo_v)
|
||||
## self.assertEqual(Mul, Mul_v)
|
||||
## # self.assertEqual(Pow, Pow_v)
|
||||
## self.assertEqual(RightShift, RightShift_v)
|
||||
## self.assertEqual(Sub, Sub_v)
|
||||
## self.assertEqual(Sum, Sum_v)
|
||||
print Sum
|
||||
## self.assertEqual(EQ, EQ_v)
|
||||
## self.assertEqual(NE, NE_v)
|
||||
## self.assertEqual(LT, LT_v)
|
||||
## self.assertEqual(GT, GT_v)
|
||||
## self.assertEqual(LE, LE_v)
|
||||
## self.assertEqual(GE, GE_v)
|
||||
## self.assertEqual(Booland, Booland_v)
|
||||
## self.assertEqual(Boolor, Boolor_v)
|
||||
|
||||
return binops, stimulus(), check()
|
||||
|
||||
|
||||
for m, n in ((4, 4,), (5, 3), (2, 6), (8, 7)):
|
||||
verifyConversion(binaryBench, m, n)
|
||||
|
||||
|
||||
|
||||
## def multiOps(
|
||||
## Bitand,
|
||||
## Bitor,
|
||||
## Bitxor,
|
||||
## Booland,
|
||||
## Boolor,
|
||||
## argm, argn, argp):
|
||||
## while 1:
|
||||
## yield argm, argn, argp
|
||||
## Bitand.next = argm & argn & argp
|
||||
## Bitor.next = argm | argn | argp
|
||||
## Bitxor.next = argm ^ argn ^ argp
|
||||
## Booland.next = bool(argm) and bool(argn) and bool(argp)
|
||||
## Boolor.next = bool(argm) and bool(argn) and bool(argp)
|
||||
|
||||
|
||||
## def multiOps_v( name,
|
||||
## Bitand,
|
||||
## Bitor,
|
||||
## Bitxor,
|
||||
## Booland,
|
||||
## Boolor,
|
||||
## argm, argn, argp):
|
||||
|
||||
## return setupCosimulation(**locals())
|
||||
|
||||
## class TestMultiOps(TestCase):
|
||||
|
||||
## def multiBench(self, m, n, p):
|
||||
|
||||
## M = 2**m
|
||||
## N = 2**n
|
||||
## P = 2**p
|
||||
|
||||
## argm = Signal(intbv(0)[m:])
|
||||
## argn = Signal(intbv(0)[n:])
|
||||
## argp = Signal(intbv(0)[p:])
|
||||
## Bitand = Signal(intbv(0)[max(m, n, p):])
|
||||
## Bitand_v = Signal(intbv(0)[max(m, n, p):])
|
||||
## Bitor = Signal(intbv(0)[max(m, n, p):])
|
||||
## Bitor_v = Signal(intbv(0)[max(m, n, p):])
|
||||
## Bitxor = Signal(intbv(0)[max(m, n, p):])
|
||||
## Bitxor_v = Signal(intbv(0)[max(m, n, p):])
|
||||
## Booland, Boolor = [Signal(bool()) for i in range(2)]
|
||||
## Booland_v, Boolor_v, = [Signal(bool()) for i in range(2)]
|
||||
|
||||
## multiops = toVerilog(multiOps,
|
||||
## Bitand,
|
||||
## Bitor,
|
||||
## Bitxor,
|
||||
## Booland,
|
||||
## Boolor,
|
||||
## argm, argn, argp)
|
||||
## multiops_v = multiOps_v(multiOps.func_name,
|
||||
## Bitand_v,
|
||||
## Bitor_v,
|
||||
## Bitxor_v,
|
||||
## Booland_v,
|
||||
## Boolor_v,
|
||||
## argm, argn, argp)
|
||||
|
||||
## def stimulus():
|
||||
## for i in range(min(M, N, P)):
|
||||
## # print i
|
||||
## argm.next = intbv(i)
|
||||
## argn.next = intbv(i)
|
||||
## argp.next = intbv(i)
|
||||
## yield delay(10)
|
||||
## for i in range(100):
|
||||
## argm.next = randrange(M)
|
||||
## argn.next = randrange(N)
|
||||
## argp.next = randrange(P)
|
||||
## yield delay(10)
|
||||
## for j, k, l in ((0, 0, 0), (0, 0, P-1), (0, N-1, P-1),
|
||||
## (M-1, 0, 0), (M-1, 0, P-1), (M-1, N-1, 0),
|
||||
## (0, N-1, 0), (M-1, N-1, P-1)):
|
||||
## argm.next = j
|
||||
## argn.next = k
|
||||
## argp.next = l
|
||||
## yield delay(10)
|
||||
|
||||
## def check():
|
||||
## while 1:
|
||||
## yield argm, argn, argp
|
||||
## yield delay(1)
|
||||
## # print "%s %s %s %s %s" % (argm, argn, argp, Bitxor, Bitxor_v)
|
||||
## self.assertEqual(Bitand, Bitand_v)
|
||||
## self.assertEqual(Bitor, Bitor_v)
|
||||
## self.assertEqual(Bitxor, Bitxor_v)
|
||||
## self.assertEqual(Booland, Booland_v)
|
||||
## self.assertEqual(Boolor, Boolor_v)
|
||||
|
||||
## return multiops, multiops_v, stimulus(), check()
|
||||
|
||||
|
||||
## def testMultiOps(self):
|
||||
## for m, n, p in ((4, 4, 4,), (5, 3, 2), (3, 4, 6), (3, 7, 4)):
|
||||
## sim = self.multiBench(m, n, p)
|
||||
## Simulation(sim).run()
|
||||
|
||||
|
||||
|
||||
## def unaryOps(
|
||||
## Not,
|
||||
## Invert,
|
||||
## UnaryAdd,
|
||||
## UnarySub,
|
||||
## arg):
|
||||
## while 1:
|
||||
## yield arg
|
||||
## Not.next = not arg
|
||||
## Invert.next = ~arg
|
||||
## UnaryAdd.next = +arg
|
||||
## UnarySub.next = --arg
|
||||
|
||||
## def unaryOps_v(name,
|
||||
## Not,
|
||||
## Invert,
|
||||
## UnaryAdd,
|
||||
## UnarySub,
|
||||
## arg):
|
||||
## return setupCosimulation(**locals())
|
||||
|
||||
|
||||
|
||||
## class TestUnaryOps(TestCase):
|
||||
|
||||
## def unaryBench(self, m):
|
||||
|
||||
## M = 2**m
|
||||
|
||||
## arg = Signal(intbv(0)[m:])
|
||||
## Not = Signal(bool(0))
|
||||
## Not_v = Signal(bool(0))
|
||||
## Invert = Signal(intbv(0)[m:])
|
||||
## Invert_v = Signal(intbv(0)[m:])
|
||||
## UnaryAdd = Signal(intbv(0)[m:])
|
||||
## UnaryAdd_v = Signal(intbv(0)[m:])
|
||||
## UnarySub = Signal(intbv(0)[m:])
|
||||
## UnarySub_v = Signal(intbv(0)[m:])
|
||||
|
||||
## unaryops = toVerilog(unaryOps,
|
||||
## Not,
|
||||
## Invert,
|
||||
## UnaryAdd,
|
||||
## UnarySub,
|
||||
## arg)
|
||||
## unaryops_v = unaryOps_v(unaryOps.func_name,
|
||||
## Not_v,
|
||||
## Invert_v,
|
||||
## UnaryAdd_v,
|
||||
## UnarySub_v,
|
||||
## arg)
|
||||
|
||||
## def stimulus():
|
||||
## for i in range(M):
|
||||
## arg.next = intbv(i)
|
||||
## yield delay(10)
|
||||
## for i in range(100):
|
||||
## arg.next = randrange(M)
|
||||
## yield delay(10)
|
||||
## raise StopSimulation
|
||||
|
||||
## def check():
|
||||
## while 1:
|
||||
## yield arg
|
||||
## yield delay(1)
|
||||
## self.assertEqual(Not, Not_v)
|
||||
## self.assertEqual(Invert, Invert_v)
|
||||
## self.assertEqual(UnaryAdd, UnaryAdd_v)
|
||||
## self.assertEqual(UnarySub, UnarySub_v)
|
||||
|
||||
## return unaryops, unaryops_v, stimulus(), check()
|
||||
|
||||
## def testUnaryOps(self):
|
||||
## for m in (4, 7):
|
||||
## sim = self.unaryBench(m)
|
||||
## Simulation(sim).run()
|
||||
|
||||
|
||||
## def augmOps(
|
||||
## Bitand,
|
||||
## Bitor,
|
||||
## Bitxor,
|
||||
## FloorDiv,
|
||||
## LeftShift,
|
||||
## Modulo,
|
||||
## Mul,
|
||||
## RightShift,
|
||||
## Sub,
|
||||
## Sum,
|
||||
## left, right):
|
||||
## var = intbv(0)[max(64, len(left) + len(right)):]
|
||||
## while 1:
|
||||
## yield left, right
|
||||
## var[:] = left
|
||||
## var &= right
|
||||
## Bitand.next = var
|
||||
## var[:] = left
|
||||
## var |= right
|
||||
## Bitor.next = var
|
||||
## var[:] = left
|
||||
## var ^= left
|
||||
## Bitxor.next = var
|
||||
## if right != 0:
|
||||
## var[:] = left
|
||||
## var //= right
|
||||
## FloorDiv.next = var
|
||||
## if left < 256 and right < 40:
|
||||
## var[:] = left
|
||||
## var <<= right
|
||||
## LeftShift.next = var
|
||||
## if right != 0:
|
||||
## var[:] = left
|
||||
## var %= right
|
||||
## Modulo.next = var
|
||||
## var[:] = left
|
||||
## var *= right
|
||||
## Mul.next = var
|
||||
## var[:] = left
|
||||
## var >>= right
|
||||
## RightShift.next = var
|
||||
## if left >= right:
|
||||
## var[:] = left
|
||||
## var -= right
|
||||
## Sub.next = var
|
||||
## var[:] = left
|
||||
## var += right
|
||||
## Sum.next = var
|
||||
|
||||
|
||||
## def augmOps_v( name,
|
||||
## Bitand,
|
||||
## Bitor,
|
||||
## Bitxor,
|
||||
## FloorDiv,
|
||||
## LeftShift,
|
||||
## Modulo,
|
||||
## Mul,
|
||||
## RightShift,
|
||||
## Sub,
|
||||
## Sum,
|
||||
## left, right):
|
||||
## return setupCosimulation(**locals())
|
||||
|
||||
## class TestAugmOps(TestCase):
|
||||
|
||||
## def augmBench(self, m, n):
|
||||
|
||||
## M = 2**m
|
||||
## N = 2**n
|
||||
|
||||
## left = Signal(intbv(0)[m:])
|
||||
## right = Signal(intbv(0)[n:])
|
||||
## Bitand = Signal(intbv(0)[max(m, n):])
|
||||
## Bitand_v = Signal(intbv(0)[max(m, n):])
|
||||
## Bitor = Signal(intbv(0)[max(m, n):])
|
||||
## Bitor_v = Signal(intbv(0)[max(m, n):])
|
||||
## Bitxor = Signal(intbv(0)[max(m, n):])
|
||||
## Bitxor_v = Signal(intbv(0)[max(m, n):])
|
||||
## FloorDiv = Signal(intbv(0)[m:])
|
||||
## FloorDiv_v = Signal(intbv(0)[m:])
|
||||
## LeftShift = Signal(intbv(0)[64:])
|
||||
## LeftShift_v = Signal(intbv(0)[64:])
|
||||
## Modulo = Signal(intbv(0)[m:])
|
||||
## Modulo_v = Signal(intbv(0)[m:])
|
||||
## Mul = Signal(intbv(0)[m+n:])
|
||||
## Mul_v = Signal(intbv(0)[m+n:])
|
||||
## RightShift = Signal(intbv(0)[m:])
|
||||
## RightShift_v = Signal(intbv(0)[m:])
|
||||
## Sub = Signal(intbv(0)[max(m, n):])
|
||||
## Sub_v = Signal(intbv(0)[max(m, n):])
|
||||
## Sum = Signal(intbv(0)[max(m, n)+1:])
|
||||
## Sum_v = Signal(intbv(0)[max(m, n)+1:])
|
||||
|
||||
## augmops = toVerilog(augmOps,
|
||||
## Bitand,
|
||||
## Bitor,
|
||||
## Bitxor,
|
||||
## FloorDiv,
|
||||
## LeftShift,
|
||||
## Modulo,
|
||||
## Mul,
|
||||
## RightShift,
|
||||
## Sub,
|
||||
## Sum,
|
||||
## left, right)
|
||||
## augmops_v = augmOps_v( augmOps.func_name,
|
||||
## Bitand_v,
|
||||
## Bitor_v,
|
||||
## Bitxor_v,
|
||||
## FloorDiv_v,
|
||||
## LeftShift_v,
|
||||
## Modulo_v,
|
||||
## Mul_v,
|
||||
## RightShift_v,
|
||||
## Sub_v,
|
||||
## Sum_v,
|
||||
## left, right)
|
||||
|
||||
## def stimulus():
|
||||
## for i in range(min(M, N)):
|
||||
## # print i
|
||||
## left.next = intbv(i)
|
||||
## right.next = intbv(i)
|
||||
## yield delay(10)
|
||||
## for i in range(100):
|
||||
## left.next = randrange(M)
|
||||
## right.next = randrange(N)
|
||||
## yield delay(10)
|
||||
## for j, k in ((0, 0), (0, N-1), (M-1, 0), (M-1, N-1)):
|
||||
## left.next = j
|
||||
## right.next = k
|
||||
## yield delay(10)
|
||||
|
||||
## def check():
|
||||
## while 1:
|
||||
## yield left, right
|
||||
## yield delay(1)
|
||||
## # print "%s %s %s %s" % (left, right, Boolor, Boolor_v)
|
||||
## self.assertEqual(Bitand, Bitand_v)
|
||||
## self.assertEqual(Bitor, Bitor_v)
|
||||
## self.assertEqual(Bitxor, Bitxor_v)
|
||||
## self.assertEqual(FloorDiv, FloorDiv_v)
|
||||
## self.assertEqual(LeftShift, LeftShift_v)
|
||||
## self.assertEqual(Modulo, Modulo_v)
|
||||
## self.assertEqual(Mul, Mul_v)
|
||||
## self.assertEqual(RightShift, RightShift_v)
|
||||
## self.assertEqual(Sub, Sub_v)
|
||||
## self.assertEqual(Sum, Sum_v)
|
||||
|
||||
## return augmops, augmops_v, stimulus(), check()
|
||||
|
||||
|
||||
## def testAugmOps(self):
|
||||
## for m, n in ((4, 4,), (5, 3), (2, 6), (8, 7)):
|
||||
## sim = self.augmBench(m, n)
|
||||
## Simulation(sim).run()
|
||||
|
Loading…
x
Reference in New Issue
Block a user