@@ -323,6 +323,8 @@ module ccc
323323 logic set_aasa_valid;
324324 logic [6 : 0 ] set_aasa_addr;
325325
326+ logic set_newda_valid;
327+ logic [6 : 0 ] set_newda_addr;
326328 logic entdaa_addres_valid;
327329 logic [6 : 0 ] entdaa_address;
328330 logic entdaa_process_virtual;
@@ -441,32 +443,24 @@ module ccc
441443 logic is_byte_rsvd_addr;
442444 assign is_byte_rsvd_addr = (rx_data == { 7'h7E , 1'b0 } ) | (command_addr == 7'h7E );
443445
446+ logic is_byte_our_dynamic_addr;
447+ logic is_byte_our_virtual_dynamic_addr;
448+ logic is_byte_our_static_addr;
449+ logic is_byte_our_virtual_static_addr;
444450 logic is_byte_our_addr;
445451 logic is_byte_virtual_addr;
446452
447453 logic [7 : 0 ] rx_data_count;
448454
449455 logic entdaa_start, entdaa_done;
450456
451- always_comb begin : addr_matching
452- if (target_dyn_address_valid_i) begin
453- is_byte_our_addr = command_addr == target_dyn_address_i;
454- end else if (target_sta_address_valid_i) begin
455- is_byte_our_addr = command_addr == target_sta_address_i;
456- end else begin
457- is_byte_our_addr = '0 ;
458- end
459- end
457+ assign is_byte_our_dynamic_addr = ((command_addr == target_dyn_address_i) && target_dyn_address_valid_i);
458+ assign is_byte_our_static_addr = ((command_addr == target_sta_address_i) && target_sta_address_valid_i);
459+ assign is_byte_our_addr = is_byte_our_dynamic_addr | is_byte_our_static_addr;
460460
461- always_comb begin : virtual_addr_matching
462- if (virtual_target_dyn_address_valid_i) begin
463- is_byte_virtual_addr = command_addr == virtual_target_dyn_address_i;
464- end else if (virtual_target_sta_address_valid_i) begin
465- is_byte_virtual_addr = command_addr == virtual_target_sta_address_i;
466- end else begin
467- is_byte_virtual_addr = '0 ;
468- end
469- end
461+ assign is_byte_our_virtual_dynamic_addr = ((command_addr == virtual_target_dyn_address_i) && virtual_target_dyn_address_valid_i);
462+ assign is_byte_our_virtual_static_addr = ((command_addr == virtual_target_sta_address_i) && virtual_target_sta_address_valid_i);
463+ assign is_byte_virtual_addr = is_byte_our_virtual_dynamic_addr | is_byte_our_virtual_static_addr;
470464
471465 always_ff @ (posedge clk_i or negedge rst_ni) begin : proc_addr
472466 if (~ rst_ni) begin
@@ -598,7 +592,6 @@ module ccc
598592 RxDataTbit: begin
599593 if (bus_rx_done_i) state_d = RxData;
600594 end
601-
602595 TxData: begin
603596 if (bus_rstart_det_i) state_d = RxDirectAddr;
604597 else if (bus_tx_done_i) state_d = TxDataTbit;
@@ -805,16 +798,18 @@ module ccc
805798
806799 // connect entdaa/setnewda
807800 always_comb begin : entdaa_setnewda_mux
808- set_newda_o = entdaa_addres_valid && (state_q == HandleTargetENTDAA);
809- set_newda_virtual_device_o = entdaa_addres_valid && (state_q == HandleVirtualTargetENTDAA);
810- newda_o = entdaa_address;
801+ set_newda_o = set_newda_valid | ( entdaa_addres_valid && (( state_q == HandleTargetENTDAA) || (state_q == HandleVirtualTargetENTDAA)) );
802+ set_newda_virtual_device_o = set_newda_valid ? is_byte_our_virtual_dynamic_addr : ( entdaa_addres_valid && (state_q == HandleVirtualTargetENTDAA) );
803+ newda_o = set_newda_valid ? set_newda_addr : entdaa_address;
811804 end
812805
813806 // Handle DIRECT SET CCCs
814807 always_ff @ (posedge clk_i or negedge rst_ni) begin : proc_set_direct
815808 if (~ rst_ni) begin
816809 set_dasa_valid <= 1'b0 ;
817810 set_dasa_addr <= '0 ;
811+ set_newda_valid <= 1'b0 ;
812+ set_newda_addr <= '0 ;
818813 end else begin
819814 case (command_code)
820815 // setdasa has only one data byte - dynamic address
@@ -827,6 +822,15 @@ module ccc
827822 set_dasa_valid <= 1'b0 ;
828823 end
829824 end
825+ `I3C_DIRECT_SETNEWDA : begin
826+ if (state_q == RxDataTbit && bus_rx_done_i && ~ is_byte_rsvd_addr &&
827+ rx_data_count == 8'd0 ) begin
828+ set_newda_addr <= rx_data[7 : 1 ];
829+ set_newda_valid <= 1'b1 ;
830+ end else begin
831+ set_newda_valid <= 1'b0 ;
832+ end
833+ end
830834 default : begin
831835 end
832836 endcase
0 commit comments