blob: af40b8f6fd160b8c9d310408190e0e93e12acaf0 [file] [log] [blame]
Tim Edwards04ba17f2020-10-02 22:27:50 -04001module caravel_clkrst(
shalanfd13eb52020-08-21 16:48:07 +02002`ifdef LVS
3 input vdd1v8,
4 input vss,
5`endif
6 input ext_clk_sel,
7 input ext_clk,
8 input pll_clk,
Tim Edwards04ba17f2020-10-02 22:27:50 -04009 input resetb,
10 input ext_reset, // NOTE: positive sense reset
11 output core_clk,
12 output resetb_sync
Tim Edwardscd64af52020-08-07 11:11:58 -040013);
14
shalanfd13eb52020-08-21 16:48:07 +020015 // Clock assignment (to do: make this glitch-free)
Tim Edwards04ba17f2020-10-02 22:27:50 -040016 assign core_clk = (ext_clk_sel == 1'b1) ? ext_clk : pll_clk;
Tim Edwardscd64af52020-08-07 11:11:58 -040017
shalanfd13eb52020-08-21 16:48:07 +020018 // Reset assignment. "reset" comes from POR, while "ext_reset"
19 // comes from standalone SPI (and is normally zero unless
20 // activated from the SPI).
Tim Edwardscd64af52020-08-07 11:11:58 -040021
shalanfd13eb52020-08-21 16:48:07 +020022 // Staged-delay reset
23 reg [2:0] reset_delay;
Tim Edwardscd64af52020-08-07 11:11:58 -040024
Tim Edwards04ba17f2020-10-02 22:27:50 -040025 always @(posedge core_clk or negedge resetb) begin
26 if (resetb == 1'b0) begin
shalanfd13eb52020-08-21 16:48:07 +020027 reset_delay <= 3'b111;
28 end else begin
29 reset_delay <= {1'b0, reset_delay[2:1]};
30 end
31 end
Tim Edwardscd64af52020-08-07 11:11:58 -040032
Tim Edwards04ba17f2020-10-02 22:27:50 -040033 assign resetb_sync = ~(reset_delay[0] | ext_reset);
Tim Edwardscd64af52020-08-07 11:11:58 -040034
35endmodule