@@ -618,9 +618,12 @@ def _synthesize_read_fsm_wide(self, ram, port, ram_method, ram_datawidth):
618
618
'axi.datawidth must be multiple number of ram_datawidth' )
619
619
620
620
pack_size = self .datawidth // ram_datawidth
621
- dma_size = (self .read_size >> int (math .log (pack_size , 2 ))
622
- if math .log (pack_size , 2 ) % 1.0 == 0.0 else
623
- int (size // pack_size ))
621
+ shamt = int (math .log (pack_size , 2 ))
622
+ res = vtypes .Mux (
623
+ vtypes .And (self .read_size , 2 ** shamt - 1 ) > 0 , 1 , 0 )
624
+ dma_size = (self .read_size >> shamt ) + res
625
+
626
+ actual_read_size = dma_size << shamt
624
627
625
628
op_id = self ._get_read_op_id (ram , port , ram_method )
626
629
port = vtypes .to_int (port )
@@ -642,7 +645,7 @@ def _synthesize_read_fsm_wide(self, ram, port, ram_method, ram_datawidth):
642
645
fsm .set_index (0 )
643
646
wdata , wvalid , w = self ._get_op_write_dataflow (ram_datawidth )
644
647
cond = vtypes .Ands (self .read_start , self .read_op_sel == op_id )
645
- ram_method (port , self .read_local_addr , w , self . read_size ,
648
+ ram_method (port , self .read_local_addr , w , actual_read_size ,
646
649
stride = self .read_local_stride , cond = cond )
647
650
648
651
fsm .If (cond ).goto_next ()
@@ -694,7 +697,7 @@ def _synthesize_read_fsm_wide(self, ram, port, ram_method, ram_datawidth):
694
697
# state 0
695
698
wdata , wvalid , w = self ._get_op_write_dataflow (ram_datawidth )
696
699
cond = vtypes .Ands (self .read_start , self .read_op_sel == op_id )
697
- ram_method (port , self .read_local_addr , w , self . read_size ,
700
+ ram_method (port , self .read_local_addr , w , actual_read_size ,
698
701
stride = self .read_local_stride , cond = cond )
699
702
700
703
fsm .If (self .read_start )(
@@ -1204,9 +1207,12 @@ def _synthesize_write_fsm_wide(self, ram, port, ram_method, ram_datawidth):
1204
1207
'axi.datawidth must be multiple number of ram_datawidth' )
1205
1208
1206
1209
pack_size = self .datawidth // ram_datawidth
1207
- dma_size = (self .write_size >> int (math .log (pack_size , 2 ))
1208
- if math .log (pack_size , 2 ) % 1.0 == 0.0 else
1209
- int (size // pack_size ))
1210
+ shamt = int (math .log (pack_size , 2 ))
1211
+ res = vtypes .Mux (
1212
+ vtypes .And (self .write_size , 2 ** shamt - 1 ) > 0 , 1 , 0 )
1213
+ dma_size = (self .write_size >> shamt ) + res
1214
+
1215
+ actual_write_size = dma_size << shamt
1210
1216
1211
1217
op_id = self ._get_write_op_id (ram , port , ram_method )
1212
1218
port = vtypes .to_int (port )
@@ -1229,7 +1235,7 @@ def _synthesize_write_fsm_wide(self, ram, port, ram_method, ram_datawidth):
1229
1235
fsm .set_index (0 )
1230
1236
cond = vtypes .Ands (self .write_start , self .write_op_sel == op_id )
1231
1237
data , last , done = ram_method (
1232
- port , self .write_local_addr , self . write_size ,
1238
+ port , self .write_local_addr , actual_write_size ,
1233
1239
stride = self .write_local_stride , cond = cond , signed = False )
1234
1240
1235
1241
if self .num_data_delay > 0 :
@@ -1284,7 +1290,7 @@ def _synthesize_write_fsm_wide(self, ram, port, ram_method, ram_datawidth):
1284
1290
# state 0
1285
1291
cond = vtypes .Ands (self .write_start , self .write_op_sel == op_id )
1286
1292
data , last , done = ram_method (
1287
- port , self .write_local_addr , self . write_size ,
1293
+ port , self .write_local_addr , actual_write_size ,
1288
1294
stride = self .write_local_stride , cond = cond , signed = False )
1289
1295
1290
1296
if self .num_data_delay > 0 :
0 commit comments