@@ -24,20 +24,22 @@ class AXIM(AxiMaster, _MutexFunction):
2424 'dma_read' , 'dma_read_async' ,
2525 'dma_write' , 'dma_write_async' ,
2626 'dma_wait_read' , 'dma_wait_write' ,
27- 'dma_wait' ) + _MutexFunction .__intrinsics__
27+ 'dma_wait_read' , 'dma_wait_write' , 'dma_wait' ,
28+ 'set_global_base_addr' ,) + _MutexFunction .__intrinsics__
2829
2930 burstlen = 256
3031
3132 def __init__ (self , m , name , clk , rst ,
3233 datawidth = 32 , addrwidth = 32 , lite = False , noio = False ,
33- enable_async = False ,
34+ enable_async = False , use_global_base_addr = False ,
3435 num_cmd_delay = 0 , num_data_delay = 0 ,
3536 op_sel_width = 8 , fsm_as_module = False ):
3637
3738 AxiMaster .__init__ (self , m , name , clk , rst ,
3839 datawidth , addrwidth , lite = lite , noio = noio )
3940
4041 self .enable_async = enable_async
42+ self .use_global_base_addr = use_global_base_addr
4143 self .num_cmd_delay = num_cmd_delay
4244 self .num_data_delay = num_data_delay
4345 self .op_sel_width = op_sel_width
@@ -102,6 +104,12 @@ def __init__(self, m, name, clk, rst,
102104 self .write_start (0 )
103105 )
104106
107+ if self .use_global_base_addr :
108+ self .global_base_addr = self .m .Reg ('_' .join (['' , self .name , 'global_base_addr' ]),
109+ self .addrwidth , initval = 0 )
110+ else :
111+ self .global_base_addr = None
112+
105113 self .write_op_id_map = OrderedDict ()
106114 self .write_op_id_count = 1
107115 self .write_reqs = OrderedDict ()
@@ -219,6 +227,16 @@ def dma_wait(self, fsm):
219227
220228 fsm .If (self .read_idle , self .write_idle ).goto_next ()
221229
230+ def set_global_base_addr (self , fsm , addr ):
231+
232+ if not self .use_global_base_addr :
233+ raise ValueError ("global_base_addr is disabled." )
234+
235+ flag = self ._set_flag (fsm )
236+ self .seq .If (flag )(
237+ self .global_base_addr (addr )
238+ )
239+
222240 # --------------------
223241 # read
224242 # --------------------
@@ -418,8 +436,13 @@ def _synthesize_read_fsm_same(self, ram, port, ram_method, ram_datawidth):
418436 ram_method (port , self .read_local_addr , w , self .read_size ,
419437 stride = self .read_local_stride , cond = cond )
420438
439+ if not self .use_global_base_addr :
440+ gaddr = self .read_global_addr
441+ else :
442+ gaddr = self .read_global_addr + self .global_base_addr
443+
421444 fsm .If (self .read_start )(
422- cur_global_addr (self .mask_addr (self . read_global_addr )),
445+ cur_global_addr (self .mask_addr (gaddr )),
423446 rest_size (self .read_size )
424447 )
425448 fsm .If (cond ).goto_next ()
@@ -551,8 +574,13 @@ def _synthesize_read_fsm_narrow(self, ram, port, ram_method, ram_datawidth):
551574 ram_method (port , self .read_local_addr , w , self .read_size ,
552575 stride = self .read_local_stride , cond = cond )
553576
577+ if not self .use_global_base_addr :
578+ gaddr = self .read_global_addr
579+ else :
580+ gaddr = self .read_global_addr + self .global_base_addr
581+
554582 fsm .If (self .read_start )(
555- cur_global_addr (self .mask_addr (self . read_global_addr )),
583+ cur_global_addr (self .mask_addr (gaddr )),
556584 rest_size (dma_size )
557585 )
558586 fsm .If (cond ).goto_next ()
@@ -700,8 +728,13 @@ def _synthesize_read_fsm_wide(self, ram, port, ram_method, ram_datawidth):
700728 ram_method (port , self .read_local_addr , w , actual_read_size ,
701729 stride = self .read_local_stride , cond = cond )
702730
731+ if not self .use_global_base_addr :
732+ gaddr = self .read_global_addr
733+ else :
734+ gaddr = self .read_global_addr + self .global_base_addr
735+
703736 fsm .If (self .read_start )(
704- cur_global_addr (self .mask_addr (self . read_global_addr )),
737+ cur_global_addr (self .mask_addr (gaddr )),
705738 rest_size (dma_size )
706739 )
707740 fsm .If (cond ).goto_next ()
@@ -979,8 +1012,13 @@ def _synthesize_write_fsm_same(self, ram, port, ram_method, ram_datawidth):
9791012 data = self .df ._Delay (data )
9801013 last = self .df ._Delay (last )
9811014
1015+ if not self .use_global_base_addr :
1016+ gaddr = self .write_global_addr
1017+ else :
1018+ gaddr = self .write_global_addr + self .global_base_addr
1019+
9821020 fsm .If (self .write_start )(
983- cur_global_addr (self .mask_addr (self . write_global_addr )),
1021+ cur_global_addr (self .mask_addr (gaddr )),
9841022 rest_size (self .write_size )
9851023 )
9861024 fsm .If (cond ).goto_next ()
@@ -1118,8 +1156,13 @@ def _synthesize_write_fsm_narrow(self, ram, port, ram_method, ram_datawidth):
11181156 data = self .df ._Delay (data )
11191157 last = self .df ._Delay (last )
11201158
1159+ if not self .use_global_base_addr :
1160+ gaddr = self .write_global_addr
1161+ else :
1162+ gaddr = self .write_global_addr + self .global_base_addr
1163+
11211164 fsm .If (self .write_start )(
1122- cur_global_addr (self .mask_addr (self . write_global_addr )),
1165+ cur_global_addr (self .mask_addr (gaddr )),
11231166 rest_size (dma_size )
11241167 )
11251168 fsm .If (cond ).goto_next ()
@@ -1298,8 +1341,13 @@ def _synthesize_write_fsm_wide(self, ram, port, ram_method, ram_datawidth):
12981341 data = self .df ._Delay (data )
12991342 last = self .df ._Delay (last )
13001343
1344+ if not self .use_global_base_addr :
1345+ gaddr = self .write_global_addr
1346+ else :
1347+ gaddr = self .write_global_addr + self .global_base_addr
1348+
13011349 fsm .If (self .write_start )(
1302- cur_global_addr (self .mask_addr (self . write_global_addr )),
1350+ cur_global_addr (self .mask_addr (gaddr )),
13031351 rest_size (dma_size )
13041352 )
13051353 fsm .If (cond ).goto_next ()
0 commit comments