@@ -473,10 +473,41 @@ module ccc
473
473
assign is_byte_our_virtual_static_addr = ((command_addr == virtual_target_sta_address_i) && virtual_target_sta_address_valid_i);
474
474
assign is_byte_virtual_addr = is_byte_our_virtual_dynamic_addr | is_byte_our_virtual_static_addr;
475
475
476
+ logic supported_direct_command_code;
477
+
478
+ assign supported_direct_command_code = command_code inside {
479
+ // Setters
480
+ `I3C_DIRECT_SETDASA ,
481
+ `I3C_DIRECT_SETNEWDA ,
482
+ `I3C_DIRECT_SETXTIME ,
483
+ `I3C_DIRECT_SETMWL ,
484
+ `I3C_DIRECT_SETMRL ,
485
+ `I3C_DIRECT_ENEC ,
486
+ `I3C_DIRECT_DISEC ,
487
+ // Getters
488
+ `I3C_DIRECT_GETBCR ,
489
+ `I3C_DIRECT_GETDCR ,
490
+ `I3C_DIRECT_RSTACT ,
491
+ `I3C_DIRECT_GETSTATUS ,
492
+ `I3C_DIRECT_GETMWL ,
493
+ `I3C_DIRECT_GETMRL ,
494
+ `I3C_DIRECT_GETPID ,
495
+ `I3C_DIRECT_GETCAPS
496
+ } ;
497
+
498
+ logic unsupported_def_byte;
499
+
500
+ assign unsupported_def_byte = have_defining_byte & (
501
+ (command_code == `I3C_DIRECT_RSTACT ) & ~ (defining_byte inside { 8'h00 , 8'h01 , 8'h02 , 8'h81 , 8'h82 } ));
502
+
503
+ logic supported_direct_command;
504
+ assign supported_direct_command = supported_direct_command_code & ~ unsupported_def_byte;
505
+
476
506
logic direct_addr_ack;
477
507
478
- assign direct_addr_ack = (command_code == `I3C_DIRECT_SETDASA ) ? ((is_byte_our_static_addr && ~ target_dyn_address_valid_i) | (is_byte_our_virtual_static_addr && ~ virtual_target_dyn_address_valid_i)) :
479
- (is_byte_our_addr | is_byte_rsvd_addr | is_byte_virtual_addr);
508
+ assign direct_addr_ack = (command_code == `I3C_DIRECT_SETDASA ) ?
509
+ ((is_byte_our_static_addr && ~ target_dyn_address_valid_i) | (is_byte_our_virtual_static_addr && ~ virtual_target_dyn_address_valid_i)) :
510
+ ((is_byte_our_addr | is_byte_virtual_addr) & supported_direct_command | is_byte_rsvd_addr );
480
511
481
512
always_ff @ (posedge clk_i or negedge rst_ni) begin : proc_addr
482
513
if (~ rst_ni) begin
@@ -599,8 +630,8 @@ module ccc
599
630
end
600
631
else begin
601
632
if (is_byte_rsvd_addr) state_d = NextCCC;
602
- else if ((is_byte_our_addr || is_byte_virtual_addr) && command_rnw) state_d = TxData;
603
- else if ((is_byte_our_addr || is_byte_virtual_addr) && ~ command_rnw) begin
633
+ else if ((is_byte_our_addr || is_byte_virtual_addr) && command_rnw && supported_direct_command ) state_d = TxData;
634
+ else if ((is_byte_our_addr || is_byte_virtual_addr) && ~ command_rnw && supported_direct_command ) begin
604
635
if (command_code == `I3C_DIRECT_SETXTIME ) state_d = RxSubCmdByte;
605
636
else state_d = RxData;
606
637
end else state_d = WaitForBusCond;
0 commit comments