Module Definition
dashboard | hierarchy | modlist | groups | tests | asserts

Module : spi_device
SCORELINECONDTOGGLEFSMBRANCHASSERT
92.52 95.20 84.31 97.00 90.62 95.45

Source File(s) :
/workspaces/repo/scratch/os_regression/spi_device_2p-sim-vcs/default/sim-vcs/../src/lowrisc_ip_spi_device_0.1/rtl/spi_device.sv

Module self-instances :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
tb.dut 92.52 95.20 84.31 97.00 90.62 95.45



Module Instance : tb.dut

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
92.52 95.20 84.31 97.00 90.62 95.45


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
95.54 98.44 94.08 98.62 89.36 97.28 95.43


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
tb


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
gen_alert_tx[0].u_prim_alert_sender 100.00 100.00
spi_device_csr_assert 100.00 100.00
tlul_assert_device 100.00 100.00 100.00 100.00
u_clk_csb_buf 100.00 100.00
u_clk_csb_mux 64.81 100.00 44.44 50.00
u_clk_spi 85.19 100.00 55.56 100.00
u_clk_spi_in_buf 100.00 100.00
u_clk_spi_in_mux 64.81 100.00 44.44 50.00
u_clk_spi_out_buf 100.00 100.00
u_clk_spi_out_mux 64.81 100.00 44.44 50.00
u_cmdparse 97.84 100.00 93.26 100.00 95.92 100.00
u_csb_buf 100.00 100.00
u_csb_rst_out_scan_mux 64.81 100.00 44.44 50.00
u_csb_rst_scan_mux 64.81 100.00 44.44 50.00
u_flash_readbuf_flip_pulse_sync 100.00 100.00 100.00 100.00 100.00
u_flash_readbuf_watermark_pulse_sync 100.00 100.00 100.00 100.00 100.00
u_intr_cmdfifo_not_empty 100.00 100.00 100.00 100.00 100.00
u_intr_payload_not_empty 100.00 100.00 100.00 100.00 100.00
u_intr_payload_overflow 100.00 100.00 100.00 100.00 100.00
u_intr_readbuf_flip 100.00 100.00 100.00 100.00 100.00
u_intr_readbuf_watermark 100.00 100.00 100.00 100.00 100.00
u_intr_tpm_cmdaddr_notempty 100.00 100.00 100.00 100.00 100.00
u_intr_tpm_rdfifo_cmd_end 100.00 100.00 100.00 100.00 100.00
u_intr_tpm_rdfifo_drop 97.92 100.00 91.67 100.00 100.00
u_intr_upload_edge 100.00 100.00 100.00
u_jedec 99.38 100.00 100.00 100.00 96.88 100.00
u_p2s 85.98 100.00 71.43 72.50 100.00
u_passthrough 90.54 94.95 89.22 75.00 93.52 100.00
u_read_en_pipe_stg1 100.00 100.00 100.00
u_read_en_pipe_stg2 100.00 100.00 100.00
u_read_intercept_pipe_stg1 100.00 100.00 100.00
u_read_intercept_pipe_stg2 100.00 100.00 100.00
u_read_pipe_stg1 100.00 100.00 100.00
u_read_pipe_stg2 100.00 100.00 100.00
u_readcmd 89.30 93.62 90.32 87.50 84.15 90.91
u_reg 99.64 99.53 99.33 100.00 99.35 100.00
u_rst_spi_out_sync 100.00 100.00 100.00
u_s2p 89.38 100.00 78.57 78.95 100.00
u_scanmode_sync 100.00 100.00
u_spi_tpm 92.81 99.28 85.25 91.67 95.68 92.16
u_spid_addr_4b 86.34 97.59 77.78 95.00 75.00
u_spid_csb_sync 96.97 100.00 100.00 90.91
u_spid_dpram 95.45 100.00 81.82 100.00 100.00
u_spid_status 92.61 100.00 88.46 98.63 83.33
u_sys_csb_syncd 100.00 100.00 100.00
u_sys_sram_arbiter 89.65 100.00 76.47 96.43 85.71
u_sys_tpm_csb_sync 100.00 100.00 100.00
u_tlul2sram_egress 71.47 82.11 59.19 63.33 81.25
u_tlul2sram_ingress 86.64 88.21 73.90 84.44 100.00
u_tpm_csb_buf 100.00 100.00
u_tpm_csb_rst_scan_mux 64.81 100.00 44.44 50.00
u_tpm_csb_rst_sync 70.83 88.89 44.44 100.00 50.00
u_tpm_rst_out_scan_mux 64.81 100.00 44.44 50.00
u_tpm_rst_out_sync 100.00 100.00 100.00
u_upload 90.79 98.60 71.95 100.00 94.12 89.29


Since this is the module's only instance, the coverage report is the same as for the module.
Line Coverage for Module : spi_device
Line No.TotalCoveredPercent
TOTAL22921895.20
CONT_ASSIGN17311100.00
CONT_ASSIGN30911100.00
CONT_ASSIGN37211100.00
CONT_ASSIGN37311100.00
CONT_ASSIGN37611100.00
CONT_ASSIGN37711100.00
CONT_ASSIGN37911100.00
CONT_ASSIGN39411100.00
CONT_ASSIGN52711100.00
CONT_ASSIGN53411100.00
CONT_ASSIGN53611100.00
ALWAYS53944100.00
CONT_ASSIGN54711100.00
CONT_ASSIGN55311100.00
CONT_ASSIGN55411100.00
CONT_ASSIGN55911100.00
CONT_ASSIGN56011100.00
CONT_ASSIGN56411100.00
ALWAYS56900
ALWAYS56922100.00
CONT_ASSIGN57411100.00
CONT_ASSIGN57511100.00
ALWAYS58300
ALWAYS5831212100.00
CONT_ASSIGN64711100.00
CONT_ASSIGN64811100.00
CONT_ASSIGN64911100.00
CONT_ASSIGN71011100.00
ALWAYS82833100.00
ALWAYS83488100.00
ALWAYS87299100.00
ALWAYS8962424100.00
CONT_ASSIGN96411100.00
CONT_ASSIGN96511100.00
ALWAYS102877100.00
ALWAYS10411313100.00
ALWAYS107833100.00
CONT_ASSIGN121711100.00
CONT_ASSIGN122011100.00
CONT_ASSIGN122411100.00
CONT_ASSIGN122511100.00
CONT_ASSIGN122611100.00
CONT_ASSIGN122811100.00
CONT_ASSIGN122911100.00
CONT_ASSIGN123211100.00
CONT_ASSIGN1282100.00
CONT_ASSIGN1313100.00
CONT_ASSIGN139611100.00
CONT_ASSIGN139711100.00
CONT_ASSIGN139811100.00
CONT_ASSIGN139911100.00
CONT_ASSIGN140011100.00
CONT_ASSIGN140211100.00
CONT_ASSIGN140611100.00
CONT_ASSIGN141311100.00
CONT_ASSIGN141411100.00
CONT_ASSIGN141611100.00
CONT_ASSIGN142011100.00
CONT_ASSIGN142311100.00
CONT_ASSIGN142611100.00
CONT_ASSIGN142911100.00
CONT_ASSIGN143211100.00
CONT_ASSIGN143511100.00
CONT_ASSIGN144211100.00
CONT_ASSIGN144311100.00
CONT_ASSIGN148211100.00
CONT_ASSIGN1585100.00
CONT_ASSIGN159311100.00
CONT_ASSIGN159411100.00
CONT_ASSIGN159511100.00
CONT_ASSIGN159611100.00
CONT_ASSIGN159711100.00
CONT_ASSIGN160011100.00
CONT_ASSIGN160711100.00
CONT_ASSIGN161411100.00
CONT_ASSIGN161411100.00
CONT_ASSIGN161411100.00
CONT_ASSIGN161411100.00
CONT_ASSIGN161411100.00
CONT_ASSIGN161711100.00
CONT_ASSIGN161811100.00
CONT_ASSIGN161911100.00
CONT_ASSIGN162011100.00
CONT_ASSIGN162111100.00
CONT_ASSIGN162211100.00
CONT_ASSIGN162411100.00
CONT_ASSIGN162811100.00
CONT_ASSIGN163011100.00
CONT_ASSIGN163111100.00
CONT_ASSIGN163811100.00
CONT_ASSIGN164011100.00
CONT_ASSIGN164111100.00
CONT_ASSIGN165011100.00
CONT_ASSIGN165111100.00
CONT_ASSIGN165211100.00
CONT_ASSIGN165311100.00
CONT_ASSIGN171611100.00
CONT_ASSIGN171811100.00
ALWAYS172344100.00
ALWAYS173200
ALWAYS173299100.00
CONT_ASSIGN174911100.00
CONT_ASSIGN174911100.00
CONT_ASSIGN174911100.00
CONT_ASSIGN174911100.00
CONT_ASSIGN174911100.00
CONT_ASSIGN175011100.00
CONT_ASSIGN175011100.00
CONT_ASSIGN1750100.00
CONT_ASSIGN1750100.00
CONT_ASSIGN1750100.00
CONT_ASSIGN175111100.00
CONT_ASSIGN175111100.00
CONT_ASSIGN1751100.00
CONT_ASSIGN1751100.00
CONT_ASSIGN175111100.00
CONT_ASSIGN175211100.00
CONT_ASSIGN175211100.00
CONT_ASSIGN1752100.00
CONT_ASSIGN1752100.00
CONT_ASSIGN1752100.00
CONT_ASSIGN175411100.00
CONT_ASSIGN175411100.00
CONT_ASSIGN175411100.00
CONT_ASSIGN175411100.00
CONT_ASSIGN175411100.00
CONT_ASSIGN175511100.00
CONT_ASSIGN175511100.00
CONT_ASSIGN175511100.00
CONT_ASSIGN175511100.00
CONT_ASSIGN175511100.00
CONT_ASSIGN175611100.00
CONT_ASSIGN175611100.00
CONT_ASSIGN175611100.00
CONT_ASSIGN175611100.00
CONT_ASSIGN175611100.00
CONT_ASSIGN179711100.00
CONT_ASSIGN179911100.00
CONT_ASSIGN180011100.00
CONT_ASSIGN180111100.00
CONT_ASSIGN180211100.00
CONT_ASSIGN180311100.00
CONT_ASSIGN180511100.00
CONT_ASSIGN180611100.00
CONT_ASSIGN180711100.00
CONT_ASSIGN186311100.00

