[spi_dev] Attempt to fix combo loop A combo loop was observed through the following path data_i -> dp_sel -> data_o, which then loops back to data_i. The issue is because in cmdparse the upload case immediately selects a new datapath because there are no more guaranteed clocks for certain commands. However, this same combo selection does not have to be used for the read return path, so the fix just flops the read return on spi_clk_out (spi_clk_in might also be okay) Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/ip/spi_device/rtl/spi_device.sv b/hw/ip/spi_device/rtl/spi_device.sv index 949a287..b28e434 100644 --- a/hw/ip/spi_device/rtl/spi_device.sv +++ b/hw/ip/spi_device/rtl/spi_device.sv
@@ -155,7 +155,7 @@ logic sub_p2s_sent[IoModeEnd]; // CMD interface - sel_datapath_e cmd_dp_sel; + sel_datapath_e cmd_dp_sel, cmd_dp_sel_outclk; spi_byte_t cmd_opcode; @@ -496,6 +496,11 @@ else io_mode_outclk <= io_mode; end + always_ff @(posedge clk_spi_out_buf or negedge rst_spi_n) begin + if (!rst_spi_n) cmd_dp_sel_outclk <= DpNone; + else cmd_dp_sel_outclk <= cmd_dp_sel; + end + always_comb begin io_mode = SingleIO; p2s_valid = 1'b 0; @@ -530,7 +535,7 @@ end FlashMode: begin - unique case (cmd_dp_sel) + unique case (cmd_dp_sel_outclk) DpNone: begin io_mode = sub_iomode[IoModeCmdParse];