Skip to content

Commit 92ae5ef

Browse files
author
Yasuhiro Nitta
committed
add interval option to Counter #54
1 parent 994a460 commit 92ae5ef

File tree

1 file changed

+41
-9
lines changed

1 file changed

+41
-9
lines changed

veriloggen/stream/stypes.py

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2398,7 +2398,7 @@ class _Accumulator(_UnaryOperator):
23982398
latency = 1
23992399
ops = (vtypes.Plus, )
24002400

2401-
def __init__(self, right, size=None, initval=None,
2401+
def __init__(self, right, size=None, initval=None, interval=None,
24022402
enable=None, reset=None, width=32, signed=True):
24032403

24042404
self.size = _to_constant(size) if size is not None else None
@@ -2408,6 +2408,8 @@ def __init__(self, right, size=None, initval=None,
24082408
if not isinstance(self.initval, _Constant):
24092409
raise TypeError("initval must be Constant, not '%s'" %
24102410
str(type(self.initval)))
2411+
2412+
self.interval = interval
24112413

24122414
self.enable = _to_constant(enable)
24132415
if self.enable is not None:
@@ -2442,6 +2444,8 @@ def _implement(self, m, seq, svalid=None, senable=None):
24422444
(self.latency, 1))
24432445

24442446
size_data = self.size.sig_data if self.size is not None else None
2447+
if self.size is not None and self.interval is not None:
2448+
size_data *= self.interval
24452449
initval_data = self.initval.sig_data
24462450

24472451
width = self.bit_length()
@@ -2460,6 +2464,11 @@ def _implement(self, m, seq, svalid=None, senable=None):
24602464
next_count_value = vtypes.Mux(count >= size_data - 1,
24612465
0, count + 1)
24622466
count_zero = (count == 0)
2467+
2468+
if self.interval is not None:
2469+
interval_count = m.Reg(self.name('interval_count'), width, initval=0)
2470+
next_interval_count = vtypes.Mux(interval_count >= self.interval - 1, 0, interval_count + 1)
2471+
interval_enable = (interval_count == 0)
24632472

24642473
self.sig_data = data
24652474

@@ -2484,7 +2493,9 @@ def _implement(self, m, seq, svalid=None, senable=None):
24842493
if not self.ops and self.size is not None:
24852494
value = (count >= (size_data - 1))
24862495

2487-
if self.reset is not None or self.size is not None:
2496+
reset_value = initval_data
2497+
if self.size is not None:
2498+
# if self.reset is not None or self.size is not None:
24882499
reset_value = initval_data
24892500
for op in self.ops:
24902501
if not isinstance(op, type):
@@ -2502,24 +2513,43 @@ def _implement(self, m, seq, svalid=None, senable=None):
25022513
reset_value = (count >= (size_data - 1))
25032514

25042515
if self.enable is not None:
2505-
enable_cond = _and_vars(svalid, senable, enabledata)
2506-
seq(data(value), cond=enable_cond)
2516+
if self.interval is not None:
2517+
enable_cond = _and_vars(svalid, senable, enabledata, interval_enable)
2518+
seq(data(value), cond = enable_cond)
2519+
else:
2520+
enable_cond = _and_vars(svalid, senable, enabledata)
2521+
seq(data(value), cond = enable_cond)
25072522

2523+
enable_cond = _and_vars(svalid, senable, enabledata)
25082524
if self.size is not None:
25092525
seq(count(next_count_value), cond=enable_cond)
25102526

2527+
if self.interval is not None:
2528+
seq(interval_count(next_interval_count), cond=enable_cond)
2529+
25112530
else:
2531+
if self.interval is not None:
2532+
enable_cond = _and_vars(svalid, senable, interval_enable)
2533+
seq(data(value), cond = enable_cond)
2534+
else:
2535+
enable_cond = _and_vars(svalid, senable)
2536+
seq(data(value), cond = enable_cond)
2537+
25122538
enable_cond = _and_vars(svalid, senable)
2513-
seq(data(value), cond=enable_cond)
25142539

25152540
if self.size is not None:
25162541
seq(count(next_count_value), cond=enable_cond)
2542+
2543+
if self.interval is not None:
2544+
seq(interval_count(next_interval_count), cond=enable_cond)
25172545

25182546
if self.reset is not None:
25192547
if self.enable is None:
25202548
reset_cond = _and_vars(svalid, senable, resetdata)
25212549
seq(data(reset_value), cond=reset_cond)
2522-
2550+
2551+
if self.interval is not None:
2552+
seq(interval_count(0), cond=reset_cond)
25232553
if self.size is not None:
25242554
seq(count(0), cond=reset_cond)
25252555
reset_cond = _and_vars(svalid, senable, count_zero)
@@ -2533,6 +2563,8 @@ def _implement(self, m, seq, svalid=None, senable=None):
25332563
svalid, senable, enabledata, resetdata)
25342564
seq(data(reset_value), cond=reset_enable_cond)
25352565

2566+
if self.interval is not None:
2567+
seq(interval_count(0), cond=reset_enable_cond)
25362568
if self.size is not None:
25372569
seq(count(0), cond=reset_enable_cond)
25382570
reset_enable_cond = _and_vars(
@@ -2602,7 +2634,7 @@ def __init__(self, ops, right, size=None, initval=0,
26022634

26032635
class Counter(_Accumulator):
26042636

2605-
def __init__(self, size=None, step=1, initval=0,
2637+
def __init__(self, size=None, step=1, initval=0, interval=1,
26062638
control=None, enable=None, reset=None, width=32, signed=False):
26072639

26082640
self.ops = (lambda x, y: x + step, )
@@ -2612,7 +2644,7 @@ def __init__(self, size=None, step=1, initval=0,
26122644

26132645
initval -= step
26142646

2615-
_Accumulator.__init__(self, control, size, initval,
2647+
_Accumulator.__init__(self, control, size, initval, interval,
26162648
enable, reset, width, signed)
26172649
self.graph_label = 'Counter'
26182650

@@ -2687,7 +2719,7 @@ def ReduceCustomValid(ops, right, size, initval=0,
26872719
return data, valid
26882720

26892721

2690-
def CounterValid(size, step=1, initval=0,
2722+
def CounterValid(size, step=1, initval=None,
26912723
control=None, enable=None, reset=None, width=32, signed=False):
26922724

26932725
data = Counter(size, step, initval,

0 commit comments

Comments
 (0)