172 173 1/1 assign payload_notempty = payload_depth != '0; Tests: T1 T2 T3  174 175 ///////////////////// 176 // Control signals // 177 ///////////////////// 178 179 logic txorder; // TX bitstream order: 0(bit 7 to 0), 1(bit 0 to 7) 180 logic rxorder; // RX bitstream order: 0(bit 7 to 0), 1(bit 0 to 7) 181 182 logic sys_csb_syncd; 183 184 spi_mode_e spi_mode; 185 logic cfg_addr_4b_en; 186 logic cmd_sync_addr_4b_en; 187 188 // Address 3B/ 4B tracker related signals 189 // 190 // EN4B/ EX4B change internal status by HW. If SW is involved into the 191 // process, the latency is long. As EN4B/ EX4B commands do not assert BUSY 192 // bit, the host system issues next read commands without any delays. SW 193 // process latency cannot meet the requirement. 194 // 195 // `spid_addr_4b` submodule processes the broadcasting signal 196 // `cfg_addr_4b_en`. The command parser recognizes the commands and triggers 197 // the `spid_addr_4b` submodule to change the internal status. 198 // 199 // The opcodes of the commands SW may configure via CMD_INFO_EN4B, 200 // CMD_INFO_EX4B. 201 logic cmd_en4b_pulse, cmd_ex4b_pulse; 202 203 // SPI S2P signals 204 // io_mode: Determine s2p/p2s behavior. 205 // io_mode is changed at the negedge of SPI_CLK (based on the SPI protocol). 206 // sub_iomode originates from the clk_spi_in domain, with flop values that 207 // may have changed based on the input of SPI. The sub_iomode is selected 208 // and sampled on the clk_spi_out domain. 209 io_mode_e io_mode, io_mode_outclk; 210 io_mode_e sub_iomode[IoModeEnd]; 211 logic s2p_data_valid; 212 spi_byte_t s2p_data; 213 214 logic p2s_valid; 215 spi_byte_t p2s_data; 216 logic p2s_sent; 217 218 logic sub_p2s_valid[IoModeEnd]; 219 spi_byte_t sub_p2s_data[IoModeEnd]; 220 logic sub_p2s_sent[IoModeEnd]; 221 222 // Read commands related signals 223 logic [31:0] readbuf_addr_sck; 224 logic [31:0] readbuf_addr_busclk; 225 226 // CMD interface 227 sel_datapath_e cmd_dp_sel, cmd_only_dp_sel; 228 229 // Mailbox in Passthrough needs to take SPI if readcmd hits mailbox address 230 logic intercept_en, intercept_en_out; 231 232 logic cfg_mailbox_en; 233 logic [31:0] mailbox_addr; 234 235 // Intercept 236 typedef struct packed { 237 logic status; 238 logic jedec; 239 logic sfdp; 240 logic mbx; 241 } intercept_t; 242 intercept_t cfg_intercept_en; 243 intercept_t intercept; // Assume signals 244 245 // Threshold value of a buffer in bytes 246 logic [BufferAw:0] readbuf_threshold; 247 248 // Synchronous clear of read buffer tracking. 249 logic readbuf_clr; 250 251 // Passthrouth config signals 252 logic [255:0] cmd_filter; 253 254 logic [31:0] addr_swap_mask; 255 logic [31:0] addr_swap_data; 256 257 logic [31:0] payload_swap_mask; 258 logic [31:0] payload_swap_data; 259 260 // Additional 2-stage read pipeline configuration 261 logic cmd_read_pipeline_sel; 262 263 // Command Info structure 264 cmd_info_t [NumTotalCmdInfo-1:0] cmd_info; 265 // Broadcasted cmd_info. cmdparse compares the opcode up to CmdInfoReadCmdEnd 266 // and latches the cmd_info and broadcast to submodules 267 cmd_info_t cmd_info_broadcast; 268 logic [CmdInfoIdxW-1:0] cmd_info_idx_broadcast; 269 // Combinatorial output of selected cmd_info, to be used with modules that 270 // need the values before the 8th posedge of the command. 271 cmd_info_t cmd_only_info_broadcast; 272 logic [CmdInfoIdxW-1:0] cmd_only_info_idx_broadcast; 273 274 // Synchronization pulse indicating that the 8th bit of the command is 275 // arriving. This is used to time the transfer of some data to/from the sys 276 // domain. 277 logic cmd_sync_pulse; 278 279 // CSb edge detector in the system clock and SPI input clock 280 // SYS clock assertion can be detected but no usage for the event yet. 281 // SPI clock de-assertion cannot be detected as no SCK at the time is given. 282 logic sys_csb_deasserted_pulse; 283 284 // Important status bits for tracking in the upload module 285 logic cmd_sync_status_busy; 286 logic cmd_sync_status_wel; 287 logic sck_status_busy; 288 289 // Read Status input and broadcast 290 logic sck_status_busy_set; // set by HW (upload) 291 logic csb_status_busy_broadcast; // from spid_status 292 293 // WREN / WRDI HW signal 294 logic sck_status_wr_set; 295 logic sck_status_wr_clr; 296 297 // Jedec ID 298 jedec_cfg_t jedec_cfg; 299 300 // Interrupts in Flash mode 301 logic intr_upload_cmdfifo_not_empty, intr_upload_payload_not_empty; 302 logic intr_upload_payload_overflow; 303 logic intr_readbuf_watermark, intr_readbuf_flip; 304 logic flash_sck_readbuf_watermark, flash_sck_readbuf_flip; 305 306 // TPM =============================================================== 307 // Interface 308 logic tpm_mosi, tpm_miso, tpm_miso_en; 309 1/1 assign tpm_mosi = cio_sd_i[0]; Tests: T4 T5 T11  310 311 // Return-by-HW registers 312 logic [8*spi_device_reg_pkg::NumLocality-1:0] tpm_access; 313 logic [31:0] tpm_int_enable; 314 logic [7:0] tpm_int_vector; 315 logic [31:0] tpm_int_status; 316 logic [31:0] tpm_intf_capability; 317 logic [31:0] tpm_status; 318 logic [31:0] tpm_did_vid; 319 logic [7:0] tpm_rid; 320 321 // Buffer and FIFO signals 322 sram_l2m_t tpm_sram_l2m; 323 sram_m2l_t tpm_sram_m2l; 324 logic tpm_cmdaddr_rvalid, tpm_cmdaddr_rready; 325 logic [31:0] tpm_cmdaddr_rdata; 326 logic tpm_rdfifo_wvalid, tpm_rdfifo_wready; 327 logic [TpmRdFifoWidth-1:0] tpm_rdfifo_wdata; 328 logic tpm_event_rdfifo_cmd_end; 329 logic tpm_event_rdfifo_drop; 330 331 tpm_cap_t tpm_cap; 332 333 // TPM CFG 334 logic cfg_tpm_en, cfg_tpm_mode, cfg_tpm_hw_reg_dis; 335 logic cfg_tpm_invalid_locality, cfg_tpm_reg_chk_dis; 336 337 // TPM_STATUS 338 logic tpm_status_cmdaddr_notempty; 339 logic tpm_status_wrfifo_pending; 340 logic tpm_status_wrfifo_release; 341 logic tpm_status_rdfifo_aborted; 342 343 // TPM --------------------------------------------------------------- 344 345 ///////////////// 346 // CSb Buffers // 347 ///////////////// 348 // Split the CSB into multiple explicit buffers. One for reset, two for each 349 // clock domains. 350 logic clk_csb_buf, rst_csb_buf, sys_csb, sck_csb; 351 prim_buf #( 352 .Width (4) 353 ) u_csb_buf ( 354 .in_i ({4{cio_csb_i}}), 355 .out_o ({clk_csb_buf, rst_csb_buf, sys_csb, sck_csb}) 356 ); 357 358 // Split TPM CSB into explicit reset and data. 359 logic rst_tpm_csb_buf, sys_tpm_csb_buf, sck_tpm_csb_buf; 360 logic sys_tpm_csb_syncd; // synchronized prior to be connected to reg 361 prim_buf #( 362 .Width (3) 363 ) u_tpm_csb_buf ( 364 .in_i ({3{cio_tpm_csb_i}}), 365 .out_o ({rst_tpm_csb_buf, sys_tpm_csb_buf, sck_tpm_csb_buf}) 366 ); 367 368 ////////////////////////////////////////////////////////////////////// 369 // Connect phase (between control signals above and register module // 370 ////////////////////////////////////////////////////////////////////// 371 372 1/1 assign txorder = reg2hw.cfg.tx_order.q; Tests: T1 T2 T3  373 1/1 assign rxorder = reg2hw.cfg.rx_order.q; Tests: T1 T2 T3  374 375 // CSb : after 2stage synchronizer 376 1/1 assign hw2reg.status.csb.d = sys_csb_syncd; Tests: T1 T2 T3  377 1/1 assign hw2reg.status.tpm_csb.d = sys_tpm_csb_syncd; Tests: T1 T2 T3  378 379 1/1 assign spi_mode = spi_mode_e'(reg2hw.control.mode.q); Tests: T1 T2 T3  380 381 prim_edge_detector #( 382 .Width (2), 383 .EnSync(1'b 0) 384 ) u_intr_upload_edge ( 385 .clk_i, 386 .rst_ni, 387 388 .d_i ({payload_notempty, payload_overflow}), 389 .q_sync_o (), 390 .q_posedge_pulse_o ({intr_upload_payload_not_empty, 391 intr_upload_payload_overflow}), 392 .q_negedge_pulse_o () 393 ); 394 1/1 assign intr_upload_cmdfifo_not_empty = cmdfifo_set_pulse; Tests: T1 T2 T3  395 396 prim_intr_hw #(.Width(1)) u_intr_cmdfifo_not_empty ( 397 .clk_i, 398 .rst_ni, 399 .event_intr_i (intr_upload_cmdfifo_not_empty ), 400 .reg2hw_intr_enable_q_i (reg2hw.intr_enable.upload_cmdfifo_not_empty.q), 401 .reg2hw_intr_test_q_i (reg2hw.intr_test.upload_cmdfifo_not_empty.q ), 402 .reg2hw_intr_test_qe_i (reg2hw.intr_test.upload_cmdfifo_not_empty.qe ), 403 .reg2hw_intr_state_q_i (reg2hw.intr_state.upload_cmdfifo_not_empty.q ), 404 .hw2reg_intr_state_d_o (hw2reg.intr_state.upload_cmdfifo_not_empty.d ), 405 .hw2reg_intr_state_de_o (hw2reg.intr_state.upload_cmdfifo_not_empty.de), 406 .intr_o (intr_upload_cmdfifo_not_empty_o ) 407 ); 408 409 prim_intr_hw #(.Width(1)) u_intr_payload_not_empty ( 410 .clk_i, 411 .rst_ni, 412 .event_intr_i (intr_upload_payload_not_empty ), 413 .reg2hw_intr_enable_q_i (reg2hw.intr_enable.upload_payload_not_empty.q), 414 .reg2hw_intr_test_q_i (reg2hw.intr_test.upload_payload_not_empty.q ), 415 .reg2hw_intr_test_qe_i (reg2hw.intr_test.upload_payload_not_empty.qe ), 416 .reg2hw_intr_state_q_i (reg2hw.intr_state.upload_payload_not_empty.q ), 417 .hw2reg_intr_state_d_o (hw2reg.intr_state.upload_payload_not_empty.d ), 418 .hw2reg_intr_state_de_o (hw2reg.intr_state.upload_payload_not_empty.de), 419 .intr_o (intr_upload_payload_not_empty_o ) 420 ); 421 422 prim_intr_hw #(.Width(1)) u_intr_payload_overflow ( 423 .clk_i, 424 .rst_ni, 425 .event_intr_i (intr_upload_payload_overflow ), 426 .reg2hw_intr_enable_q_i (reg2hw.intr_enable.upload_payload_overflow.q), 427 .reg2hw_intr_test_q_i (reg2hw.intr_test.upload_payload_overflow.q ), 428 .reg2hw_intr_test_qe_i (reg2hw.intr_test.upload_payload_overflow.qe ), 429 .reg2hw_intr_state_q_i (reg2hw.intr_state.upload_payload_overflow.q ), 430 .hw2reg_intr_state_d_o (hw2reg.intr_state.upload_payload_overflow.d ), 431 .hw2reg_intr_state_de_o (hw2reg.intr_state.upload_payload_overflow.de), 432 .intr_o (intr_upload_payload_overflow_o ) 433 ); 434 435 436 prim_pulse_sync u_flash_readbuf_watermark_pulse_sync ( 437 .clk_src_i (clk_spi_in_buf ), 438 .rst_src_ni (rst_ni ), 439 .src_pulse_i (flash_sck_readbuf_watermark), 440 .clk_dst_i (clk_i ), 441 .rst_dst_ni (rst_ni ), 442 .dst_pulse_o (intr_readbuf_watermark ) 443 ); 444 prim_intr_hw #(.Width(1)) u_intr_readbuf_watermark ( 445 .clk_i, 446 .rst_ni, 447 .event_intr_i (intr_readbuf_watermark ), 448 .reg2hw_intr_enable_q_i (reg2hw.intr_enable.readbuf_watermark.q), 449 .reg2hw_intr_test_q_i (reg2hw.intr_test.readbuf_watermark.q ), 450 .reg2hw_intr_test_qe_i (reg2hw.intr_test.readbuf_watermark.qe ), 451 .reg2hw_intr_state_q_i (reg2hw.intr_state.readbuf_watermark.q ), 452 .hw2reg_intr_state_d_o (hw2reg.intr_state.readbuf_watermark.d ), 453 .hw2reg_intr_state_de_o (hw2reg.intr_state.readbuf_watermark.de), 454 .intr_o (intr_readbuf_watermark_o ) 455 ); 456 457 prim_pulse_sync u_flash_readbuf_flip_pulse_sync ( 458 .clk_src_i (clk_spi_in_buf ), 459 .rst_src_ni (rst_ni ), 460 .src_pulse_i (flash_sck_readbuf_flip), 461 .clk_dst_i (clk_i ), 462 .rst_dst_ni (rst_ni ), 463 .dst_pulse_o (intr_readbuf_flip ) 464 ); 465 prim_intr_hw #(.Width(1)) u_intr_readbuf_flip ( 466 .clk_i, 467 .rst_ni, 468 .event_intr_i (intr_readbuf_flip ), 469 .reg2hw_intr_enable_q_i (reg2hw.intr_enable.readbuf_flip.q), 470 .reg2hw_intr_test_q_i (reg2hw.intr_test.readbuf_flip.q ), 471 .reg2hw_intr_test_qe_i (reg2hw.intr_test.readbuf_flip.qe ), 472 .reg2hw_intr_state_q_i (reg2hw.intr_state.readbuf_flip.q ), 473 .hw2reg_intr_state_d_o (hw2reg.intr_state.readbuf_flip.d ), 474 .hw2reg_intr_state_de_o (hw2reg.intr_state.readbuf_flip.de), 475 .intr_o (intr_readbuf_flip_o ) 476 ); 477 478 prim_intr_hw #( 479 .Width (1 ), 480 .IntrT ("Status") 481 ) u_intr_tpm_cmdaddr_notempty ( 482 .clk_i, 483 .rst_ni, 484 .event_intr_i (tpm_status_cmdaddr_notempty ), 485 .reg2hw_intr_enable_q_i (reg2hw.intr_enable.tpm_header_not_empty.q), 486 .reg2hw_intr_test_q_i (reg2hw.intr_test.tpm_header_not_empty.q ), 487 .reg2hw_intr_test_qe_i (reg2hw.intr_test.tpm_header_not_empty.qe ), 488 .reg2hw_intr_state_q_i (reg2hw.intr_state.tpm_header_not_empty.q ), 489 .hw2reg_intr_state_d_o (hw2reg.intr_state.tpm_header_not_empty.d ), 490 .hw2reg_intr_state_de_o (hw2reg.intr_state.tpm_header_not_empty.de), 491 .intr_o (intr_tpm_header_not_empty_o ) 492 ); 493 494 prim_intr_hw #( 495 .Width (1 ), 496 .IntrT ("Event") 497 ) u_intr_tpm_rdfifo_cmd_end ( 498 .clk_i, 499 .rst_ni, 500 .event_intr_i (tpm_event_rdfifo_cmd_end ), 501 .reg2hw_intr_enable_q_i (reg2hw.intr_enable.tpm_rdfifo_cmd_end.q), 502 .reg2hw_intr_test_q_i (reg2hw.intr_test.tpm_rdfifo_cmd_end.q ), 503 .reg2hw_intr_test_qe_i (reg2hw.intr_test.tpm_rdfifo_cmd_end.qe ), 504 .reg2hw_intr_state_q_i (reg2hw.intr_state.tpm_rdfifo_cmd_end.q ), 505 .hw2reg_intr_state_d_o (hw2reg.intr_state.tpm_rdfifo_cmd_end.d ), 506 .hw2reg_intr_state_de_o (hw2reg.intr_state.tpm_rdfifo_cmd_end.de), 507 .intr_o (intr_tpm_rdfifo_cmd_end_o ) 508 ); 509 510 prim_intr_hw #( 511 .Width (1 ), 512 .IntrT ("Event") 513 ) u_intr_tpm_rdfifo_drop ( 514 .clk_i, 515 .rst_ni, 516 .event_intr_i (tpm_event_rdfifo_drop ), 517 .reg2hw_intr_enable_q_i (reg2hw.intr_enable.tpm_rdfifo_drop.q), 518 .reg2hw_intr_test_q_i (reg2hw.intr_test.tpm_rdfifo_drop.q ), 519 .reg2hw_intr_test_qe_i (reg2hw.intr_test.tpm_rdfifo_drop.qe ), 520 .reg2hw_intr_state_q_i (reg2hw.intr_state.tpm_rdfifo_drop.q ), 521 .hw2reg_intr_state_d_o (hw2reg.intr_state.tpm_rdfifo_drop.d ), 522 .hw2reg_intr_state_de_o (hw2reg.intr_state.tpm_rdfifo_drop.de), 523 .intr_o (intr_tpm_rdfifo_drop_o ) 524 ); 525 // SPI Flash commands registers 526 527 1/1 assign cfg_intercept_en = '{ Tests: T1 T2 T3  528 status: reg2hw.intercept_en.status.q, 529 jedec: reg2hw.intercept_en.jedec.q, 530 sfdp: reg2hw.intercept_en.sfdp.q, 531 mbx: reg2hw.intercept_en.mbx.q 532 }; 533 logic unused_cfg_intercept_en; 534 1/1 assign unused_cfg_intercept_en = ^cfg_intercept_en; Tests: T1 T2 T3  535 536 1/1 assign hw2reg.last_read_addr.d = readbuf_addr_busclk; Tests: T1 T2 T3  537 538 always_ff @(posedge clk_i or negedge rst_ni) begin 539 1/1 if (!rst_ni) begin Tests: T1 T2 T3  540 1/1 readbuf_addr_busclk <= '0; Tests: T1 T2 T3  541 1/1 end else if (sys_csb_deasserted_pulse) begin Tests: T1 T2 T3  542 1/1 readbuf_addr_busclk <= readbuf_addr_sck; Tests: T11 T12 T14  543 end MISSING_ELSE 544 end 545 546 // Jedec ID 547 1/1 assign jedec_cfg = '{ num_cc: reg2hw.jedec_cc.num_cc.q, Tests: T1 T2 T3  548 cc: reg2hw.jedec_cc.cc.q, 549 jedec_id: reg2hw.jedec_id.mf.q, 550 device_id: reg2hw.jedec_id.id.q 551 }; 552 553 1/1 assign readbuf_threshold = reg2hw.read_threshold.q[BufferAw:0]; Tests: T1 T2 T3  554 1/1 assign readbuf_clr = reg2hw.control.flash_read_buffer_clr.q; Tests: T1 T2 T3  555 assign hw2reg.control.flash_read_buffer_clr.d = '0; 556 assign hw2reg.control.flash_read_buffer_clr.de = 1'b1; 557 558 localparam int unsigned MailboxAw = $clog2(SramMailboxDepth*SramDw/8); 559 1/1 assign cfg_mailbox_en = reg2hw.cfg.mailbox_en.q; Tests: T1 T2 T3  560 1/1 assign mailbox_addr = { reg2hw.mailbox_addr.q[31:MailboxAw], Tests: T1 T2 T3  561 {MailboxAw{1'b0}} 562 }; 563 logic unused_mailbox_addr; 564 1/1 assign unused_mailbox_addr = ^reg2hw.mailbox_addr.q[MailboxAw-1:0]; Tests: T1 T2 T3  565 566 // Passthrough config: value shall be stable while SPI transaction is active 567 //assign cmd_filter = reg2hw.cmd_filter.q; 568 always_comb begin 569 1/1 for (int unsigned i = 0 ; i < 256 ; i++) begin Tests: T1 T2 T3  570 1/1 cmd_filter[i] = reg2hw.cmd_filter[i].q; Tests: T1 T2 T3  571 end 572 end 573 574 1/1 assign addr_swap_mask = reg2hw.addr_swap_mask.q; Tests: T1 T2 T3  575 1/1 assign addr_swap_data = reg2hw.addr_swap_data.q; Tests: T1 T2 T3  576 577 // payload_swap_mask and _data are big-endian to calculate easily. 578 assign payload_swap_mask = {<<8{reg2hw.payload_swap_mask.q}}; 579 assign payload_swap_data = {<<8{reg2hw.payload_swap_data.q}}; 580 581 // Connect command info 582 always_comb begin 583 1/1 for (int unsigned i = 0 ; i < spi_device_reg_pkg::NumCmdInfo ; i++) begin Tests: T1 T2 T3  584 1/1 cmd_info[i] = '{ Tests: T1 T2 T3  585 valid: reg2hw.cmd_info[i].valid.q, 586 opcode: reg2hw.cmd_info[i].opcode.q, 587 addr_mode: addr_mode_e'(reg2hw.cmd_info[i].addr_mode.q), 588 addr_swap_en: reg2hw.cmd_info[i].addr_swap_en.q, 589 mbyte_en: reg2hw.cmd_info[i].mbyte_en.q, 590 dummy_en: reg2hw.cmd_info[i].dummy_en.q, 591 dummy_size: reg2hw.cmd_info[i].dummy_size.q, 592 payload_en: reg2hw.cmd_info[i].payload_en.q, 593 payload_dir: payload_dir_e'(reg2hw.cmd_info[i].payload_dir.q), 594 payload_swap_en: reg2hw.cmd_info[i].payload_swap_en.q, 595 read_pipeline_mode: read_pipeline_mode_e'(reg2hw.cmd_info[i].read_pipeline_mode.q), 596 upload: reg2hw.cmd_info[i].upload.q, 597 busy: reg2hw.cmd_info[i].busy.q 598 }; 599 end 600 601 // Manual addition to cmd_info list 602 // Default Input mode 603 1/1 for (int unsigned i = CmdInfoReserveEnd + 1; i < NumTotalCmdInfo; i++) begin Tests: T1 T2 T3  604 1/1 cmd_info[i] = CmdInfoInput; Tests: T1 T2 T3  605 end 606 607 // Hand crafted command information slots 608 1/1 cmd_info[CmdInfoEn4B].valid = reg2hw.cmd_info_en4b.valid.q; Tests: T1 T2 T3  609 1/1 cmd_info[CmdInfoEn4B].opcode = reg2hw.cmd_info_en4b.opcode.q; Tests: T1 T2 T3  610 611 1/1 cmd_info[CmdInfoEx4B].valid = reg2hw.cmd_info_ex4b.valid.q; Tests: T1 T2 T3  612 1/1 cmd_info[CmdInfoEx4B].opcode = reg2hw.cmd_info_ex4b.opcode.q; Tests: T1 T2 T3  613 614 1/1 cmd_info[CmdInfoWrEn].valid = reg2hw.cmd_info_wren.valid.q; Tests: T1 T2 T3  615 1/1 cmd_info[CmdInfoWrEn].opcode = reg2hw.cmd_info_wren.opcode.q; Tests: T1 T2 T3  616 617 1/1 cmd_info[CmdInfoWrDi].valid = reg2hw.cmd_info_wrdi.valid.q; Tests: T1 T2 T3  618 1/1 cmd_info[CmdInfoWrDi].opcode = reg2hw.cmd_info_wrdi.opcode.q; Tests: T1 T2 T3  619 620 end 621 622 /////////////////////////// 623 // Clock & reset control // 624 /////////////////////////// 625 logic sck_n; 626 logic rst_spi_n; 627 prim_mubi_pkg::mubi4_t [ScanModeUseLast-1:0] scanmode; 628 629 prim_mubi4_sync #( 630 .NumCopies(int'(ScanModeUseLast)), 631 .AsyncOn(0) // clock/reset below is only used for SVAs. 632 ) u_scanmode_sync ( 633 .clk_i, 634 .rst_ni, 635 .mubi_i(scanmode_i), 636 .mubi_o(scanmode) 637 ); 638 639 prim_clock_inv #( 640 .NoFpgaBufG(1'b1) 641 ) u_clk_spi ( 642 .clk_i(cio_sck_i), 643 .clk_no(sck_n), 644 .scanmode_i(prim_mubi_pkg::mubi4_test_true_strict(scanmode[ClkInvSel])) 645 ); 646 647 1/1 assign sck_monitor_o = cio_sck_i; Tests: T1 T2 T3  648 1/1 assign clk_spi_in = cio_sck_i; Tests: T1 T2 T3  649 1/1 assign clk_spi_out = sck_n; Tests: T1 T2 T3  650 651 prim_clock_mux2 #( 652 .NoFpgaBufG(1'b1) 653 ) u_clk_spi_in_mux ( 654 .clk0_i(clk_spi_in), 655 .clk1_i(scan_clk_i), 656 .sel_i(prim_mubi_pkg::mubi4_test_true_strict(scanmode[ClkMuxSel]) | mbist_en_i), 657 .clk_o(clk_spi_in_muxed) 658 ); 659 660 prim_clock_buf #( 661 .RegionSel(1'b1) 662 ) u_clk_spi_in_buf( 663 .clk_i (clk_spi_in_muxed), 664 .clk_o (clk_spi_in_buf) 665 ); 666 667 prim_clock_mux2 #( 668 .NoFpgaBufG(1'b1) 669 ) u_clk_spi_out_mux ( 670 .clk0_i(clk_spi_out), 671 .clk1_i(scan_clk_i), 672 .sel_i(prim_mubi_pkg::mubi4_test_true_strict(scanmode[ClkMuxSel])), 673 .clk_o(clk_spi_out_muxed) 674 ); 675 676 prim_clock_buf #( 677 .RegionSel(1'b1) 678 ) u_clk_spi_out_buf( 679 .clk_i (clk_spi_out_muxed), 680 .clk_o (clk_spi_out_buf) 681 ); 682 683 // CSb muxed to scan clock 684 prim_clock_mux2 #( 685 .NoFpgaBufG(1'b 1) 686 ) u_clk_csb_mux ( 687 .clk0_i (clk_csb_buf), 688 .clk1_i (scan_clk_i ), 689 .sel_i (prim_mubi_pkg::mubi4_test_true_strict(scanmode[ClkMuxSel])), 690 .clk_o (clk_csb_muxed) 691 ); 692 693 prim_clock_buf #( 694 .NoFpgaBuf (1'b 1) 695 ) u_clk_csb_buf ( 696 .clk_i (clk_csb_muxed), 697 .clk_o (clk_csb ) 698 ); 699 700 prim_clock_mux2 #( 701 .NoFpgaBufG(1'b1) 702 ) u_csb_rst_scan_mux ( 703 .clk0_i(rst_ni & ~rst_csb_buf), 704 .clk1_i(scan_rst_ni), 705 .sel_i(prim_mubi_pkg::mubi4_test_true_strict(scanmode[CsbRstMuxSel])), 706 .clk_o(rst_spi_n) 707 ); 708 709 logic rst_spi_in_n, rst_spi_out_sync_n, rst_spi_out_n; 710 1/1 assign rst_spi_in_n = rst_spi_n; Tests: T1 T2 T3  711 712 // Synchronizes reset de-assertion to safely occur in the outclk domain. 713 prim_flop #( 714 .Width (1), 715 .ResetValue (1'b0) 716 ) u_rst_spi_out_sync ( 717 .clk_i (clk_spi_in_buf), 718 .rst_ni(rst_spi_n), 719 .d_i (1'b1), 720 .q_o (rst_spi_out_sync_n) 721 ); 722 723 prim_clock_mux2 #( 724 .NoFpgaBufG(1'b1) 725 ) u_csb_rst_out_scan_mux ( 726 .clk0_i(rst_spi_out_sync_n), 727 .clk1_i(scan_rst_ni), 728 .sel_i(prim_mubi_pkg::mubi4_test_true_strict(scanmode[CsbRstMuxSel])), 729 .clk_o(rst_spi_out_n) 730 ); 731 732 logic tpm_rst_in_n, tpm_rst_out_sync_n, tpm_rst_out_n, sys_tpm_rst_n; 733 734 prim_clock_mux2 #( 735 .NoFpgaBufG(1'b1) 736 ) u_tpm_csb_rst_scan_mux ( 737 .clk0_i (rst_ni & ~rst_tpm_csb_buf), 738 .clk1_i (scan_rst_ni), 739 .sel_i (prim_mubi_pkg::mubi4_test_true_strict(scanmode[TpmRstSel])), 740 .clk_o (tpm_rst_in_n) 741 ); 742 743 // Synchronizes reset de-assertion to safely occur in the outclk domain. 744 prim_flop #( 745 .Width (1), 746 .ResetValue (1'b0) 747 ) u_tpm_rst_out_sync ( 748 .clk_i (clk_spi_in_buf), 749 .rst_ni(tpm_rst_in_n), 750 .d_i (1'b1), 751 .q_o (tpm_rst_out_sync_n) 752 ); 753 754 prim_clock_mux2 #( 755 .NoFpgaBufG(1'b1) 756 ) u_tpm_rst_out_scan_mux ( 757 .clk0_i (tpm_rst_out_sync_n), 758 .clk1_i (scan_rst_ni), 759 .sel_i (prim_mubi_pkg::mubi4_test_true_strict(scanmode[TpmRstSel])), 760 .clk_o (tpm_rst_out_n) 761 ); 762 763 // TPM Read FIFO uses TPM CSb as a reset. 764 // The write port is clocked at SYS_CLK. Metastability may occur as CSb may 765 // be asserted, de-asserted independent of SYS_CLK. This reset synchronizer 766 // (sync to SYS_CLK), may delay the reset signal by 2 SYS_CLK when TPM_CSb 767 // is de-asserted. 768 prim_rst_sync #( 769 .ActiveHigh (1'b 0), 770 .SkipScan (1'b 0) 771 ) u_tpm_csb_rst_sync ( 772 .clk_i, 773 .d_i (tpm_rst_in_n), 774 .q_o (sys_tpm_rst_n), 775 776 .scan_rst_ni, 777 .scanmode_i (scanmode[TpmRstSel]) 778 ); 779 780 // CSb edge on the system clock 781 spid_csb_sync u_spid_csb_sync ( 782 .clk_i, 783 .rst_ni, 784 .sck_i (clk_spi_in_buf), 785 .sck_pulse_en_i (1'b1), 786 .csb_i (clk_csb), 787 .csb_deasserted_pulse_o (sys_csb_deasserted_pulse) 788 ); 789 790 prim_flop_2sync #( 791 .Width (1) 792 ) u_sys_csb_syncd ( 793 .clk_i, 794 .rst_ni, 795 .d_i (sys_csb), 796 .q_o (sys_csb_syncd) 797 ); 798 799 // TPM CSb 2FF sync to SYS_CLK 800 prim_flop_2sync #( 801 .Width (1 ), 802 .ResetValue (1'b 1) 803 ) u_sys_tpm_csb_sync ( 804 .clk_i, 805 .rst_ni, 806 807 .d_i (sys_tpm_csb_buf), 808 .q_o (sys_tpm_csb_syncd) 809 ); 810 811 ////////////////////////////// 812 // SPI_DEVICE mode selector // 813 ////////////////////////////// 814 // This logic chooses appropriate signals based on input SPI_DEVICE mode. 815 // Assume spi_mode does not change dynamically 816 817 // io_mode to spi_s2p io_mode should be affected at the negedge of SPI_CLK 818 // based on SPI protocol. the internal io_mode signal is generated by SPI 819 // input signals. So, the io_mode should be latched at clk_spi_out to not 820 // introduce the timing loop. 821 // 822 // example: cmdparse triggers sel_dp at 8th beat of CMD bit. 823 // -> readcmd activates, it also changes IoMode if opcode is DualIO 824 // or QuadIO commands 825 // -> changed io_mode affects spi_s2p module, which again affects 826 // cmdparse module. 827 always_ff @(posedge clk_spi_out_buf or negedge rst_spi_out_n) begin 828 2/2 if (!rst_spi_out_n) io_mode_outclk <= SingleIO; Tests: T1 T2 T3  | T1 T2 T3  829 1/1 else io_mode_outclk <= io_mode; Tests: T11 T12 T14  830 end 831 832 // SCK clock domain MUX for SRAM access for Flash and Passthrough 833 always_comb begin 834 1/1 flash_sram_l2m = '{ default: '0 }; Tests: T1 T2 T3  835 836 1/1 for (int unsigned i = IoModeCmdParse ; i < IoModeEnd ; i++) begin Tests: T1 T2 T3  837 1/1 sub_sram_m2l[i] = '{ Tests: T1 T2 T3  838 rvalid: 1'b 0, 839 rdata: '0, 840 rerror: '{uncorr: 1'b 0, corr: 1'b 0} 841 }; 842 end 843 844 1/1 unique case (cmd_dp_sel) Tests: T1 T2 T3  845 DpReadCmd, DpReadSFDP: begin 846 // SRAM:: Remember this has glitch 847 // switch should happen only when clock gate is disabled. 848 1/1 flash_sram_l2m = sub_sram_l2m[IoModeReadCmd]; Tests: T11 T14 T15  849 1/1 sub_sram_m2l[IoModeReadCmd] = flash_sram_m2l; Tests: T11 T14 T15  850 end 851 852 DpUpload: begin 853 1/1 flash_sram_l2m = sub_sram_l2m[IoModeUpload]; Tests: T61 T58 T46  854 1/1 sub_sram_m2l[IoModeUpload] = flash_sram_m2l; Tests: T61 T58 T46  855 end 856 857 default: begin 858 if (cmd_only_dp_sel == DpUpload) begin 859 // Be ready to upload commands on the 8th command bit, when directed 860 flash_sram_l2m = sub_sram_l2m[IoModeUpload]; 861 sub_sram_m2l[IoModeUpload] = flash_sram_m2l; 862 end else begin 863 // DpNone, DpReadStatus, DpReadJEDEC 864 flash_sram_l2m = '{default: '0 }; 865 end 866 end 867 endcase 868 end 869 870 always_comb begin 871 // SRAM comb logic is in SCK clock domain 872 1/1 mem_b_l2m = '{ default: '0 }; Tests: T1 T2 T3  873 874 1/1 flash_sram_m2l = '{ Tests: T1 T2 T3  875 rvalid: 1'b 0, 876 rdata: '0, 877 rerror: '{uncorr: 1'b 0, corr: 1'b 0} 878 }; 879 1/1 tpm_sram_m2l = '{ Tests: T1 T2 T3  880 rvalid: 1'b 0, 881 rdata: '0, 882 rerror: '{uncorr: 1'b 0, corr: 1'b 0} 883 }; 884 885 1/1 if (!sck_csb && ((spi_mode == FlashMode) || (spi_mode == PassThrough))) begin Tests: T1 T2 T3  886 1/1 mem_b_l2m = flash_sram_l2m; Tests: T1 T7 T11  887 1/1 flash_sram_m2l = mem_b_m2l; Tests: T1 T7 T11  888 1/1 end else if (cfg_tpm_en) begin Tests: T1 T2 T3  889 1/1 mem_b_l2m = tpm_sram_l2m; Tests: T4 T5 T10  890 1/1 tpm_sram_m2l = mem_b_m2l; Tests: T4 T5 T10  891 end MISSING_ELSE 892 end 893 894 // inverted SCK clock domain MUX for IO Mode and P2S 895 always_comb begin 896 1/1 io_mode = SingleIO; Tests: T1 T2 T3  897 1/1 p2s_valid = 1'b 0; Tests: T1 T2 T3  898 1/1 p2s_data = 8'h 0; Tests: T1 T2 T3  899 1/1 sub_p2s_sent = '{default: 1'b 0}; Tests: T1 T2 T3  900 901 1/1 unique case (spi_mode) Tests: T1 T2 T3  902 FlashMode, PassThrough: begin 903 1/1 unique case (cmd_dp_sel) Tests: T1 T2 T3  904 DpNone: begin 905 1/1 io_mode = sub_iomode[IoModeCmdParse]; Tests: T1 T2 T3  906 907 1/1 sub_p2s_sent[IoModeCmdParse] = p2s_sent; Tests: T1 T2 T3  908 909 end 910 DpReadCmd, DpReadSFDP: begin 911 1/1 io_mode = sub_iomode[IoModeReadCmd]; Tests: T11 T14 T15  912 913 1/1 p2s_valid = sub_p2s_valid[IoModeReadCmd]; Tests: T11 T14 T15  914 1/1 p2s_data = sub_p2s_data[IoModeReadCmd]; Tests: T11 T14 T15  915 1/1 sub_p2s_sent[IoModeReadCmd] = p2s_sent; Tests: T11 T14 T15  916 end 917 DpReadStatus: begin 918 1/1 io_mode = sub_iomode[IoModeStatus]; Tests: T14 T55 T61  919 920 1/1 p2s_valid = sub_p2s_valid[IoModeStatus]; Tests: T14 T55 T61  921 1/1 p2s_data = sub_p2s_data[IoModeStatus]; Tests: T14 T55 T61  922 1/1 sub_p2s_sent[IoModeStatus] = p2s_sent; Tests: T14 T55 T61  923 924 end 925 926 DpReadJEDEC: begin 927 1/1 io_mode = sub_iomode[IoModeJedec]; Tests: T46 T53 T54  928 929 1/1 p2s_valid = sub_p2s_valid[IoModeJedec]; Tests: T46 T53 T54  930 1/1 p2s_data = sub_p2s_data[IoModeJedec]; Tests: T46 T53 T54  931 1/1 sub_p2s_sent[IoModeJedec] = p2s_sent; Tests: T46 T53 T54  932 end 933 934 DpUpload: begin 935 1/1 io_mode = sub_iomode[IoModeUpload]; Tests: T61 T58 T46  936 937 1/1 p2s_valid = sub_p2s_valid[IoModeUpload]; Tests: T61 T58 T46  938 1/1 p2s_data = sub_p2s_data[IoModeUpload]; Tests: T61 T58 T46  939 1/1 sub_p2s_sent[IoModeUpload] = p2s_sent; Tests: T61 T58 T46  940 end 941 // DpUnknown: 942 default: begin 943 io_mode = sub_iomode[IoModeCmdParse]; 944 945 sub_p2s_sent[IoModeCmdParse] = p2s_sent; 946 end 947 endcase 948 end 949 950 default: begin 951 io_mode = SingleIO; 952 end 953 endcase 954 end 955 `ASSERT_KNOWN(SpiModeKnown_A, spi_mode) 956 957 // Add 2-cycle delay to flash read data when requested. 958 // This mechanism should only be deployed on read commands with dummy cycles, 959 // so omit delaying the output enable. 960 logic [3:0] internal_sd_stg1_d, internal_sd_stg1_q; 961 logic [3:0] internal_sd_stg2_d, internal_sd_stg2_q; 962 logic [3:0] internal_sd_en_stg1, internal_sd_en_stg2; 963 logic intercept_en_stg1, intercept_en_stg2; 964 1/1 assign internal_sd_stg1_d = internal_sd; Tests: T1 T2 T3  965 1/1 assign internal_sd_stg2_d = internal_sd_stg1_q; Tests: T1 T2 T3  966 967 prim_flop #( 968 .Width ($bits(internal_sd_stg1_d)), 969 .ResetValue ('0) 970 ) u_read_pipe_stg1 ( 971 .clk_i (clk_spi_out_buf), 972 .rst_ni (rst_spi_out_n), 973 .d_i (internal_sd_stg1_d), 974 .q_o (internal_sd_stg1_q) 975 ); 976 977 prim_flop #( 978 .Width ($bits(internal_sd_stg2_d)), 979 .ResetValue ('0) 980 ) u_read_pipe_stg2 ( 981 .clk_i (clk_spi_out_buf), 982 .rst_ni (rst_spi_out_n), 983 .d_i (internal_sd_stg2_d), 984 .q_o (internal_sd_stg2_q) 985 ); 986 987 prim_flop #( 988 .Width ($bits(internal_sd_en)), 989 .ResetValue ('0) 990 ) u_read_en_pipe_stg1 ( 991 .clk_i (clk_spi_out_buf), 992 .rst_ni (rst_spi_out_n), 993 .d_i (internal_sd_en), 994 .q_o (internal_sd_en_stg1) 995 ); 996 997 prim_flop #( 998 .Width ($bits(internal_sd_en_stg1)), 999 .ResetValue ('0) 1000 ) u_read_en_pipe_stg2 ( 1001 .clk_i (clk_spi_out_buf), 1002 .rst_ni (rst_spi_out_n), 1003 .d_i (internal_sd_en_stg1), 1004 .q_o (internal_sd_en_stg2) 1005 ); 1006 1007 prim_flop #( 1008 .Width (1), 1009 .ResetValue ('0) 1010 ) u_read_intercept_pipe_stg1 ( 1011 .clk_i (clk_spi_out_buf), 1012 .rst_ni (rst_spi_out_n), 1013 .d_i (intercept_en), 1014 .q_o (intercept_en_stg1) 1015 ); 1016 1017 prim_flop #( 1018 .Width (1), 1019 .ResetValue ('0) 1020 ) u_read_intercept_pipe_stg2 ( 1021 .clk_i (clk_spi_out_buf), 1022 .rst_ni (rst_spi_out_n), 1023 .d_i (intercept_en_stg1), 1024 .q_o (intercept_en_stg2) 1025 ); 1026 1027 always_comb begin 1028 1/1 if (cmd_read_pipeline_sel) begin Tests: T1 T2 T3  1029 1/1 internal_sd_out = internal_sd_stg2_q; Tests: T11 T14 T15  1030 1/1 internal_sd_en_out = internal_sd_en_stg2; Tests: T11 T14 T15  1031 1/1 intercept_en_out = intercept_en_stg2; Tests: T11 T14 T15  1032 end else begin 1033 1/1 internal_sd_out = internal_sd; Tests: T1 T2 T3  1034 1/1 internal_sd_en_out = internal_sd_en; Tests: T1 T2 T3  1035 1/1 intercept_en_out = intercept_en; Tests: T1 T2 T3  1036 end 1037 end 1038 1039 1040 always_comb begin 1041 1/1 cio_sd_o = internal_sd_out; Tests: T1 T2 T3  1042 1/1 cio_sd_en_o = internal_sd_en_out; Tests: T1 T2 T3  1043 1044 1/1 if (cfg_tpm_en && !sck_tpm_csb_buf) begin : miso_tpm Tests: T1 T2 T3  1045 // TPM transaction is on-going. MOSI, MISO is being used by TPM 1046 1/1 cio_sd_o = {2'b 00, tpm_miso, 1'b 0}; Tests: T4 T5 T13  1047 1/1 cio_sd_en_o = {2'b 00, tpm_miso_en, 1'b 0}; Tests: T4 T5 T13  1048 1049 end else begin : spi_out_flash_passthrough 1050 // SPI Flash, Passthrough modes 1051 1/1 unique case (spi_mode) Tests: T1 T2 T3  1052 FlashMode: begin 1053 1/1 cio_sd_o = internal_sd_out; Tests: T1 T2 T3  1054 1/1 cio_sd_en_o = internal_sd_en_out; Tests: T1 T2 T3  1055 end 1056 1057 PassThrough: begin 1058 1/1 if (intercept_en_out) begin Tests: T11 T12 T14  1059 1/1 cio_sd_o = internal_sd_out; Tests: T14 T15 T55  1060 1/1 cio_sd_en_o = internal_sd_en_out; Tests: T14 T15 T55  1061 end else begin 1062 1/1 cio_sd_o = passthrough_sd; Tests: T11 T12 T14  1063 1/1 cio_sd_en_o = passthrough_sd_en; Tests: T11 T12 T14  1064 end 1065 end 1066 1067 default: begin 1068 cio_sd_o = internal_sd; 1069 cio_sd_en_o = internal_sd_en; 1070 end 1071 endcase 1072 end 1073 end 1074 1075 // Assume `intercept` is registered (SPI_IN). 1076 // passthrough assumed signal shall be registered in (SPI_OUT) 1077 always_ff @(posedge clk_spi_out_buf or negedge rst_spi_out_n) begin 1078 2/2 if (!rst_spi_out_n) intercept_en <= 1'b 0; Tests: T1 T2 T3  | T1 T2 T3  1079 1/1 else intercept_en <= |intercept; Tests: T11 T12 T14  1080 end 1081 // intercept_en shall not be de-asserted except mailbox 1082 `ASSUME(InterceptLevel_M, 1083 $rose(|{intercept.status, intercept.jedec, intercept.sfdp}) |=> 1084 ##1 $stable(intercept_en) until !rst_spi_out_n, 1085 clk_spi_out_buf, !rst_spi_out_n) 1086 1087 //////////////////////////// 1088 // SPI Serial to Parallel // 1089 //////////////////////////// 1090 spi_s2p u_s2p ( 1091 .clk_i (clk_spi_in_buf), 1092 .rst_ni (rst_spi_in_n), 1093 1094 // SPI interface 1095 .s_i (cio_sd_i), 1096 1097 .data_valid_o (s2p_data_valid), 1098 .data_o (s2p_data ), 1099 1100 // Config (changed dynamically) 1101 .order_i (rxorder), 1102 .io_mode_i (io_mode_outclk) 1103 ); 1104 1105 spi_p2s u_p2s ( 1106 .clk_i (clk_spi_out_buf), 1107 .rst_ni (rst_spi_out_n), 1108 1109 .data_valid_i (p2s_valid), 1110 .data_i (p2s_data), 1111 .data_sent_o (p2s_sent), 1112 1113 .csb_i (sck_csb), 1114 .s_en_o (internal_sd_en), 1115 .s_o (internal_sd), 1116 1117 .order_i (txorder), 1118 .io_mode_i (io_mode_outclk) 1119 ); 1120 1121 //////////////////// 1122 // SPI Flash Mode // 1123 //////////////////// 1124 1125 spi_cmdparse u_cmdparse ( 1126 .clk_i (clk_spi_in_buf), 1127 .rst_ni (rst_spi_in_n), 1128 1129 .data_valid_i (s2p_data_valid), 1130 .data_i (s2p_data), 1131 1132 .spi_mode_i (spi_mode), 1133 1134 .cmd_info_i (cmd_info), 1135 1136 .sck_status_busy_i(sck_status_busy), 1137 1138 .io_mode_o (sub_iomode[IoModeCmdParse]), 1139 1140 .sel_dp_o (cmd_dp_sel), 1141 .cmd_only_sel_dp_o (cmd_only_dp_sel), 1142 .cmd_info_o (cmd_info_broadcast), 1143 .cmd_info_idx_o (cmd_info_idx_broadcast), 1144 .cmd_only_info_o (cmd_only_info_broadcast), 1145 .cmd_only_info_idx_o (cmd_only_info_idx_broadcast), 1146 .cmd_sync_pulse_o (cmd_sync_pulse), 1147 1148 .cmd_read_pipeline_sel_o (cmd_read_pipeline_sel), 1149 1150 .cfg_intercept_en_status_i (cfg_intercept_en.status), 1151 .cfg_intercept_en_jedec_i (cfg_intercept_en.jedec), 1152 .cfg_intercept_en_sfdp_i (cfg_intercept_en.sfdp), 1153 1154 .intercept_status_o (intercept.status), 1155 .intercept_jedec_o (intercept.jedec), 1156 .intercept_sfdp_o (intercept.sfdp), 1157 1158 // Not used for now 1159 .cmd_config_req_o (), 1160 .cmd_config_idx_o () 1161 ); 1162 1163 spi_readcmd u_readcmd ( 1164 .clk_i (clk_spi_in_buf), 1165 .rst_ni (rst_spi_in_n), 1166 1167 .clk_out_i (clk_spi_out_buf), 1168 .rst_out_ni (rst_spi_out_n), 1169 1170 .sys_clk_i (clk_i), 1171 .sys_rst_ni (rst_ni), 1172 1173 .sel_dp_i (cmd_dp_sel), 1174 1175 // SRAM interface 1176 .sram_l2m_o (sub_sram_l2m[IoModeReadCmd]), 1177 .sram_m2l_i (sub_sram_m2l[IoModeReadCmd]), 1178 1179 // S2P 1180 .s2p_valid_i (s2p_data_valid), 1181 .s2p_byte_i (s2p_data), 1182 1183 // P2S 1184 .p2s_valid_o (sub_p2s_valid [IoModeReadCmd]), 1185 .p2s_byte_o (sub_p2s_data [IoModeReadCmd]), 1186 .p2s_sent_i (sub_p2s_sent [IoModeReadCmd]), 1187 1188 .spi_mode_i (spi_mode), 1189 1190 .cmd_info_i (cmd_info_broadcast), 1191 .cmd_info_idx_i (cmd_info_idx_broadcast), 1192 1193 .readbuf_threshold_i (readbuf_threshold), 1194 .sys_readbuf_clr_i (readbuf_clr), 1195 1196 .addr_4b_en_i (cfg_addr_4b_en), 1197 1198 .mailbox_en_i (cfg_mailbox_en ), 1199 .cfg_intercept_en_mbx_i (cfg_intercept_en.mbx), 1200 1201 .mailbox_addr_i (mailbox_addr ), 1202 .mailbox_assumed_o (intercept.mbx ), 1203 1204 .readbuf_address_o (readbuf_addr_sck), 1205 1206 .io_mode_o (sub_iomode [IoModeReadCmd]), 1207 1208 .sck_read_watermark_o (flash_sck_readbuf_watermark), 1209 .sck_read_flip_o (flash_sck_readbuf_flip) 1210 ); 1211 1212 // Begin: Read Status ============================================== 1213 logic readstatus_qe; 1214 logic [23:0] readstatus_q; 1215 logic [23:0] readstatus_d; 1216 1217 1/1 assign readstatus_qe = reg2hw.flash_status.busy.qe && Tests: T12 T14 T15  1218 reg2hw.flash_status.wel.qe && 1219 reg2hw.flash_status.status.qe; 1220 1/1 assign readstatus_q = { reg2hw.flash_status.status.q, Tests: T1 T2 T3  1221 reg2hw.flash_status.wel.q, 1222 reg2hw.flash_status.busy.q 1223 }; 1224 1/1 assign hw2reg.flash_status.busy.d = readstatus_d[0]; Tests: T1 T2 T3  1225 1/1 assign hw2reg.flash_status.wel.d = readstatus_d[1]; Tests: T1 T2 T3  1226 1/1 assign hw2reg.flash_status.status.d = readstatus_d[23:2]; Tests: T1 T2 T3  1227 1228 1/1 assign sck_status_wr_set = (cmd_only_dp_sel == DpWrEn); Tests: T1 T2 T3  1229 1/1 assign sck_status_wr_clr = (cmd_only_dp_sel == DpWrDi); Tests: T1 T2 T3  1230 1231 logic flash_status_sync_fifo_clr; 1232 1/1 assign flash_status_sync_fifo_clr = reg2hw.control.flash_status_fifo_clr.q; Tests: T1 T2 T3  1233 assign hw2reg.control.flash_status_fifo_clr.d = '0; 1234 assign hw2reg.control.flash_status_fifo_clr.de = 1'b1; 1235 1236 spid_status u_spid_status ( 1237 .clk_i (clk_spi_in_buf), 1238 .rst_ni (rst_spi_in_n), 1239 1240 .clk_out_i (clk_spi_out_buf), 1241 .rst_out_ni (rst_spi_out_n), 1242 1243 .clk_csb_i (clk_csb), 1244 1245 .sys_clk_i (clk_i), 1246 .sys_rst_ni (rst_ni), 1247 1248 .sys_csb_deasserted_pulse_i (sys_csb_deasserted_pulse), 1249 1250 .sys_update_clr_i(flash_status_sync_fifo_clr), 1251 1252 .sys_status_we_i (readstatus_qe), 1253 .sys_status_i (readstatus_q), 1254 .sys_status_o (readstatus_d), 1255 1256 .sel_dp_i (cmd_dp_sel), 1257 .cmd_info_i (cmd_info_broadcast), 1258 .cmd_info_idx_i (cmd_info_idx_broadcast), 1259 1260 .outclk_p2s_valid_o (sub_p2s_valid[IoModeStatus]), 1261 .outclk_p2s_byte_o (sub_p2s_data[IoModeStatus]), 1262 .outclk_p2s_sent_i (sub_p2s_sent[IoModeStatus]), 1263 1264 .io_mode_o (sub_iomode[IoModeStatus]), 1265 1266 .inclk_busy_set_i (sck_status_busy_set), // SCK domain 1267 1268 .inclk_we_set_i (sck_status_wr_set), 1269 .inclk_we_clr_i (sck_status_wr_clr), 1270 1271 .inclk_status_commit_i (s2p_data_valid), 1272 .cmd_sync_status_busy_o (cmd_sync_status_busy), 1273 .cmd_sync_status_wel_o (cmd_sync_status_wel), 1274 .sck_status_busy_o (sck_status_busy), 1275 .csb_busy_broadcast_o (csb_status_busy_broadcast), // SCK domain 1276 .scan_rst_ni, 1277 .scanmode_i (scanmode[StatusFifoRstSel]) 1278 ); 1279 1280 // Tie unused 1281 logic unused_sub_sram_status; 1282 0/1 ==> assign unused_sub_sram_status = ^{ 1283 sub_sram_l2m[IoModeStatus], 1284 sub_sram_m2l[IoModeStatus] 1285 }; 1286 assign sub_sram_l2m[IoModeStatus] = '0; 1287 1288 // End: Read Status ------------------------------------------------ 1289 1290 spid_jedec u_jedec ( 1291 .clk_i (clk_spi_in_buf), 1292 .rst_ni (rst_spi_in_n), 1293 1294 .clk_out_i (clk_spi_out_buf), 1295 .rst_out_ni (rst_spi_out_n), 1296 1297 .cmd_sync_pulse_i (cmd_sync_pulse), 1298 1299 .sys_jedec_i (jedec_cfg), 1300 1301 .io_mode_o (sub_iomode[IoModeJedec]), 1302 1303 .sel_dp_i (cmd_dp_sel), 1304 .cmd_info_i (cmd_info_broadcast), 1305 .cmd_info_idx_i (cmd_info_idx_broadcast), 1306 1307 .outclk_p2s_valid_o (sub_p2s_valid[IoModeJedec]), 1308 .outclk_p2s_byte_o (sub_p2s_data[IoModeJedec]), 1309 .outclk_p2s_sent_i (sub_p2s_sent[IoModeJedec]) 1310 ); 1311 // Tie unused 1312 logic unused_sub_sram_jedec; 1313 0/1 ==> assign unused_sub_sram_jedec = ^{ 1314 sub_sram_l2m[IoModeJedec], 1315 sub_sram_m2l[IoModeJedec] 1316 }; 1317 assign sub_sram_l2m[IoModeJedec] = '0; 1318 1319 // Begin: Upload =================================================== 1320 spid_upload #( 1321 .CmdFifoBaseAddr (SramCmdFifoIdx), 1322 .CmdFifoDepth (SramCmdFifoDepth), 1323 .AddrFifoBaseAddr (SramAddrFifoIdx), 1324 .AddrFifoDepth (SramAddrFifoDepth), 1325 .PayloadBaseAddr (SramPayloadIdx), 1326 .PayloadDepth (SramPayloadDepth), 1327 1328 .SpiByte ($bits(spi_byte_t)) 1329 ) u_upload ( 1330 .clk_i (clk_spi_in_buf), 1331 .rst_ni (rst_spi_in_n), 1332 1333 .sys_clk_i (clk_i), 1334 .sys_rst_ni (rst_ni), 1335 1336 .clk_csb_i (clk_csb), 1337 1338 .sel_dp_i (cmd_dp_sel), 1339 .cmd_only_sel_dp_i (cmd_only_dp_sel), 1340 1341 .sck_sram_o (sub_sram_l2m[IoModeUpload]), 1342 .sck_sram_i (sub_sram_m2l[IoModeUpload]), 1343 1344 .sys_cmdfifo_sram_o (sys_sram_l2m[SysSramCmdFifo]), 1345 .sys_cmdfifo_sram_i (sys_sram_m2l[SysSramCmdFifo]), 1346 .sys_cmdfifo_gnt_i (sys_sram_gnt[SysSramCmdFifo]), 1347 1348 .sys_addrfifo_sram_o (sys_sram_l2m[SysSramAddrFifo]), 1349 .sys_addrfifo_sram_i (sys_sram_m2l[SysSramAddrFifo]), 1350 .sys_addrfifo_gnt_i (sys_sram_gnt[SysSramAddrFifo]), 1351 1352 // SYS clock FIFO interface 1353 .sys_cmdfifo_rvalid_o (cmdfifo_rvalid), 1354 .sys_cmdfifo_rready_i (cmdfifo_rready), 1355 .sys_cmdfifo_rdata_o (cmdfifo_rdata), 1356 1357 .sys_addrfifo_rvalid_o (addrfifo_rvalid), 1358 .sys_addrfifo_rready_i (addrfifo_rready), 1359 .sys_addrfifo_rdata_o (addrfifo_rdata), 1360 1361 // Interface: SPI to Parallel 1362 .s2p_valid_i (s2p_data_valid), 1363 .s2p_byte_i (s2p_data), 1364 1365 // Interface: Parallel to SPI 1366 .p2s_valid_o (sub_p2s_valid[IoModeUpload]), 1367 .p2s_data_o (sub_p2s_data [IoModeUpload]), 1368 .p2s_sent_i (sub_p2s_sent [IoModeUpload]), 1369 1370 .spi_mode_i (spi_mode), 1371 1372 .cmd_sync_cfg_addr_4b_en_i (cmd_sync_addr_4b_en), 1373 .cmd_sync_status_wel_i (cmd_sync_status_wel), 1374 .cmd_sync_status_busy_i (cmd_sync_status_busy), 1375 1376 .cmd_only_info_i (cmd_only_info_broadcast), 1377 .cmd_only_info_idx_i (cmd_only_info_idx_broadcast), 1378 1379 .io_mode_o (sub_iomode[IoModeUpload]), 1380 1381 .set_busy_o (sck_status_busy_set), 1382 1383 .sys_cmdfifo_set_o (cmdfifo_set_pulse), 1384 .sys_cmdfifo_notempty_o (cmdfifo_notempty), 1385 .sys_cmdfifo_full_o (), // not used 1386 .sys_addrfifo_notempty_o (addrfifo_notempty), 1387 .sys_addrfifo_full_o (), // not used 1388 .sys_payload_overflow_o (payload_overflow), 1389 1390 .sys_cmdfifo_depth_o (cmdfifo_depth), 1391 .sys_addrfifo_depth_o (addrfifo_depth), 1392 .sys_payload_depth_o (payload_depth), 1393 .sys_payload_start_idx_o (payload_start_idx) 1394 ); 1395 // FIFO connect 1396 1/1 assign cmdfifo_rready = reg2hw.upload_cmdfifo.data.re; Tests: T61 T58 T46  1397 1/1 assign hw2reg.upload_cmdfifo.data.d = cmdfifo_rdata[7:0]; Tests: T1 T2 T3  1398 1/1 assign hw2reg.upload_cmdfifo.busy.d = cmdfifo_rdata[13]; Tests: T1 T2 T3  1399 1/1 assign hw2reg.upload_cmdfifo.wel.d = cmdfifo_rdata[14]; Tests: T1 T2 T3  1400 1/1 assign hw2reg.upload_cmdfifo.addr4b_mode.d = cmdfifo_rdata[15]; Tests: T1 T2 T3  1401 logic unused_cmdfifo_re; 1402 1/1 assign unused_cmdfifo_re = ^{reg2hw.upload_cmdfifo.busy.re, Tests: T61 T58 T46  1403 reg2hw.upload_cmdfifo.wel.re, 1404 reg2hw.upload_cmdfifo.addr4b_mode.re}; 1405 logic unused_cmdfifo_q; 1406 1/1 assign unused_cmdfifo_q = ^{reg2hw.upload_cmdfifo.data.q, Tests: T1 T2 T3  1407 reg2hw.upload_cmdfifo.busy.q, 1408 reg2hw.upload_cmdfifo.wel.q, 1409 reg2hw.upload_cmdfifo.addr4b_mode.q, 1410 cmdfifo_rdata[12:8], 1411 cmdfifo_rvalid}; 1412 1413 1/1 assign addrfifo_rready = reg2hw.upload_addrfifo.re; Tests: T61 T58 T46  1414 1/1 assign hw2reg.upload_addrfifo.d = addrfifo_rdata; Tests: T1 T2 T3  1415 logic unused_addrfifo_q; 1416 1/1 assign unused_addrfifo_q = ^{reg2hw.upload_addrfifo.q, addrfifo_rvalid}; Tests: T1 T2 T3  1417 1418 // Connect UPLOAD_STATUS 1419 assign hw2reg.upload_status.cmdfifo_depth.de = 1'b1; 1420 1/1 assign hw2reg.upload_status.cmdfifo_depth.d = cmdfifo_depth; Tests: T1 T2 T3  1421 1422 assign hw2reg.upload_status.cmdfifo_notempty.de = 1'b1; 1423 1/1 assign hw2reg.upload_status.cmdfifo_notempty.d = cmdfifo_notempty; Tests: T1 T2 T3  1424 1425 assign hw2reg.upload_status.addrfifo_depth.de = 1'b 1; 1426 1/1 assign hw2reg.upload_status.addrfifo_depth.d = addrfifo_depth; Tests: T1 T2 T3  1427 1428 assign hw2reg.upload_status.addrfifo_notempty.de = 1'b 1; 1429 1/1 assign hw2reg.upload_status.addrfifo_notempty.d = addrfifo_notempty; Tests: T1 T2 T3  1430 1431 assign hw2reg.upload_status2.payload_depth.de = 1'b 1; 1432 1/1 assign hw2reg.upload_status2.payload_depth.d = payload_depth; Tests: T1 T2 T3  1433 1434 assign hw2reg.upload_status2.payload_start_idx.de = 1'b 1; 1435 1/1 assign hw2reg.upload_status2.payload_start_idx.d = payload_start_idx; Tests: T1 T2 T3  1436 `ASSERT_INIT(PayloadStartIdxWidthMatch_A, 1437 $bits(hw2reg.upload_status2.payload_start_idx.d) == PayloadIdxW) 1438 1439 // End: Upload --------------------------------------------------- 1440 1441 // Begin: Address 3B/4B Tracker ==================================== 1442 1/1 assign cmd_en4b_pulse = cmd_only_dp_sel == DpEn4B; Tests: T1 T2 T3  1443 1/1 assign cmd_ex4b_pulse = cmd_only_dp_sel == DpEx4B; Tests: T1 T2 T3  1444 spid_addr_4b u_spid_addr_4b ( 1445 .sys_clk_i (clk_i ), 1446 .sys_rst_ni (rst_ni), 1447 1448 .spi_clk_i (clk_spi_in_buf), 1449 1450 .cmd_sync_pulse_i (cmd_sync_pulse), 1451 1452 .reg2hw_addr_mode_addr_4b_en_q_i (reg2hw.addr_mode.addr_4b_en.q), 1453 .reg2hw_addr_mode_addr_4b_en_qe_i (reg2hw.addr_mode.addr_4b_en.qe), 1454 .hw2reg_addr_mode_pending_d_o (hw2reg.addr_mode.pending.d), 1455 .hw2reg_addr_mode_addr_4b_en_d_o (hw2reg.addr_mode.addr_4b_en.d), 1456 1457 .spi_cfg_addr_4b_en_o (cfg_addr_4b_en), // broadcast 1458 .cmd_sync_cfg_addr_4b_en_o (cmd_sync_addr_4b_en), // early output for upload 1459 1460 .spi_addr_4b_set_i (cmd_en4b_pulse), // EN4B command 1461 .spi_addr_4b_clr_i (cmd_ex4b_pulse) // EX4B command 1462 ); 1463 // End: Address 3B/4B Tracker ------------------------------------ 1464 1465 ///////////////////// 1466 // SPI Passthrough // 1467 ///////////////////// 1468 1469 // Passthrough block 1470 // signal: sys_csb_syncd -> sysclock 2FF CSb 1471 // signal: sys_busy -> output of u_status readstatus_d[0] 1472 // set by CSb deassertion pulse & BUSY(SCK) 1473 // clr by CSb = 1 & SW writing 0 1474 // 1475 // NOTE: there will be a gap between the actual assertion of CSb and the CSb 1476 // syncd event visible in the u_status BUSY logic (2FF @ SYS_CLK). So, 1477 // there's chance that the SW may clear the BUSY right at the CSb 1478 // assertion event. If that happens, passthrough block may set during SPI 1479 // transaction. The behavior of the SPI_DEVICE in this scenario is 1480 // undeterminstic. 1481 logic passthrough_block; 1482 1/1 assign passthrough_block = csb_status_busy_broadcast; Tests: T1 T2 T3  1483 1484 spi_passthrough u_passthrough ( 1485 .clk_i (clk_spi_in_buf), 1486 .rst_ni (rst_spi_in_n), 1487 .clk_out_i (clk_spi_out_buf), 1488 .rst_out_ni(rst_spi_out_n), 1489 1490 .cfg_cmd_filter_i (cmd_filter), 1491 1492 .cfg_addr_mask_i (addr_swap_mask), 1493 .cfg_addr_value_i (addr_swap_data), 1494 1495 .cfg_payload_mask_i (payload_swap_mask), 1496 .cfg_payload_data_i (payload_swap_data), 1497 1498 .cfg_addr_4b_en_i (cfg_addr_4b_en), 1499 1500 .cmd_info_i (cmd_info), 1501 1502 .spi_mode_i (spi_mode), 1503 1504 // Control: BUSY block 1505 .passthrough_block_i (passthrough_block), 1506 1507 // Host SPI 1508 .host_sck_i (cio_sck_i), 1509 .host_csb_i (cio_csb_i), 1510 .host_s_i (cio_sd_i), 1511 .host_s_o (passthrough_sd), 1512 .host_s_en_o (passthrough_sd_en), 1513 1514 // Passthrough to SPI_HOST HWIP 1515 .passthrough_o, 1516 .passthrough_i, 1517 1518 .event_cmd_filtered_o () 1519 ); 1520 1521 ////////////////// 1522 // TPM over SPI // 1523 ////////////////// 1524 // Instance of spi_tpm 1525 spi_tpm #( 1526 // CmdAddrFifoDepth 1527 .EnLocality (1) 1528 ) u_spi_tpm ( 1529 .clk_in_i (clk_spi_in_buf ), 1530 .clk_out_i (clk_spi_out_buf), 1531 .rst_ni (tpm_rst_in_n ), 1532 .rst_out_ni(tpm_rst_out_n), 1533 1534 .sys_clk_i (clk_i), 1535 .sys_rst_ni(rst_ni ), 1536 1537 .sys_tpm_rst_ni(sys_tpm_rst_n), 1538 1539 .csb_i (sck_tpm_csb_buf), // used as data only 1540 .mosi_i (tpm_mosi ), 1541 .miso_o (tpm_miso ), 1542 .miso_en_o (tpm_miso_en ), 1543 1544 .tpm_cap_o (tpm_cap), 1545 .cfg_tpm_en_i (cfg_tpm_en ), 1546 .cfg_tpm_mode_i (cfg_tpm_mode ), 1547 .cfg_tpm_hw_reg_dis_i (cfg_tpm_hw_reg_dis ), 1548 .cfg_tpm_reg_chk_dis_i (cfg_tpm_reg_chk_dis ), 1549 .cfg_tpm_invalid_locality_i (cfg_tpm_invalid_locality), 1550 1551 .sys_access_reg_i (tpm_access ), 1552 .sys_int_enable_reg_i (tpm_int_enable ), 1553 .sys_int_vector_reg_i (tpm_int_vector ), 1554 .sys_int_status_reg_i (tpm_int_status ), 1555 .sys_intf_capability_reg_i (tpm_intf_capability), 1556 .sys_status_reg_i (tpm_status ), 1557 .sys_id_reg_i (tpm_did_vid ), 1558 .sys_rid_reg_i (tpm_rid ), 1559 1560 .sck_sram_o (tpm_sram_l2m), 1561 .sck_sram_i (tpm_sram_m2l), 1562 .sys_sram_o (sys_sram_l2m[SysSramTpmRdFifo]), 1563 .sys_sram_i (sys_sram_m2l[SysSramTpmRdFifo]), 1564 .sys_sram_gnt_i (sys_sram_gnt[SysSramTpmRdFifo]), 1565 1566 .sys_cmdaddr_rvalid_o (tpm_cmdaddr_rvalid), 1567 .sys_cmdaddr_rdata_o (tpm_cmdaddr_rdata ), 1568 .sys_cmdaddr_rready_i (tpm_cmdaddr_rready), 1569 1570 .sys_rdfifo_wvalid_i (tpm_rdfifo_wvalid ), 1571 .sys_rdfifo_wdata_i (tpm_rdfifo_wdata ), 1572 .sys_rdfifo_wready_o (tpm_rdfifo_wready ), 1573 .sys_rdfifo_cmd_end_o (tpm_event_rdfifo_cmd_end), 1574 .sys_tpm_rdfifo_drop_o(tpm_event_rdfifo_drop ), 1575 1576 .sys_wrfifo_release_i(tpm_status_wrfifo_release), 1577 1578 .sys_cmdaddr_notempty_o (tpm_status_cmdaddr_notempty), 1579 .sys_wrfifo_pending_o (tpm_status_wrfifo_pending), 1580 .sys_rdfifo_aborted_o (tpm_status_rdfifo_aborted) 1581 ); 1582 1583 // Register connection 1584 // TPM_CAP: 1585 0/1 ==> assign hw2reg.tpm_cap = '{ 1586 rev: '{ de: 1'b 1, d: tpm_cap.rev }, 1587 locality: '{ de: 1'b 1, d: tpm_cap.locality }, 1588 max_wr_size: '{ de: 1'b 1, d: tpm_cap.max_wr_size }, 1589 max_rd_size: '{ de: 1'b 1, d: tpm_cap.max_rd_size } 1590 }; 1591 1592 // CFG: 1593 1/1 assign cfg_tpm_en = reg2hw.tpm_cfg.en.q; Tests: T1 T2 T3  1594 1/1 assign cfg_tpm_mode = reg2hw.tpm_cfg.tpm_mode.q; Tests: T1 T2 T3  1595 1/1 assign cfg_tpm_hw_reg_dis = reg2hw.tpm_cfg.hw_reg_dis.q; Tests: T1 T2 T3  1596 1/1 assign cfg_tpm_reg_chk_dis = reg2hw.tpm_cfg.tpm_reg_chk_dis.q; Tests: T1 T2 T3  1597 1/1 assign cfg_tpm_invalid_locality = reg2hw.tpm_cfg.invalid_locality.q; Tests: T1 T2 T3  1598 1599 // STATUS: 1600 1/1 assign hw2reg.tpm_status = '{ Tests: T1 T2 T3  1601 rdfifo_aborted: '{ d: tpm_status_rdfifo_aborted }, 1602 wrfifo_pending: '{ d: tpm_status_wrfifo_pending }, 1603 cmdaddr_notempty: '{ d: tpm_status_cmdaddr_notempty } 1604 }; 1605 1606 // wrfifo_release is RW0C 1607 1/1 assign tpm_status_wrfifo_release = reg2hw.tpm_status.wrfifo_pending.qe & Tests: T1 T2 T3  1608 ~reg2hw.tpm_status.wrfifo_pending.q; 1609 1610 // Return-by-HW registers: 1611 // TPM_ACCESS_x, TPM_STS_x, TPM_INT_ENABLE, TPM_INT_VECTOR, 1612 // TPM_INT_STATUS, TPM_INTF_CAPABILITY, TPM_DID_VID, TPM_RID 1613 for (genvar i = 0 ; i < spi_device_reg_pkg::NumLocality ; i++) begin : g_tpm_access 1614 5/5 assign tpm_access[8*i+:8] = reg2hw.tpm_access[i].q; Tests: T1 T2 T3  | T1 T2 T3  | T1 T2 T3  | T1 T2 T3  | T1 T2 T3  1615 end : g_tpm_access 1616 1617 1/1 assign tpm_int_enable = reg2hw.tpm_int_enable.q; Tests: T1 T2 T3  1618 1/1 assign tpm_int_vector = reg2hw.tpm_int_vector.q; Tests: T1 T2 T3  1619 1/1 assign tpm_int_status = reg2hw.tpm_int_status.q; Tests: T1 T2 T3  1620 1/1 assign tpm_intf_capability = reg2hw.tpm_intf_capability.q; Tests: T1 T2 T3  1621 1/1 assign tpm_status = reg2hw.tpm_sts.q; Tests: T1 T2 T3  1622 1/1 assign tpm_did_vid = { reg2hw.tpm_did_vid.did.q , Tests: T1 T2 T3  1623 reg2hw.tpm_did_vid.vid.q }; 1624 1/1 assign tpm_rid = reg2hw.tpm_rid.q; Tests: T1 T2 T3  1625 1626 // Command / Address Buffer 1627 logic unused_tpm_cmdaddr; 1628 1/1 assign unused_tpm_cmdaddr = ^{tpm_cmdaddr_rvalid, reg2hw.tpm_cmd_addr}; Tests: T1 T2 T3  1629 1630 1/1 assign tpm_cmdaddr_rready = reg2hw.tpm_cmd_addr.cmd.re; Tests: T5 T13 T31  1631 1/1 assign hw2reg.tpm_cmd_addr = '{ Tests: T1 T2 T3  1632 addr: tpm_cmdaddr_rdata[23: 0], 1633 cmd: tpm_cmdaddr_rdata[31:24] 1634 }; 1635 1636 // Read FIFO (write by SW) 1637 logic unused_tpm_rdfifo; 1638 1/1 assign unused_tpm_rdfifo= tpm_rdfifo_wready; Tests: T1 T2 T3  1639 1640 1/1 assign tpm_rdfifo_wvalid = reg2hw.tpm_read_fifo.qe; Tests: T5 T13 T30  1641 1/1 assign tpm_rdfifo_wdata = reg2hw.tpm_read_fifo.q; Tests: T1 T2 T3  1642 1643 // END: TPM over SPI -------------------------------------------------------- 1644 1645 //////////////////// 1646 // Common modules // 1647 //////////////////// 1648 1649 logic [SramDw-1:0] sys_sram_l2m_fw_wmask[2]; 1650 1/1 assign tl_sram_egress_h2d = tl_sram_h2d[SPI_DEVICE_EGRESS_BUFFER_IDX]; Tests: T1 T2 T3  1651 1/1 assign tl_sram_d2h[SPI_DEVICE_EGRESS_BUFFER_IDX] = tl_sram_egress_d2h; Tests: T1 T2 T3  1652 1/1 assign tl_sram_ingress_h2d = tl_sram_h2d[SPI_DEVICE_INGRESS_BUFFER_IDX]; Tests: T1 T2 T3  1653 1/1 assign tl_sram_d2h[SPI_DEVICE_INGRESS_BUFFER_IDX] = tl_sram_ingress_d2h; Tests: T1 T2 T3  1654 1655 tlul_adapter_sram #( 1656 .SramAw (SramAw), 1657 .SramDw (SramDw), 1658 .Outstanding (1), 1659 .ErrOnRead (1), // write-only memory window 1660 .ByteAccess (0) 1661 ) u_tlul2sram_egress ( 1662 .clk_i, 1663 .rst_ni, 1664 1665 .tl_i (tl_sram_egress_h2d), 1666 .tl_o (tl_sram_egress_d2h), 1667 .en_ifetch_i (prim_mubi_pkg::MuBi4False), 1668 .req_o (sys_sram_l2m[SysSramFwEgress].req), 1669 .req_type_o (), 1670 .gnt_i (sys_sram_fw_gnt[SPI_DEVICE_EGRESS_BUFFER_IDX]), 1671 .we_o (sys_sram_l2m[SysSramFwEgress].we), 1672 .addr_o (sys_sram_l2m[SysSramFwEgress].addr), 1673 .wdata_o (sys_sram_l2m[SysSramFwEgress].wdata), 1674 .wmask_o (sys_sram_l2m_fw_wmask[SPI_DEVICE_EGRESS_BUFFER_IDX]), // Not used 1675 .intg_error_o (), 1676 .rdata_i (sys_sram_m2l[SysSramFwEgress].rdata), 1677 .rvalid_i (sys_sram_m2l[SysSramFwEgress].rvalid), 1678 .rerror_i (sys_sram_m2l[SysSramFwEgress].rerror), 1679 .compound_txn_in_progress_o (), 1680 .readback_en_i (prim_mubi_pkg::MuBi4False), 1681 .readback_error_o (), 1682 .wr_collision_i (1'b0), 1683 .write_pending_i (1'b0) 1684 ); 1685 1686 tlul_adapter_sram #( 1687 .SramAw (SramAw), 1688 .SramDw (SramDw), 1689 .Outstanding (1), 1690 .ErrOnWrite (1), // read-only memory window 1691 .ByteAccess (0) 1692 ) u_tlul2sram_ingress ( 1693 .clk_i, 1694 .rst_ni, 1695 1696 .tl_i (tl_sram_ingress_h2d), 1697 .tl_o (tl_sram_ingress_d2h), 1698 .en_ifetch_i (prim_mubi_pkg::MuBi4False), 1699 .req_o (sys_sram_l2m[SysSramFwIngress].req), 1700 .req_type_o (), 1701 .gnt_i (sys_sram_fw_gnt[SPI_DEVICE_INGRESS_BUFFER_IDX]), 1702 .we_o (sys_sram_l2m[SysSramFwIngress].we), 1703 .addr_o (sys_sram_l2m[SysSramFwIngress].addr), 1704 .wdata_o (sys_sram_l2m[SysSramFwIngress].wdata), 1705 .wmask_o (sys_sram_l2m_fw_wmask[SPI_DEVICE_INGRESS_BUFFER_IDX]), // Not used 1706 .intg_error_o (), 1707 .rdata_i (sys_sram_m2l[SysSramFwIngress].rdata), 1708 .rvalid_i (sys_sram_m2l[SysSramFwIngress].rvalid), 1709 .rerror_i (sys_sram_m2l[SysSramFwIngress].rerror), 1710 .compound_txn_in_progress_o (), 1711 .readback_en_i (prim_mubi_pkg::MuBi4False), 1712 .readback_error_o (), 1713 .wr_collision_i (1'b0), 1714 .write_pending_i (1'b0) 1715 ); 1716 1/1 assign sys_sram_l2m[SysSramFwEgress].wstrb = Tests: T1 T2 T3  1717 sram_mask2strb(sys_sram_l2m_fw_wmask[SPI_DEVICE_EGRESS_BUFFER_IDX]); 1718 1/1 assign sys_sram_l2m[SysSramFwIngress].wstrb = Tests: T1 T2 T3  1719 sram_mask2strb(sys_sram_l2m_fw_wmask[SPI_DEVICE_INGRESS_BUFFER_IDX]); 1720 1721 logic sys_sram_hw_req; 1722 always_comb begin 1723 1/1 sys_sram_hw_req = 1'b0; Tests: T1 T2 T3  1724 1/1 for (int unsigned i = 0; i < SysSramEnd; i++) begin Tests: T1 T2 T3  1725 1/1 if ((i != SysSramFwEgress) && (i != SysSramFwIngress)) begin Tests: T1 T2 T3  1726 1/1 sys_sram_hw_req |= sys_sram_l2m[i].req; Tests: T1 T2 T3  1727 end MISSING_ELSE 1728 end 1729 end 1730 1731 always_comb begin 1732 1/1 for (int unsigned i = 0; i < SysSramEnd; i++) begin Tests: T1 T2 T3  1733 1/1 sys_sram_req[i] = sys_sram_l2m[i].req; Tests: T1 T2 T3  1734 end 1735 1/1 if (sys_sram_hw_req) begin Tests: T1 T2 T3  1736 // Fixed low priority. (Discussed in #10065) 1737 // When HW requests the SRAM access, lower the SW requests (and grant) 1738 1/1 sys_sram_req[SysSramFwEgress] = 1'b0; Tests: T5 T13 T30  1739 1/1 sys_sram_fw_gnt[SPI_DEVICE_EGRESS_BUFFER_IDX] = 1'b0; Tests: T5 T13 T30  1740 1/1 sys_sram_req[SysSramFwIngress] = 1'b0; Tests: T5 T13 T30  1741 1/1 sys_sram_fw_gnt[SPI_DEVICE_INGRESS_BUFFER_IDX] = 1'b0; Tests: T5 T13 T30  1742 end else begin 1743 1/1 sys_sram_fw_gnt[SPI_DEVICE_EGRESS_BUFFER_IDX] = sys_sram_gnt[SysSramFwEgress]; Tests: T1 T2 T3  1744 1/1 sys_sram_fw_gnt[SPI_DEVICE_INGRESS_BUFFER_IDX] = sys_sram_gnt[SysSramFwIngress]; Tests: T1 T2 T3  1745 end 1746 end 1747 1748 for (genvar i = 0 ; i < SysSramEnd ; i++) begin : g_sram_connect 1749 5/5 assign sys_sram_addr [i] = sys_sram_l2m[i].addr; Tests: T1 T2 T3  | T1 T2 T3  | T1 T2 T3  | T1 T2 T3  | T1 T2 T3  1750 2/5 ==> assign sys_sram_write [i] = sys_sram_l2m[i].we; Tests: T1 T2 T3  | T1 T2 T3  1751 3/5 ==> assign sys_sram_wdata [i] = sys_sram_l2m[i].wdata; Tests: T1 T2 T3  | T1 T2 T4  | T1 T2 T3  1752 2/5 ==> assign sys_sram_wmask [i] = sram_strb2mask(sys_sram_l2m[i].wstrb); Tests: T1 T2 T3  | T1 T2 T3  1753 1754 5/5 assign sys_sram_m2l[i].rvalid = sys_sram_rvalid[i]; Tests: T1 T2 T3  | T1 T2 T3  | T1 T2 T3  | T1 T2 T3  | T1 T2 T3  1755 5/5 assign sys_sram_m2l[i].rdata = sys_sram_rdata[i]; Tests: T3 T5 T8  | T3 T5 T8  | T3 T5 T8  | T3 T5 T8  | T3 T5 T8  1756 5/5 assign sys_sram_m2l[i].rerror = sys_sram_rerror[i]; Tests: T1 T2 T3  | T1 T2 T3  | T1 T2 T3  | T1 T2 T3  | T1 T2 T3  1757 1758 // There is only ever a single source of requests on the SYS port (SW), so 1759 // requests should always be granted. 1760 `ASSERT(ReqAlwaysAccepted_A, sys_sram_req[i] |-> sys_sram_gnt[i]) 1761 end : g_sram_connect 1762 1763 prim_sram_arbiter #( 1764 .N (SysSramEnd), 1765 .SramDw (SramDw), 1766 .SramAw (SramAw), 1767 1768 .EnMask (1'b 1) 1769 ) u_sys_sram_arbiter ( 1770 .clk_i, 1771 .rst_ni, 1772 1773 .req_i (sys_sram_req), 1774 .req_addr_i (sys_sram_addr), 1775 .req_write_i (sys_sram_write), 1776 .req_wdata_i (sys_sram_wdata), 1777 .req_wmask_i (sys_sram_wmask), 1778 .gnt_o (sys_sram_gnt), 1779 1780 .rsp_rvalid_o (sys_sram_rvalid), 1781 .rsp_rdata_o (sys_sram_rdata), 1782 .rsp_error_o (sys_sram_rerror), 1783 1784 .sram_req_o (mem_a_req), 1785 .sram_addr_o (mem_a_addr), 1786 .sram_write_o (mem_a_write), 1787 .sram_wdata_o (mem_a_wdata), 1788 .sram_wmask_o (mem_a_wmask), 1789 .sram_rvalid_i (mem_a_rvalid), 1790 .sram_rdata_i (mem_a_rdata), 1791 .sram_rerror_i (mem_a_rerror) 1792 ); 1793 1794 // SRAM Wrapper 1795 // The SRAM should only be reset if both modes are inactive. 1796 logic spi_dpram_rst_n; 1797 1/1 assign spi_dpram_rst_n = tpm_rst_in_n | rst_spi_in_n; Tests: T1 T2 T3  1798 1799 1/1 assign mem_b_req = mem_b_l2m.req; Tests: T1 T2 T3  1800 1/1 assign mem_b_write = mem_b_l2m.we; Tests: T1 T2 T3  1801 1/1 assign mem_b_addr = mem_b_l2m.addr; Tests: T1 T2 T3  1802 1/1 assign mem_b_wdata = mem_b_l2m.wdata; Tests: T1 T2 T3  1803 1/1 assign mem_b_wmask = sram_strb2mask(mem_b_l2m.wstrb); Tests: T1 T2 T3  1804 1805 1/1 assign mem_b_m2l.rvalid = mem_b_rvalid; Tests: T1 T2 T3  1806 1/1 assign mem_b_m2l.rdata = mem_b_rdata; Tests: T5 T11 T13  1807 1/1 assign mem_b_m2l.rerror = mem_b_rerror; Tests: T1 T2 T3  1808 1809 spid_dpram #( 1810 .SramType (SramType), 1811 .EnableECC (0), 1812 .EnableParity (1), 1813 .EnableInputPipeline (0), 1814 .EnableOutputPipeline(0) 1815 ) u_spid_dpram ( 1816 .clk_sys_i (clk_i), 1817 .rst_sys_ni (rst_ni), 1818 1819 .clk_spi_i (clk_spi_in_buf), 1820 .rst_spi_ni (spi_dpram_rst_n), 1821 1822 .sys_req_i (mem_a_req), 1823 .sys_write_i (mem_a_write), 1824 .sys_addr_i (mem_a_addr), 1825 .sys_wdata_i (mem_a_wdata), 1826 .sys_wmask_i (mem_a_wmask), 1827 .sys_rvalid_o (mem_a_rvalid), 1828 .sys_rdata_o (mem_a_rdata), 1829 .sys_rerror_o (mem_a_rerror), 1830 1831 .spi_req_i (mem_b_req), 1832 .spi_write_i (mem_b_write), 1833 .spi_addr_i (mem_b_addr), 1834 .spi_wdata_i (mem_b_wdata), 1835 .spi_wmask_i (mem_b_wmask), 1836 .spi_rvalid_o (mem_b_rvalid), 1837 .spi_rdata_o (mem_b_rdata), 1838 .spi_rerror_o (mem_b_rerror), 1839 1840 .cfg_i (ram_cfg_i) 1841 ); 1842 1843 // Register module 1844 logic [NumAlerts-1:0] alert_test, alerts; 1845 spi_device_reg_top u_reg ( 1846 .clk_i, 1847 .rst_ni, 1848 1849 .tl_i (tl_i), 1850 .tl_o (tl_o), 1851 1852 .tl_win_o (tl_sram_h2d), 1853 .tl_win_i (tl_sram_d2h), 1854 1855 .reg2hw, 1856 .hw2reg, 1857 1858 // SEC_CM: BUS.INTEGRITY 1859 .intg_err_o (alerts[0]) 1860 ); 1861 1862 // Alerts 1863 1/1 assign alert_test = { Tests: T1 T2 T3 

