@@ -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
26032635class 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