Skip to content

Commit e34daea

Browse files
committed
entdaa: handle addresses for both targets
1 parent 92fb76b commit e34daea

File tree

1 file changed

+50
-8
lines changed

1 file changed

+50
-8
lines changed

src/ctrl/ccc.sv

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,9 @@ module ccc
215215

216216
// Set New Dynamic Address
217217
// I3C_DIRECT_SETNEWDA
218+
// those ouptuts are also used by ENTDAA
218219
output logic set_newda_o,
220+
output logic set_newda_virtual_device_o,
219221
output logic [6:0] newda_o,
220222

221223
// Get Max Write Length
@@ -309,6 +311,9 @@ module ccc
309311
logic set_aasa_valid;
310312
logic [6:0] set_aasa_addr;
311313

314+
logic entdaa_addres_valid;
315+
logic entdaa_addres;
316+
312317
logic get_status_in_progress;
313318

314319
always_ff @(posedge clk_i or negedge rst_ni) begin : report_get_status_done
@@ -388,13 +393,15 @@ module ccc
388393
WaitForBusCond,
389394
WaitForStop,
390395
DoneCCC,
391-
HandleENTDAA
396+
HandleENTDAA,
397+
HandleTargetENTDAA,
398+
HandleVirtualTargetENTDAA
392399
} state_e;
393400

394401
state_e state_q, state_d;
395402

396403
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);
398405

399406
always_ff @(posedge clk_i or negedge rst_ni) begin : register_tbit
400407
if (~rst_ni) begin
@@ -488,17 +495,45 @@ module ccc
488495
if (have_defining_byte) state_d = RxDefByte;
489496
else begin
490497
// 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
492506
// broadcast CCCs
493507
else if (~is_direct_cmd) state_d = RxData;
494508
// direct CCCs
495-
else
496-
state_d = RxByte;
509+
else state_d = RxByte;
497510
end
498511
end
499512
end
500513
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
502537
end
503538
RxDefByte: begin
504539
if (bus_rx_done_i) state_d = RxDefByteTbit;
@@ -750,6 +785,13 @@ module ccc
750785
set_dasa_virtual_device_o = is_byte_virtual_addr ? (set_aasa_valid ? set_aasa_valid : set_dasa_valid) : 1'b0;
751786
end
752787

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+
753795
// Handle DIRECT SET CCCs
754796
always_ff @(posedge clk_i or negedge rst_ni) begin : proc_set_direct
755797
if (~rst_ni) begin
@@ -1009,7 +1051,7 @@ module ccc
10091051
.arbitration_lost_i,
10101052

10111053
// 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)
10141056
);
10151057
endmodule

0 commit comments

Comments
 (0)