Cond Coverage for Module : spi_device
TotalCoveredPercent
Conditions514384.31
Logical514384.31
Non-Logical00
Event00

 LINE       173
 EXPRESSION (payload_depth != '0)
            ----------1----------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT58,T46,T53

 LINE       702
 EXPRESSION (rst_ni & ((~rst_csb_buf)))
             ---1--   --------2-------
-1--2-StatusTests
01Not Covered
10CoveredT1,T2,T3
11CoveredT1,T7,T11

 LINE       736
 EXPRESSION (rst_ni & ((~rst_tpm_csb_buf)))
             ---1--   ----------2---------
-1--2-StatusTests
01Not Covered
10CoveredT1,T2,T3
11CoveredT1,T4,T5

 LINE       858
 EXPRESSION (cmd_only_dp_sel == DpUpload)
            --------------1--------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT61,T58,T46

 LINE       885
 EXPRESSION (((!sck_csb)) && ((spi_mode == FlashMode) || (spi_mode == PassThrough)))
             ------1-----    ---------------------------2--------------------------
-1--2-StatusTests
01CoveredT1,T2,T3
10Not Covered
11CoveredT1,T7,T11

 LINE       885
 SUB-EXPRESSION ((spi_mode == FlashMode) || (spi_mode == PassThrough))
                 -----------1-----------    ------------2------------
-1--2-StatusTests
00Not Covered
01CoveredT11,T12,T14
10CoveredT1,T2,T3

 LINE       885
 SUB-EXPRESSION (spi_mode == FlashMode)
                -----------1-----------
-1-StatusTests
0CoveredT11,T12,T14
1CoveredT1,T2,T3

 LINE       885
 SUB-EXPRESSION (spi_mode == PassThrough)
                ------------1------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT11,T12,T14

 LINE       1044
 EXPRESSION (cfg_tpm_en && ((!sck_tpm_csb_buf)))
             -----1----    ----------2---------
-1--2-StatusTests
01CoveredT1,T7,T20
10CoveredT4,T5,T10
11CoveredT4,T5,T13

 LINE       1217
 EXPRESSION (reg2hw.flash_status.busy.qe && reg2hw.flash_status.wel.qe && reg2hw.flash_status.status.qe)
             -------------1-------------    -------------2------------    --------------3--------------
-1--2--3-StatusTests
011Not Covered
101Not Covered
110Not Covered
111CoveredT12,T14,T15

 LINE       1228
 EXPRESSION (cmd_only_dp_sel == DpWrEn)
            -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT12,T60,T46

 LINE       1229
 EXPRESSION (cmd_only_dp_sel == DpWrDi)
            -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT62,T46,T53

 LINE       1442
 EXPRESSION (cmd_only_dp_sel == DpEn4B)
            -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT12,T46,T54

 LINE       1443
 EXPRESSION (cmd_only_dp_sel == DpEx4B)
            -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT12,T60,T46

 LINE       1607
 EXPRESSION (reg2hw.tpm_status.wrfifo_pending.qe & ((~reg2hw.tpm_status.wrfifo_pending.q)))
             -----------------1-----------------   -------------------2-------------------
-1--2-StatusTests
01CoveredT1,T3,T4
10Not Covered
11CoveredT5,T13,T31

 LINE       1725
 EXPRESSION ((i != SysSramFwEgress) && (i != SysSramFwIngress))
             -----------1----------    -----------2-----------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       1725
 SUB-EXPRESSION (i != SysSramFwEgress)
                -----------1----------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       1725
 SUB-EXPRESSION (i != SysSramFwIngress)
                -----------1-----------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       1797
 EXPRESSION (tpm_rst_in_n | rst_spi_in_n)
             ------1-----   ------2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT1,T7,T11
10CoveredT1,T4,T5

 LINE       1863
 SUB-EXPRESSION (reg2hw.alert_test.q & reg2hw.alert_test.qe)
                 ---------1---------   ----------2---------
-1--2-StatusTests
01CoveredT6,T41,T98
10CoveredT1,T2,T3
11CoveredT6,T41,T98

Toggle Coverage for Module : spi_device
TotalCoveredPercent
Totals 63 58 92.06
Total Bits 466 452 97.00
Total Bits 0->1 233 226 97.00
Total Bits 1->0 233 226 97.00

Ports 63 58 92.06
Port Bits 466 452 97.00
Port Bits 0->1 233 226 97.00
Port Bits 1->0 233 226 97.00

Port Details
Name   Toggle   Toggle 1->0   Tests   Toggle 0->1   Tests   Direction   
clk_i Yes Yes T1,T2,T3 Yes T1,T2,T3 INPUT
rst_ni Yes Yes T9,T19,T24 Yes T1,T2,T3 INPUT
tl_i.d_ready Yes Yes T1,T3,T4 Yes T1,T2,T3 INPUT
tl_i.a_user.data_intg[6:0] Yes Yes T1,T3,T4 Yes T1,T3,T4 INPUT
tl_i.a_user.cmd_intg[6:0] Yes Yes T1,T3,T4 Yes T3,T4,T5 INPUT
tl_i.a_user.instr_type[3:0] Yes Yes T3,T6,T9 Yes T3,T6,T9 INPUT
tl_i.a_user.rsvd[4:0] Unreachable Unreachable Unreachable INPUT
tl_i.a_data[31:0] Yes Yes T1,T3,T4 Yes T1,T3,T4 INPUT
tl_i.a_mask[3:0] Yes Yes T3,T5,T6 Yes T3,T5,T6 INPUT
tl_i.a_address[31:0] Yes Yes T3,T6,T8 Yes T3,T6,T8 INPUT
tl_i.a_source[7:0] Yes Yes T1,T3,T4 Yes T1,T3,T4 INPUT
tl_i.a_size[1:0] Yes Yes T1,T3,T4 Yes T1,T3,T4 INPUT
tl_i.a_param[2:0] Unreachable Unreachable Unreachable INPUT
tl_i.a_opcode[2:0] Yes Yes T3,T4,T5 Yes T3,T4,T5 INPUT
tl_i.a_valid Yes Yes T1,T2,T3 Yes T1,T2,T3 INPUT
tl_o.a_ready Yes Yes T1,T2,T3 Yes T1,T2,T3 OUTPUT
tl_o.d_error Yes Yes T3,T8,T45 Yes T3,T8,T45 OUTPUT
tl_o.d_user.data_intg[6:0] Yes Yes T1,T5,T7 Yes T1,T5,T7 OUTPUT
tl_o.d_user.rsp_intg[5:0] Yes Yes *T1,*T2,T3 Yes T1,T3,T4 OUTPUT
tl_o.d_user.rsp_intg[6] Unreachable Unreachable Unreachable OUTPUT
tl_o.d_data[31:0] Yes Yes T1,T2,T3 Yes T3,T5,T8 OUTPUT
tl_o.d_sink Unreachable Unreachable Unreachable OUTPUT
tl_o.d_source[7:0] Yes Yes T1,T3,T4 Yes T1,T2,T3 OUTPUT
tl_o.d_size[1:0] Yes Yes T1,T3,T4 Yes T1,T3,T4 OUTPUT
tl_o.d_param[2:0] Unreachable Unreachable Unreachable OUTPUT
tl_o.d_opcode[0] Yes Yes *T3,*T4,*T5 Yes T3,T4,T5 OUTPUT
tl_o.d_opcode[2:1] Unreachable Unreachable Unreachable OUTPUT
tl_o.d_valid Yes Yes T1,T2,T3 Yes T1,T2,T3 OUTPUT
alert_rx_i[0].ack_n Yes Yes T1,T2,T3 Yes T1,T2,T3 INPUT
alert_rx_i[0].ack_p Yes Yes T6,T9,T41 Yes T6,T9,T41 INPUT
alert_rx_i[0].ping_n Unreachable Unreachable Unreachable INPUT
alert_rx_i[0].ping_p Unreachable Unreachable Unreachable INPUT
alert_tx_o[0].alert_n Yes Yes T1,T2,T3 Yes T1,T2,T3 OUTPUT
alert_tx_o[0].alert_p Yes Yes T6,T9,T41 Yes T6,T9,T41 OUTPUT
cio_sck_i Yes Yes T4,T5,T11 Yes T4,T5,T11 INPUT
cio_csb_i Yes Yes T1,T7,T11 Yes T1,T7,T11 INPUT
cio_sd_o[3:0] Yes Yes T11,T12,T14 Yes T11,T12,T14 OUTPUT
cio_sd_en_o[3:0] Yes Yes T11,T14,T15 Yes T11,T14,T15 OUTPUT
cio_sd_i[3:0] Yes Yes T4,T5,T11 Yes T4,T5,T11 INPUT
cio_tpm_csb_i Yes Yes T1,T4,T5 Yes T1,T4,T5 INPUT
passthrough_o.s_en[0] Yes Yes *T11,*T12,*T14 Yes T11,T12,T14 OUTPUT
passthrough_o.s_en[3:1] No No No OUTPUT
passthrough_o.s[3:0] Yes Yes T4,T5,T11 Yes T4,T5,T11 OUTPUT
passthrough_o.csb_en No No No OUTPUT
passthrough_o.csb Yes Yes T1,T7,T11 Yes T1,T7,T11 OUTPUT
passthrough_o.sck_en No No No OUTPUT
passthrough_o.sck Yes Yes T4,T5,T11 Yes T4,T5,T11 OUTPUT
passthrough_o.passthrough_en Yes Yes T61,T58,T46 Yes T11,T12,T14 OUTPUT
passthrough_i.s[3:0] Yes Yes T4,T5,T11 Yes T4,T5,T11 INPUT
intr_upload_cmdfifo_not_empty_o Yes Yes T24,T35,T38 Yes T24,T35,T38 OUTPUT
intr_upload_payload_not_empty_o Yes Yes T24,T35,T38 Yes T24,T35,T38 OUTPUT
intr_upload_payload_overflow_o Yes Yes T24,T35,T38 Yes T24,T35,T38 OUTPUT
intr_readbuf_watermark_o Yes Yes T24,T35,T38 Yes T24,T35,T38 OUTPUT
intr_readbuf_flip_o Yes Yes T24,T35,T38 Yes T24,T35,T38 OUTPUT
intr_tpm_header_not_empty_o Yes Yes T24,T35,T38 Yes T24,T35,T38 OUTPUT
intr_tpm_rdfifo_cmd_end_o Yes Yes T24,T38,T39 Yes T24,T38,T39 OUTPUT
intr_tpm_rdfifo_drop_o Yes Yes T24,T35,T38 Yes T24,T35,T38 OUTPUT
ram_cfg_i.b_ram_lcfg.cfg[3:0] Yes Yes T2 Yes T2 INPUT
ram_cfg_i.b_ram_lcfg.cfg_en Yes Yes T2 Yes T2 INPUT
ram_cfg_i.b_ram_lcfg.test Yes Yes T2 Yes T2 INPUT
ram_cfg_i.a_ram_lcfg.cfg[3:0] Yes Yes T2 Yes T2 INPUT
ram_cfg_i.a_ram_lcfg.cfg_en Yes Yes T2 Yes T2 INPUT
ram_cfg_i.a_ram_lcfg.test Yes Yes T2 Yes T2 INPUT
ram_cfg_i.b_ram_fcfg.cfg[3:0] Yes Yes T2 Yes T2 INPUT
ram_cfg_i.b_ram_fcfg.cfg_en Yes Yes T2 Yes T2 INPUT
ram_cfg_i.b_ram_fcfg.test Yes Yes T2 Yes T2 INPUT
ram_cfg_i.a_ram_fcfg.cfg[3:0] Yes Yes T2 Yes T2 INPUT
ram_cfg_i.a_ram_fcfg.cfg_en Yes Yes T2 Yes T2 INPUT
ram_cfg_i.a_ram_fcfg.test Yes Yes T2 Yes T2 INPUT
sck_monitor_o Yes Yes T4,T5,T11 Yes T4,T5,T11 OUTPUT
mbist_en_i Unreachable Unreachable Unreachable INPUT
scan_clk_i No No No INPUT
scan_rst_ni No No No INPUT
scanmode_i[3:0] Unreachable Unreachable Unreachable INPUT

*Tests covering at least one bit in the range

Branch Coverage for Module : spi_device
Line No.TotalCoveredPercent
Branches 32 29 90.62
IF 539 3 3 100.00
IF 828 2 2 100.00
CASE 844 4 4 100.00
IF 885 3 3 100.00
CASE 901 7 5 71.43
IF 1028 2 2 100.00
IF 1044 5 4 80.00
IF 1078 2 2 100.00
IF 1725 2 2 100.00
IF 1735 2 2 100.00


539 if (!rst_ni) begin -1- 540 readbuf_addr_busclk <= '0; ==> 541 end else if (sys_csb_deasserted_pulse) begin -2- 542 readbuf_addr_busclk <= readbuf_addr_sck; ==> 543 end MISSING_ELSE ==>

Branches:
-1--2-StatusTests
1 - Covered T1,T2,T3
0 1 Covered T11,T12,T14
0 0 Covered T1,T2,T3


828 if (!rst_spi_out_n) io_mode_outclk <= SingleIO; -1- ==> 829 else io_mode_outclk <= io_mode; ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T11,T12,T14


844 unique case (cmd_dp_sel) -1- 845 DpReadCmd, DpReadSFDP: begin 846 // SRAM:: Remember this has glitch 847 // switch should happen only when clock gate is disabled. 848 flash_sram_l2m = sub_sram_l2m[IoModeReadCmd]; ==> 849 sub_sram_m2l[IoModeReadCmd] = flash_sram_m2l; 850 end 851 852 DpUpload: begin 853 flash_sram_l2m = sub_sram_l2m[IoModeUpload]; ==> 854 sub_sram_m2l[IoModeUpload] = flash_sram_m2l; 855 end 856 857 default: begin 858 if (cmd_only_dp_sel == DpUpload) begin -2- 859 // Be ready to upload commands on the 8th command bit, when directed 860 flash_sram_l2m = sub_sram_l2m[IoModeUpload]; ==> 861 sub_sram_m2l[IoModeUpload] = flash_sram_m2l; 862 end else begin 863 // DpNone, DpReadStatus, DpReadJEDEC 864 flash_sram_l2m = '{default: '0 }; ==>

Branches:
-1--2-StatusTests
DpReadCmd DpReadSFDP - Covered T11,T14,T15
DpUpload - Covered T61,T58,T46
default 1 Covered T61,T58,T46
default 0 Covered T1,T2,T3


885 if (!sck_csb && ((spi_mode == FlashMode) || (spi_mode == PassThrough))) begin -1- 886 mem_b_l2m = flash_sram_l2m; ==> 887 flash_sram_m2l = mem_b_m2l; 888 end else if (cfg_tpm_en) begin -2- 889 mem_b_l2m = tpm_sram_l2m; ==> 890 tpm_sram_m2l = mem_b_m2l; 891 end MISSING_ELSE ==>

Branches:
-1--2-StatusTests
1 - Covered T1,T7,T11
0 1 Covered T4,T5,T10
0 0 Covered T1,T2,T3


901 unique case (spi_mode) -1- 902 FlashMode, PassThrough: begin 903 unique case (cmd_dp_sel) -2- 904 DpNone: begin 905 io_mode = sub_iomode[IoModeCmdParse]; ==> 906 907 sub_p2s_sent[IoModeCmdParse] = p2s_sent; 908 909 end 910 DpReadCmd, DpReadSFDP: begin 911 io_mode = sub_iomode[IoModeReadCmd]; ==> 912 913 p2s_valid = sub_p2s_valid[IoModeReadCmd]; 914 p2s_data = sub_p2s_data[IoModeReadCmd]; 915 sub_p2s_sent[IoModeReadCmd] = p2s_sent; 916 end 917 DpReadStatus: begin 918 io_mode = sub_iomode[IoModeStatus]; ==> 919 920 p2s_valid = sub_p2s_valid[IoModeStatus]; 921 p2s_data = sub_p2s_data[IoModeStatus]; 922 sub_p2s_sent[IoModeStatus] = p2s_sent; 923 924 end 925 926 DpReadJEDEC: begin 927 io_mode = sub_iomode[IoModeJedec]; ==> 928 929 p2s_valid = sub_p2s_valid[IoModeJedec]; 930 p2s_data = sub_p2s_data[IoModeJedec]; 931 sub_p2s_sent[IoModeJedec] = p2s_sent; 932 end 933 934 DpUpload: begin 935 io_mode = sub_iomode[IoModeUpload]; ==> 936 937 p2s_valid = sub_p2s_valid[IoModeUpload]; 938 p2s_data = sub_p2s_data[IoModeUpload]; 939 sub_p2s_sent[IoModeUpload] = p2s_sent; 940 end 941 // DpUnknown: 942 default: begin 943 io_mode = sub_iomode[IoModeCmdParse]; ==> 944 945 sub_p2s_sent[IoModeCmdParse] = p2s_sent; 946 end 947 endcase 948 end 949 950 default: begin 951 io_mode = SingleIO; ==>

Branches:
-1--2-StatusTests
FlashMode PassThrough DpNone Covered T1,T2,T3
FlashMode PassThrough DpReadCmd DpReadSFDP Covered T11,T14,T15
FlashMode PassThrough DpReadStatus Covered T14,T55,T61
FlashMode PassThrough DpReadJEDEC Covered T46,T53,T54
FlashMode PassThrough DpUpload Covered T61,T58,T46
FlashMode PassThrough default Not Covered
default - Not Covered


1028 if (cmd_read_pipeline_sel) begin -1- 1029 internal_sd_out = internal_sd_stg2_q; ==> 1030 internal_sd_en_out = internal_sd_en_stg2; 1031 intercept_en_out = intercept_en_stg2; 1032 end else begin 1033 internal_sd_out = internal_sd; ==>

Branches:
-1-StatusTests
1 Covered T11,T14,T15
0 Covered T1,T2,T3


1044 if (cfg_tpm_en && !sck_tpm_csb_buf) begin : miso_tpm -1- 1045 // TPM transaction is on-going. MOSI, MISO is being used by TPM 1046 cio_sd_o = {2'b 00, tpm_miso, 1'b 0}; ==> 1047 cio_sd_en_o = {2'b 00, tpm_miso_en, 1'b 0}; 1048 1049 end else begin : spi_out_flash_passthrough 1050 // SPI Flash, Passthrough modes 1051 unique case (spi_mode) -2- 1052 FlashMode: begin 1053 cio_sd_o = internal_sd_out; ==> 1054 cio_sd_en_o = internal_sd_en_out; 1055 end 1056 1057 PassThrough: begin 1058 if (intercept_en_out) begin -3- 1059 cio_sd_o = internal_sd_out; ==> 1060 cio_sd_en_o = internal_sd_en_out; 1061 end else begin 1062 cio_sd_o = passthrough_sd; ==> 1063 cio_sd_en_o = passthrough_sd_en; 1064 end 1065 end 1066 1067 default: begin 1068 cio_sd_o = internal_sd; ==>

Branches:
-1--2--3-StatusTests
1 - - Covered T4,T5,T13
0 FlashMode - Covered T1,T2,T3
0 PassThrough 1 Covered T14,T15,T55
0 PassThrough 0 Covered T11,T12,T14
0 default - Not Covered


1078 if (!rst_spi_out_n) intercept_en <= 1'b 0; -1- ==> 1079 else intercept_en <= |intercept; ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T11,T12,T14


1725 if ((i != SysSramFwEgress) && (i != SysSramFwIngress)) begin -1- 1726 sys_sram_hw_req |= sys_sram_l2m[i].req; ==> 1727 end MISSING_ELSE ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T1,T2,T3


1735 if (sys_sram_hw_req) begin -1- 1736 // Fixed low priority. (Discussed in #10065) 1737 // When HW requests the SRAM access, lower the SW requests (and grant) 1738 sys_sram_req[SysSramFwEgress] = 1'b0; ==> 1739 sys_sram_fw_gnt[SPI_DEVICE_EGRESS_BUFFER_IDX] = 1'b0; 1740 sys_sram_req[SysSramFwIngress] = 1'b0; 1741 sys_sram_fw_gnt[SPI_DEVICE_INGRESS_BUFFER_IDX] = 1'b0; 1742 end else begin 1743 sys_sram_fw_gnt[SPI_DEVICE_EGRESS_BUFFER_IDX] = sys_sram_gnt[SysSramFwEgress]; ==>

Branches:
-1-StatusTests
1 Covered T5,T13,T30
0 Covered T1,T2,T3


Assert Coverage for Module : spi_device
TotalAttemptedPercentSucceeded/MatchedPercent
Assertions 22 22 100.00 21 95.45
Cover properties 0 0 0
Cover sequences 0 0 0
Total 22 22 100.00 21 95.45




Assertion Details

Name   Attempts   Real Successes   Failures   Incomplete   
AlertKnownO_A 419071338 418985310 0 0
CioSdoEnOKnown 419071338 418985310 0 0
CioSdoEnOffWhenInactive 419071338 418985310 0 0
FpvSecCmRegWeOnehotCheck_A 419071338 80 0 0
InterceptLevel_M 136094785 0 0 0
IntrReadbufFlipOKnown 419071338 418985310 0 0
IntrReadbufWatermarkOKnown 419071338 418985310 0 0
IntrTpmHeaderNotEmptyOKnown 419071338 418985310 0 0
IntrTpmRdfifoCmdEndOKnown 419071338 418985310 0 0
IntrTpmRdfifoDropOKnown 419071338 418985310 0 0
IntrUploadCmdfifoNotEmptyOKnown 419071338 418985310 0 0
IntrUploadPayloadNotEmptyOKnown 419071338 418985310 0 0
IntrUploadPayloadOverflowOKnown 419071338 418985310 0 0
PayloadStartIdxWidthMatch_A 976 976 0 0
SpiModeKnown_A 419071338 418985310 0 0
TpmEnableWhenTpmCsbIdle_M 419071338 348 0 0
g_sram_connect[0].ReqAlwaysAccepted_A 419071338 1834768 0 0
g_sram_connect[1].ReqAlwaysAccepted_A 419071338 175297 0 0
g_sram_connect[2].ReqAlwaysAccepted_A 419071338 2279 0 0
g_sram_connect[3].ReqAlwaysAccepted_A 419071338 1708 0 0
g_sram_connect[4].ReqAlwaysAccepted_A 419071338 186315 0 0
scanmodeKnown 419071338 419071338 0 0


AlertKnownO_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 418985310 0 0
T1 1375 1284 0 0
T2 951 889 0 0
T3 2704 2634 0 0
T4 12731 12634 0 0
T5 3176 3094 0 0
T6 1218 1129 0 0
T7 1561 1484 0 0
T8 1033 937 0 0
T9 6001 4498 0 0
T10 706 644 0 0

CioSdoEnOKnown
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 418985310 0 0
T1 1375 1284 0 0
T2 951 889 0 0
T3 2704 2634 0 0
T4 12731 12634 0 0
T5 3176 3094 0 0
T6 1218 1129 0 0
T7 1561 1484 0 0
T8 1033 937 0 0
T9 6001 4498 0 0
T10 706 644 0 0

CioSdoEnOffWhenInactive
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 418985310 0 0
T1 1375 1284 0 0
T2 951 889 0 0
T3 2704 2634 0 0
T4 12731 12634 0 0
T5 3176 3094 0 0
T6 1218 1129 0 0
T7 1561 1484 0 0
T8 1033 937 0 0
T9 6001 4498 0 0
T10 706 644 0 0

FpvSecCmRegWeOnehotCheck_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 80 0 0
T9 6001 20 0 0
T10 706 0 0 0
T11 97922 0 0 0
T12 15980 0 0 0
T13 9739 0 0 0
T14 16579 0 0 0
T15 23258 0 0 0
T16 4766 0 0 0
T17 25782 0 0 0
T19 0 20 0 0
T25 0 20 0 0
T26 0 10 0 0
T36 0 10 0 0
T40 1872 0 0 0

InterceptLevel_M
NameAttemptsReal SuccessesFailuresIncomplete
Total 136094785 0 0 0

IntrReadbufFlipOKnown
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 418985310 0 0
T1 1375 1284 0 0
T2 951 889 0 0
T3 2704 2634 0 0
T4 12731 12634 0 0
T5 3176 3094 0 0
T6 1218 1129 0 0
T7 1561 1484 0 0
T8 1033 937 0 0
T9 6001 4498 0 0
T10 706 644 0 0

IntrReadbufWatermarkOKnown
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 418985310 0 0
T1 1375 1284 0 0
T2 951 889 0 0
T3 2704 2634 0 0
T4 12731 12634 0 0
T5 3176 3094 0 0
T6 1218 1129 0 0
T7 1561 1484 0 0
T8 1033 937 0 0
T9 6001 4498 0 0
T10 706 644 0 0

IntrTpmHeaderNotEmptyOKnown
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 418985310 0 0
T1 1375 1284 0 0
T2 951 889 0 0
T3 2704 2634 0 0
T4 12731 12634 0 0
T5 3176 3094 0 0
T6 1218 1129 0 0
T7 1561 1484 0 0
T8 1033 937 0 0
T9 6001 4498 0 0
T10 706 644 0 0

IntrTpmRdfifoCmdEndOKnown
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 418985310 0 0
T1 1375 1284 0 0
T2 951 889 0 0
T3 2704 2634 0 0
T4 12731 12634 0 0
T5 3176 3094 0 0
T6 1218 1129 0 0
T7 1561 1484 0 0
T8 1033 937 0 0
T9 6001 4498 0 0
T10 706 644 0 0

IntrTpmRdfifoDropOKnown
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 418985310 0 0
T1 1375 1284 0 0
T2 951 889 0 0
T3 2704 2634 0 0
T4 12731 12634 0 0
T5 3176 3094 0 0
T6 1218 1129 0 0
T7 1561 1484 0 0
T8 1033 937 0 0
T9 6001 4498 0 0
T10 706 644 0 0

IntrUploadCmdfifoNotEmptyOKnown
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 418985310 0 0
T1 1375 1284 0 0
T2 951 889 0 0
T3 2704 2634 0 0
T4 12731 12634 0 0
T5 3176 3094 0 0
T6 1218 1129 0 0
T7 1561 1484 0 0
T8 1033 937 0 0
T9 6001 4498 0 0
T10 706 644 0 0

IntrUploadPayloadNotEmptyOKnown
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 418985310 0 0
T1 1375 1284 0 0
T2 951 889 0 0
T3 2704 2634 0 0
T4 12731 12634 0 0
T5 3176 3094 0 0
T6 1218 1129 0 0
T7 1561 1484 0 0
T8 1033 937 0 0
T9 6001 4498 0 0
T10 706 644 0 0

IntrUploadPayloadOverflowOKnown
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 418985310 0 0
T1 1375 1284 0 0
T2 951 889 0 0
T3 2704 2634 0 0
T4 12731 12634 0 0
T5 3176 3094 0 0
T6 1218 1129 0 0
T7 1561 1484 0 0
T8 1033 937 0 0
T9 6001 4498 0 0
T10 706 644 0 0

PayloadStartIdxWidthMatch_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 976 976 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T4 1 1 0 0
T5 1 1 0 0
T6 1 1 0 0
T7 1 1 0 0
T8 1 1 0 0
T9 1 1 0 0
T10 1 1 0 0

SpiModeKnown_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 418985310 0 0
T1 1375 1284 0 0
T2 951 889 0 0
T3 2704 2634 0 0
T4 12731 12634 0 0
T5 3176 3094 0 0
T6 1218 1129 0 0
T7 1561 1484 0 0
T8 1033 937 0 0
T9 6001 4498 0 0
T10 706 644 0 0

TpmEnableWhenTpmCsbIdle_M
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 348 0 0
T4 12731 1 0 0
T5 3176 1 0 0
T6 1218 0 0 0
T7 1561 0 0 0
T8 1033 0 0 0
T9 6001 0 0 0
T10 706 1 0 0
T11 97922 0 0 0
T12 15980 0 0 0
T13 9739 1 0 0
T27 0 1 0 0
T28 0 1 0 0
T29 0 1 0 0
T30 0 1 0 0
T31 0 1 0 0
T32 0 1 0 0

g_sram_connect[0].ReqAlwaysAccepted_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 1834768 0 0
T3 2704 100 0 0
T4 12731 0 0 0
T5 3176 0 0 0
T6 1218 0 0 0
T7 1561 0 0 0
T8 1033 100 0 0
T9 6001 0 0 0
T10 706 0 0 0
T11 97922 832 0 0
T12 15980 832 0 0
T14 0 832 0 0
T15 0 832 0 0
T16 0 832 0 0
T17 0 832 0 0
T18 0 832 0 0
T21 0 832 0 0

g_sram_connect[1].ReqAlwaysAccepted_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 175297 0 0
T3 2704 100 0 0
T4 12731 0 0 0
T5 3176 40 0 0
T6 1218 0 0 0
T7 1561 0 0 0
T8 1033 100 0 0
T9 6001 0 0 0
T10 706 0 0 0
T11 97922 0 0 0
T12 15980 0 0 0
T13 0 5 0 0
T30 0 318 0 0
T31 0 1 0 0
T34 0 96 0 0
T45 0 100 0 0
T47 0 100 0 0
T48 0 13 0 0

g_sram_connect[2].ReqAlwaysAccepted_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 2279 0 0
T24 3546 0 0 0
T25 5794 0 0 0
T33 2691 0 0 0
T37 0 3 0 0
T46 0 2 0 0
T47 1080 0 0 0
T49 29779 0 0 0
T50 0 1 0 0
T53 0 8 0 0
T54 0 5 0 0
T58 0 2 0 0
T60 23879 0 0 0
T61 46076 2 0 0
T66 0 5 0 0
T76 174417 0 0 0
T89 0 3 0 0
T90 0 2 0 0
T98 1320 0 0 0
T99 1189 0 0 0

g_sram_connect[3].ReqAlwaysAccepted_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 1708 0 0
T24 3546 0 0 0
T25 5794 0 0 0
T33 2691 0 0 0
T46 0 1 0 0
T47 1080 0 0 0
T49 29779 0 0 0
T50 0 1 0 0
T53 0 6 0 0
T54 0 2 0 0
T58 0 2 0 0
T60 23879 0 0 0
T61 46076 2 0 0
T66 0 2 0 0
T76 174417 0 0 0
T89 0 1 0 0
T90 0 2 0 0
T95 0 1 0 0
T98 1320 0 0 0
T99 1189 0 0 0

g_sram_connect[4].ReqAlwaysAccepted_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 186315 0 0
T5 3176 4 0 0
T6 1218 0 0 0
T7 1561 0 0 0
T8 1033 0 0 0
T9 6001 0 0 0
T10 706 0 0 0
T11 97922 0 0 0
T12 15980 0 0 0
T13 9739 16 0 0
T14 16579 0 0 0
T30 0 485 0 0
T34 0 323 0 0
T46 0 510 0 0
T48 0 25 0 0
T53 0 321 0 0
T73 0 15 0 0
T74 0 1229 0 0
T75 0 1824 0 0

scanmodeKnown
NameAttemptsReal SuccessesFailuresIncomplete
Total 419071338 419071338 0 0
T1 1375 1375 0 0
T2 951 951 0 0
T3 2704 2704 0 0
T4 12731 12731 0 0
T5 3176 3176 0 0
T6 1218 1218 0 0
T7 1561 1561 0 0
T8 1033 1033 0 0
T9 6001 6001 0 0
T10 706 706 0 0