@@ -215,7 +215,9 @@ module ccc
215
215
216
216
// Set New Dynamic Address
217
217
// I3C_DIRECT_SETNEWDA
218
+ // those ouptuts are also used by ENTDAA
218
219
output logic set_newda_o,
220
+ output logic set_newda_virtual_device_o,
219
221
output logic [6 : 0 ] newda_o,
220
222
221
223
// Get Max Write Length
@@ -309,6 +311,9 @@ module ccc
309
311
logic set_aasa_valid;
310
312
logic [6 : 0 ] set_aasa_addr;
311
313
314
+ logic entdaa_addres_valid;
315
+ logic entdaa_addres;
316
+
312
317
logic get_status_in_progress;
313
318
314
319
always_ff @ (posedge clk_i or negedge rst_ni) begin : report_get_status_done
@@ -388,13 +393,15 @@ module ccc
388
393
WaitForBusCond,
389
394
WaitForStop,
390
395
DoneCCC,
391
- HandleENTDAA
396
+ HandleENTDAA,
397
+ HandleTargetENTDAA,
398
+ HandleVirtualTargetENTDAA
392
399
} state_e ;
393
400
394
401
state_e state_q, state_d;
395
402
396
403
assign last_tbit_valid = (state_q == RxTbit || state_q == RxDataTbit) && bus_rx_done_i;
397
- assign entdaa_o = (state_q == HandleENTDAA);
404
+ assign entdaa_o = (state_q == HandleENTDAA || state_q == HandleTargetENTDAA || state_q == HandleVirtualTargetENTDAA );
398
405
399
406
always_ff @ (posedge clk_i or negedge rst_ni) begin : register_tbit
400
407
if (~ rst_ni) begin
@@ -488,17 +495,45 @@ module ccc
488
495
if (have_defining_byte) state_d = RxDefByte;
489
496
else begin
490
497
// ENTDAA is special
491
- if (command_code == `I3C_BCAST_ENTDAA ) state_d = HandleENTDAA;
498
+ if (command_code == `I3C_BCAST_ENTDAA ) begin
499
+ // ignore ENTDAA if we already have dynamic addresses
500
+ if (~ target_dyn_address_valid_i || ~ virtual_target_dyn_address_valid_i) begin
501
+ state_d = HandleENTDAA;
502
+ end else begin
503
+ state_d = Idle;
504
+ end
505
+ end
492
506
// broadcast CCCs
493
507
else if (~ is_direct_cmd) state_d = RxData;
494
508
// direct CCCs
495
- else
496
- state_d = RxByte;
509
+ else state_d = RxByte;
497
510
end
498
511
end
499
512
end
500
513
HandleENTDAA: begin
501
- if (entdaa_done) state_d = Idle;
514
+ // First get target dynamic address
515
+ if (~ target_dyn_address_valid_i) begin
516
+ state_d = HandleTargetENTDAA;
517
+ // then vitual device dynamic address
518
+ end else if (~ virtual_target_dyn_address_valid_i) begin
519
+ state_d = HandleVirtualTargetENTDAA;
520
+ end else begin
521
+ state_d = Idle;
522
+ end
523
+ end
524
+ HandleTargetENTDAA: begin
525
+ if (entdaa_done) begin
526
+ if (~ virtual_target_dyn_address_valid_i) begin
527
+ state_d = HandleVirtualTargetENTDAA;
528
+ end else begin
529
+ state_d = Idle;
530
+ end
531
+ end
532
+ end
533
+ HandleVirtualTargetENTDAA: begin
534
+ if (entdaa_done) begin
535
+ state_d = Idle;
536
+ end
502
537
end
503
538
RxDefByte: begin
504
539
if (bus_rx_done_i) state_d = RxDefByteTbit;
@@ -750,6 +785,13 @@ module ccc
750
785
set_dasa_virtual_device_o = is_byte_virtual_addr ? (set_aasa_valid ? set_aasa_valid : set_dasa_valid) : 1'b0 ;
751
786
end
752
787
788
+ // connect entdaa/setnewda
789
+ always_comb begin : entdaa_setnewda_mux
790
+ set_newda_o = entdaa_addres_valid && (state_q == HandleTargetENTDAA);
791
+ set_newda_virtual_device_o = entdaa_addres_valid && (state_q == HandleVirtualTargetENTDAA);
792
+ newda_o = entdaa_addres;
793
+ end
794
+
753
795
// Handle DIRECT SET CCCs
754
796
always_ff @ (posedge clk_i or negedge rst_ni) begin : proc_set_direct
755
797
if (~ rst_ni) begin
@@ -1009,7 +1051,7 @@ module ccc
1009
1051
.arbitration_lost_i,
1010
1052
1011
1053
// addr
1012
- .address_o (newda_o ),
1013
- .address_valid_o (set_newda_o )
1054
+ .address_o (entdaa_addres ),
1055
+ .address_valid_o (entdaa_addres_valid )
1014
1056
);
1015
1057
endmodule
0 commit comments