@@ -323,6 +323,8 @@ module ccc
323
323
logic set_aasa_valid;
324
324
logic [6 : 0 ] set_aasa_addr;
325
325
326
+ logic set_newda_valid;
327
+ logic [6 : 0 ] set_newda_addr;
326
328
logic entdaa_addres_valid;
327
329
logic [6 : 0 ] entdaa_address;
328
330
logic entdaa_process_virtual;
@@ -441,32 +443,24 @@ module ccc
441
443
logic is_byte_rsvd_addr;
442
444
assign is_byte_rsvd_addr = (rx_data == { 7'h7E , 1'b0 } ) | (command_addr == 7'h7E );
443
445
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;
444
450
logic is_byte_our_addr;
445
451
logic is_byte_virtual_addr;
446
452
447
453
logic [7 : 0 ] rx_data_count;
448
454
449
455
logic entdaa_start, entdaa_done;
450
456
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;
460
460
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;
470
464
471
465
always_ff @ (posedge clk_i or negedge rst_ni) begin : proc_addr
472
466
if (~ rst_ni) begin
@@ -598,7 +592,6 @@ module ccc
598
592
RxDataTbit: begin
599
593
if (bus_rx_done_i) state_d = RxData;
600
594
end
601
-
602
595
TxData: begin
603
596
if (bus_rstart_det_i) state_d = RxDirectAddr;
604
597
else if (bus_tx_done_i) state_d = TxDataTbit;
@@ -805,16 +798,18 @@ module ccc
805
798
806
799
// connect entdaa/setnewda
807
800
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;
811
804
end
812
805
813
806
// Handle DIRECT SET CCCs
814
807
always_ff @ (posedge clk_i or negedge rst_ni) begin : proc_set_direct
815
808
if (~ rst_ni) begin
816
809
set_dasa_valid <= 1'b0 ;
817
810
set_dasa_addr <= '0 ;
811
+ set_newda_valid <= 1'b0 ;
812
+ set_newda_addr <= '0 ;
818
813
end else begin
819
814
case (command_code)
820
815
// setdasa has only one data byte - dynamic address
@@ -827,6 +822,15 @@ module ccc
827
822
set_dasa_valid <= 1'b0 ;
828
823
end
829
824
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
830
834
default : begin
831
835
end
832
836
endcase
0 commit comments