@@ -27,11 +27,13 @@ pub struct MemController {
2727 // Write request ports (multi-cycle)
2828 tdma_write_req_port : String ,
2929 vball_write_req_port : String ,
30+ systolic_write_req_port : String ,
3031 bank_write_req_port : String ,
3132
3233 // Read response ports (multi-cycle)
3334 tdma_read_resp_port : String ,
3435 vball_read_resp_port : String ,
36+ systolic_read_resp_port : String ,
3537 bank_read_resp_port : String ,
3638
3739 until_next_event : f64 ,
@@ -45,8 +47,10 @@ impl MemController {
4547 pub fn new (
4648 tdma_write_req_port : String ,
4749 vball_write_req_port : String ,
50+ systolic_write_req_port : String ,
4851 tdma_read_resp_port : String ,
4952 vball_read_resp_port : String ,
53+ systolic_read_resp_port : String ,
5054 bank_write_req_port : String ,
5155 bank_read_resp_port : String ,
5256 ) -> Self {
@@ -56,9 +60,11 @@ impl MemController {
5660 Self {
5761 tdma_write_req_port,
5862 vball_write_req_port,
63+ systolic_write_req_port,
5964 bank_write_req_port,
6065 tdma_read_resp_port,
6166 vball_read_resp_port,
67+ systolic_read_resp_port,
6268 bank_read_resp_port,
6369 until_next_event : INFINITY ,
6470 records : Vec :: new ( ) ,
@@ -71,12 +77,12 @@ impl DevsModel for MemController {
7177 fn events_ext ( & mut self , incoming_message : & ModelMessage , services : & mut Services ) -> Result < ( ) , SimulationError > {
7278 // Handle write requests from TDMA (multi-cycle)
7379 if incoming_message. port_name == self . tdma_write_req_port {
74- match serde_json:: from_str :: < ( u64 , u64 , u64 , Vec < u64 > ) > ( & incoming_message. content ) {
80+ match serde_json:: from_str :: < ( u64 , u64 , u64 , Vec < u128 > ) > ( & incoming_message. content ) {
7581 Ok ( value) => {
7682 let rob_id = value. 0 ;
7783 let vbank_id = value. 1 ;
7884 let start_addr = value. 2 ;
79- let data_count = value. 3 . len ( ) / 2 ;
85+ let data_count = value. 3 . len ( ) ;
8086
8187 // Convert vbank_id to pbank_id using BMT
8288 let pbank_id = if let Some ( pbank_ids) = get_pbank_ids ( vbank_id) {
@@ -120,12 +126,12 @@ impl DevsModel for MemController {
120126
121127 // Handle write requests from VectorBall (multi-cycle)
122128 if incoming_message. port_name == self . vball_write_req_port {
123- match serde_json:: from_str :: < ( u64 , u64 , u64 , Vec < u64 > ) > ( & incoming_message. content ) {
129+ match serde_json:: from_str :: < ( u64 , u64 , u64 , Vec < u128 > ) > ( & incoming_message. content ) {
124130 Ok ( value) => {
125131 let rob_id = value. 0 ;
126132 let vbank_id = value. 1 ;
127133 let start_addr = value. 2 ;
128- let data_count = value. 3 . len ( ) / 2 ;
134+ let data_count = value. 3 . len ( ) ;
129135
130136 // Convert vbank_id to pbank_id using BMT
131137 let pbank_id = if let Some ( pbank_ids) = get_pbank_ids ( vbank_id) {
@@ -172,6 +178,64 @@ impl DevsModel for MemController {
172178 return Ok ( ( ) ) ;
173179 }
174180
181+ // Handle write requests from Systolic Array (multi-cycle)
182+ if incoming_message. port_name == self . systolic_write_req_port {
183+ match serde_json:: from_str :: < Vec < u128 > > ( & incoming_message. content ) {
184+ Ok ( data_vec) => {
185+ let rob_id = 0 ; // Assuming systolic array uses fixed rob_id for now
186+ let vbank_id = 2 ; // Assuming result bank is 2 based on test
187+ let start_addr = 0 ;
188+ let data_count = data_vec. len ( ) ;
189+
190+ // Convert vbank_id to pbank_id using BMT
191+ let pbank_id = if let Some ( pbank_ids) = get_pbank_ids ( vbank_id) {
192+ if pbank_ids. is_empty ( ) {
193+ vbank_id
194+ } else {
195+ pbank_ids[ 0 ]
196+ }
197+ } else {
198+ vbank_id
199+ } ;
200+
201+ // Create write request with rob_id, vbank_id, start_addr, data
202+ let write_req = ( rob_id, vbank_id, start_addr, data_vec) ;
203+ let json_content = serde_json:: to_string ( & write_req) . unwrap_or_default ( ) ;
204+
205+ // Check dependency
206+ if scoreboard:: check_dependency ( pbank_id, rob_id) {
207+ // No dependency, can proceed immediately
208+ self
209+ . write_request_queue
210+ . push ( ( "systolic" . to_string ( ) , json_content) ) ;
211+ } else {
212+ // Has dependency, add to scoreboard
213+ scoreboard:: add_to_scoreboard (
214+ rob_id,
215+ pbank_id,
216+ "systolic" . to_string ( ) ,
217+ json_content,
218+ ) ;
219+ }
220+
221+ self . records . push ( ModelRecord {
222+ time : services. global_time ( ) ,
223+ action : "enqueue_systolic_write" . to_string ( ) ,
224+ subject : format ! (
225+ "rob_id={}, bank={}, addr={}, count={}" ,
226+ rob_id, vbank_id, start_addr, data_count
227+ ) ,
228+ } ) ;
229+
230+ self . until_next_event = 1.0 ;
231+ } ,
232+ Err ( _) => {
233+ // Failed to deserialize Systolic Array write request, skipping
234+ }
235+ }
236+ return Ok ( ( ) ) ;
237+ }
238+
175239 // Handle read responses from Bank - forward to the correct source (multi-cycle)
176240 if incoming_message. port_name == self . bank_read_resp_port {
177241 match serde_json:: from_str :: < Vec < u128 > > ( & incoming_message. content ) {
@@ -209,6 +273,8 @@ impl DevsModel for MemController {
209273 if let Some ( resp) = READ_RESPONSE_QUEUE . lock ( ) . unwrap ( ) . pop ( ) {
210274 let response_port = if resp. source == "tdma" {
211275 self . tdma_read_resp_port . clone ( )
276+ } else if resp. source == "systolic" {
277+ self . systolic_read_resp_port . clone ( )
212278 } else {
213279 self . vball_read_resp_port . clone ( )
214280 } ;
@@ -251,12 +317,12 @@ impl DevsModel for MemController {
251317 if !self . write_request_queue . is_empty ( ) {
252318 let ( source, json_content) = self . write_request_queue . remove ( 0 ) ;
253319
254- match serde_json:: from_str :: < ( u64 , u64 , u64 , Vec < u64 > ) > ( & json_content) {
320+ match serde_json:: from_str :: < ( u64 , u64 , u64 , Vec < u128 > ) > ( & json_content) {
255321 Ok ( value) => {
256322 let rob_id = value. 0 ;
257323 let vbank_id = value. 1 ;
258324 let start_addr = value. 2 ;
259- let data_u64 = value. 3 ;
325+ let data_u128 = value. 3 ;
260326
261327 // Convert vbank_id to pbank_id using BMT
262328 // Use first pbank_id if vbank maps to multiple pbanks
@@ -274,7 +340,7 @@ impl DevsModel for MemController {
274340 scoreboard:: mark_in_flight ( pbank_id, rob_id) ;
275341
276342 // Re-encode with pbank_id (remove rob_id for bank)
277- let request = ( pbank_id, start_addr, data_u64 ) ;
343+ let request = ( pbank_id, start_addr, data_u128 ) ;
278344 match serde_json:: to_string ( & request) {
279345 Ok ( new_content) => {
280346 messages. push ( ModelMessage {
@@ -423,6 +489,30 @@ pub fn request_read_bank_for_vecball(vbank_id: u64, start_addr: u64, count: u64,
423489 }
424490}
425491
492+ pub fn request_read_bank_for_systolic ( vbank_id : u64 , start_addr : u64 , count : u64 , rob_id : u64 ) {
493+ // Convert vbank_id to pbank_id using BMT
494+ // Use first pbank_id if vbank maps to multiple pbanks
495+ let pbank_id = if let Some ( pbank_ids) = get_pbank_ids ( vbank_id) {
496+ if pbank_ids. is_empty ( ) {
497+ vbank_id // Fallback to vbank_id
498+ } else {
499+ pbank_ids[ 0 ]
500+ }
501+ } else {
502+ vbank_id // Fallback to vbank_id
503+ } ;
504+
505+ // Check dependency
506+ if scoreboard:: check_dependency ( pbank_id, rob_id) {
507+ // No dependency, can proceed immediately
508+ READ_SOURCE_QUEUE . lock ( ) . unwrap ( ) . push ( "systolic" . to_string ( ) ) ;
509+ request_read_bank ( pbank_id, start_addr, count) ;
510+ } else {
511+ // Has dependency, add to read scoreboard
512+ scoreboard:: add_read_to_scoreboard ( rob_id, pbank_id, start_addr, count, "systolic" . to_string ( ) ) ;
513+ }
514+ }
515+
426516pub fn request_write_bank_for_tdma ( vbank_id : u64 , start_addr : u64 , data_vec : Vec < u128 > ) -> bool {
427517 request_write_bank ( vbank_id, start_addr, data_vec)
428518}
0 commit comments