@@ -167,6 +167,10 @@ module ccc
167
167
output logic set_mrl_o,
168
168
output logic [15 : 0 ] mrl_o,
169
169
170
+ // Set Max Read Length
171
+ output logic set_ibil_o,
172
+ output logic [7 : 0 ] ibil_o,
173
+
170
174
// Enter Test Mode
171
175
output logic ent_tm_o,
172
176
output logic [7 : 0 ] tm_o,
@@ -230,6 +234,10 @@ module ccc
230
234
// I3C_DIRECT_GETMRL
231
235
input logic [15 : 0 ] get_mrl_i,
232
236
237
+ // Get Max IBI Length
238
+ // I3C_DIRECT_GETMRL
239
+ input logic [7 : 0 ] get_ibil_i,
240
+
233
241
// Get Provisioned ID
234
242
// I3C_DIRECT_GETPID
235
243
input logic [47 : 0 ] get_pid_i,
@@ -497,8 +505,9 @@ module ccc
497
505
498
506
logic unsupported_def_byte;
499
507
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 } ));
508
+ assign unsupported_def_byte = have_defining_byte & valid_defining_byte & (
509
+ (command_code == `I3C_DIRECT_RSTACT ) & ~ (defining_byte inside { 8'h00 , 8'h01 , 8'h02 , 8'h81 , 8'h82 } )
510
+ | (command_code == `I3C_DIRECT_GETCAPS ));
502
511
503
512
logic supported_direct_command;
504
513
assign supported_direct_command = supported_direct_command_code & ~ unsupported_def_byte;
@@ -843,9 +852,7 @@ module ccc
843
852
tx_data_id_init = 8'h03 ;
844
853
if (tx_data_id == 8'h03 ) tx_data = get_mrl_i[15 : 8 ];
845
854
else if (tx_data_id == 8'h02 ) tx_data = get_mrl_i[7 : 0 ];
846
- else if (tx_data_id == 8'h01 )
847
- // Maximum IBI payload size is 256 Bytes
848
- tx_data = '1 ;
855
+ else if (tx_data_id == 8'h01 ) tx_data = get_ibil_i;
849
856
else tx_data = '0 ;
850
857
end
851
858
`I3C_DIRECT_GETPID : begin
@@ -934,6 +941,8 @@ module ccc
934
941
if (~ rst_ni) begin
935
942
set_mrl_o <= 1'b0 ;
936
943
mrl_o <= '0 ;
944
+ set_ibil_o <= 1'b0 ;
945
+ ibil_o <= '1 ;
937
946
set_mwl_o <= 1'b0 ;
938
947
mwl_o <= '0 ;
939
948
enec_ibi <= '0 ;
@@ -953,7 +962,7 @@ module ccc
953
962
case (command_code)
954
963
// setmwl
955
964
`I3C_DIRECT_SETMWL , `I3C_BCAST_SETMWL : begin
956
- if (state_q == RxDataTbit && bus_rx_done_i && ~ is_byte_rsvd_addr) begin
965
+ if (state_q == RxDataTbit && bus_rx_done_i && ( ~ is_byte_rsvd_addr || command_code == `I3C_BCAST_SETMWL ) ) begin
957
966
if (rx_data_count == 8'd0 ) begin
958
967
mwl_o[15 : 8 ] <= rx_data;
959
968
set_mwl_o <= 1'b0 ;
@@ -969,17 +978,25 @@ module ccc
969
978
end
970
979
// setmrl
971
980
`I3C_DIRECT_SETMRL , `I3C_BCAST_SETMRL : begin
972
- if (state_q == RxDataTbit && bus_rx_done_i && ~ is_byte_rsvd_addr) begin
981
+ if (state_q == RxDataTbit && bus_rx_done_i && ( ~ is_byte_rsvd_addr || command_code == `I3C_BCAST_SETMRL ) ) begin
973
982
if (rx_data_count == 8'd0 ) begin
974
983
mrl_o[15 : 8 ] <= rx_data;
984
+ set_ibil_o <= 1'b0 ;
975
985
set_mrl_o <= 1'b0 ;
976
986
end else if (rx_data_count == 8'd1 ) begin
977
987
mrl_o[7 : 0 ] <= rx_data;
988
+ set_ibil_o <= 1'b0 ;
978
989
set_mrl_o <= 1'b1 ;
990
+ end else if (rx_data_count == 8'd2 ) begin
991
+ ibil_o[7 : 0 ] <= rx_data;
992
+ set_ibil_o <= 1'b1 ;
993
+ set_mrl_o <= 1'b0 ;
979
994
end else begin
995
+ set_ibil_o <= 1'b0 ;
980
996
set_mrl_o <= 1'b0 ;
981
997
end
982
998
end else begin
999
+ set_ibil_o <= 1'b0 ;
983
1000
set_mrl_o <= 1'b0 ;
984
1001
end
985
1002
end
0 commit comments