Solved the trap issue by not driving the PLL clock so fast (not sure why
that happens in a behavioral simulation, though). PLL still needs glitch-
free switching and needs to be able to run the PLL and let it settle before
switching the core clock.
diff --git a/verilog/dv/caravel/mgmt_soc/pll/pll.c b/verilog/dv/caravel/mgmt_soc/pll/pll.c
index ac0c375..dd8e0d6 100644
--- a/verilog/dv/caravel/mgmt_soc/pll/pll.c
+++ b/verilog/dv/caravel/mgmt_soc/pll/pll.c
@@ -63,8 +63,13 @@
reg_spimaster_config = 0xb002; // Apply stream mode
reg_spimaster_data = 0x80; // Write 0x80 (write mode)
- reg_spimaster_data = 0x08; // Write 0x08 (start address)
+ reg_spimaster_data = 0x11; // Write 0x11 (start address)
+ reg_spimaster_data = 0x02; // Write 0x02 to PLL select
+ reg_spimaster_config = 0xa102; // Release CSB (ends stream mode)
+ reg_spimaster_config = 0xb002; // Apply stream mode
+ reg_spimaster_data = 0x80; // Write 0x80 (write mode)
+ reg_spimaster_data = 0x08; // Write 0x08 (start address)
reg_spimaster_data = 0x00; // Write 0x00 to turn off DCO mode
reg_spimaster_data = 0x00; // Write 0x00 to clock from PLL
reg_spimaster_config = 0xa102; // Release CSB (ends stream mode)
@@ -75,7 +80,6 @@
reg_spimaster_config = 0xb002; // Apply stream mode
reg_spimaster_data = 0x80; // Write 0x80 (write mode)
reg_spimaster_data = 0x12; // Write 0x12 (start address)
-
reg_spimaster_data = 0x03; // Write 0x03 to divider (was 0x04)
reg_spimaster_config = 0xa102; // Release CSB (ends stream mode)
@@ -85,8 +89,7 @@
reg_spimaster_config = 0xb002; // Apply stream mode
reg_spimaster_data = 0x80; // Write 0x80 (write mode)
reg_spimaster_data = 0x11; // Write 0x11 (start address)
-
- reg_spimaster_data = 0x02; // Write 0x02 to PLL select
+ reg_spimaster_data = 0x03; // Write 0x03 to PLL select
reg_spimaster_config = 0xa102; // Release CSB (ends stream mode)
reg_spimaster_config = 0x2102; // Release housekeeping SPI