Skip to content

Commit 11c30a0

Browse files
committed
NACK unknown direct commands
Signed-off-by: Maciej Dudek <[email protected]>
1 parent df1fbd4 commit 11c30a0

File tree

1 file changed

+35
-4
lines changed

1 file changed

+35
-4
lines changed

src/ctrl/ccc.sv

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -473,10 +473,41 @@ module ccc
473473
assign is_byte_our_virtual_static_addr = ((command_addr == virtual_target_sta_address_i) && virtual_target_sta_address_valid_i);
474474
assign is_byte_virtual_addr = is_byte_our_virtual_dynamic_addr | is_byte_our_virtual_static_addr;
475475

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+
476506
logic direct_addr_ack;
477507

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 );
480511

481512
always_ff @(posedge clk_i or negedge rst_ni) begin : proc_addr
482513
if (~rst_ni) begin
@@ -599,8 +630,8 @@ module ccc
599630
end
600631
else begin
601632
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
604635
if (command_code == `I3C_DIRECT_SETXTIME) state_d = RxSubCmdByte;
605636
else state_d = RxData;
606637
end else state_d = WaitForBusCond;

0 commit comments

Comments
 (0)