Delete caravel/rtl directory
diff --git a/caravel/rtl/DFFRAM.v b/caravel/rtl/DFFRAM.v
deleted file mode 100644
index 81d0970..0000000
--- a/caravel/rtl/DFFRAM.v
+++ /dev/null
@@ -1,110 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-`ifndef USE_CUSTOM_DFFRAM
-
-module DFFRAM_1K (
-`ifdef USE_POWER_PINS
- input VPWR,
- input VGND,
-`endif
- input CLK,
- input [3:0] WE,
- input EN,
- input [31:0] Di,
- output reg [31:0] Do,
- input [7:0] A
-);
-
-
-reg [31:0] mem [0:`MEM_WORDS-1];
-
-always @(posedge CLK) begin
- if (EN == 1'b1) begin
- Do <= mem[A];
- if (WE[0]) mem[A][ 7: 0] <= Di[ 7: 0];
- if (WE[1]) mem[A][15: 8] <= Di[15: 8];
- if (WE[2]) mem[A][23:16] <= Di[23:16];
- if (WE[3]) mem[A][31:24] <= Di[31:24];
- end
-end
-endmodule
-
-`else
-
-module DFFRAM #(parameter USE_LATCH=`DFFRAM_USE_LATCH,
- WSIZE=`DFFRAM_WSIZE )
-(
-`ifdef USE_POWER_PINS
- input wire VPWR,
- input wire VGND,
-`endif
- input wire CLK, // FO: 2
- input wire [WSIZE-1:0] WE, // FO: 2
- input EN, // FO: 2
- input wire [7:0] A, // FO: 5
- input wire [(WSIZE*8-1):0] Di, // FO: 2
- output wire [(WSIZE*8-1):0] Do
-
-);
-
- wire [1:0] SEL;
- wire [(WSIZE*8-1):0] Do_pre[1:0];
-
- // 1x2 DEC
- DEC1x2 DEC (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .EN(EN),
- .A(A[7]),
- .SEL(SEL)
- );
-
- // sky130_fd_sc_hd__inv_2 DEC (
- // `ifdef USE_POWER_PINS
- // .VPWR(VPWR),
- // .VGND(VGND),
- // .VPB(VPWR),
- // .VNB(VGND),
- // `endif
- // .Y(SEL[0]), .A(A[7]));
- // assign SEL[1] = A[7];
-
- generate
- genvar i;
- for (i=0; i< 2; i=i+1) begin : BLOCK
- RAM128 #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM128 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .CLK(CLK), .EN(SEL[i]), .WE(WE), .Di(Di), .Do(Do_pre[i]), .A(A[6:0]) );
- end
- endgenerate
-
- // Output MUX
- MUX2x1 #(.WIDTH(WSIZE*8)) DoMUX (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .A0(Do_pre[0]), .A1(Do_pre[1]), .S(A[7]), .X(Do) );
-
-endmodule
-
-`endif
\ No newline at end of file
diff --git a/caravel/rtl/DFFRAMBB.v b/caravel/rtl/DFFRAMBB.v
deleted file mode 100644
index 15fa627..0000000
--- a/caravel/rtl/DFFRAMBB.v
+++ /dev/null
@@ -1,772 +0,0 @@
-/*
- Copyright ©2020-2021 The American University in Cairo and the Cloud V Project.
-
- This file is part of the DFFRAM Memory Compiler.
- See https://github.com/Cloud-V/DFFRAM for further info.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-// Add 1x2 binary decoder
-`default_nettype none
-
-module DEC1x2 (
-`ifdef USE_POWER_PINS
- input wire VPWR,
- input wire VGND,
-`endif
- input wire EN,
- input wire A,
- output wire [1:0] SEL
-);
-
- sky130_fd_sc_hd__and2b_2 AND0 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
-
- .X(SEL[0]),
- .A_N(A),
- .B(EN)
- );
-
- sky130_fd_sc_hd__and2_2 AND1 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
-
- .X(SEL[1]),
- .A(A) ,
- .B(EN)
- );
-
-endmodule
-
-module DEC2x4 (
-`ifdef USE_POWER_PINS
- input wire VPWR,
- input wire VGND,
-`endif
- input EN,
- input [1:0] A,
- output [3:0] SEL
-);
- sky130_fd_sc_hd__nor3b_4 AND0 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .Y(SEL[0]), .A(A[0]), .B(A[1]), .C_N(EN) );
- sky130_fd_sc_hd__and3b_4 AND1 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(SEL[1]), .A_N(A[1]), .B(A[0]), .C(EN) );
- sky130_fd_sc_hd__and3b_4 AND2 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(SEL[2]), .A_N(A[0]), .B(A[1]), .C(EN) );
- sky130_fd_sc_hd__and3_4 AND3 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(SEL[3]), .A(A[1]), .B(A[0]), .C(EN) );
-
-endmodule
-
-module DEC3x8 (
-`ifdef USE_POWER_PINS
- input wire VPWR,
- input wire VGND,
-`endif
- input EN,
- input [2:0] A,
- output [7:0] SEL
-);
-
- wire [2:0] A_buf;
- wire EN_buf;
-
- sky130_fd_sc_hd__clkbuf_2 ABUF[2:0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(A_buf), .A(A));
- sky130_fd_sc_hd__clkbuf_2 ENBUF (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(EN_buf), .A(EN));
-
- sky130_fd_sc_hd__nor4b_2 AND0 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .Y(SEL[0]) , .A(A_buf[0]), .B(A_buf[1]) , .C(A_buf[2]), .D_N(EN_buf) ); // 000
- sky130_fd_sc_hd__and4bb_2 AND1 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(SEL[1]) , .A_N(A_buf[2]), .B_N(A_buf[1]), .C(A_buf[0]) , .D(EN_buf) ); // 001
- sky130_fd_sc_hd__and4bb_2 AND2 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(SEL[2]) , .A_N(A_buf[2]), .B_N(A_buf[0]), .C(A_buf[1]) , .D(EN_buf) ); // 010
- sky130_fd_sc_hd__and4b_2 AND3 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(SEL[3]) , .A_N(A_buf[2]), .B(A_buf[1]), .C(A_buf[0]) , .D(EN_buf) ); // 011
- sky130_fd_sc_hd__and4bb_2 AND4 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(SEL[4]) , .A_N(A_buf[0]), .B_N(A_buf[1]), .C(A_buf[2]) , .D(EN_buf) ); // 100
- sky130_fd_sc_hd__and4b_2 AND5 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(SEL[5]) , .A_N(A_buf[1]), .B(A_buf[0]), .C(A_buf[2]) , .D(EN_buf) ); // 101
- sky130_fd_sc_hd__and4b_2 AND6 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(SEL[6]) , .A_N(A_buf[0]), .B(A_buf[1]), .C(A_buf[2]) , .D(EN_buf) ); // 110
- sky130_fd_sc_hd__and4_2 AND7 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(SEL[7]) , .A(A_buf[0]), .B(A_buf[1]), .C(A_buf[2]) , .D(EN_buf) ); // 111
-endmodule
-
-module MUX4x1 #(parameter WIDTH=32)
-(
-`ifdef USE_POWER_PINS
- input wire VPWR,
- input wire VGND,
-`endif
- input wire [WIDTH-1:0] A0, A1, A2, A3,
- input wire [1:0] S,
- output wire [WIDTH-1:0] X
-);
- localparam SIZE = WIDTH/8;
- wire [SIZE-1:0] SEL0, SEL1;
- sky130_fd_sc_hd__clkbuf_2 SEL0BUF[SIZE-1:0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(SEL0), .A(S[0]));
-
- sky130_fd_sc_hd__clkbuf_2 SEL1BUF[SIZE-1:0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(SEL1), .A(S[1]));
-
- generate
- genvar i;
- for(i=0; i<SIZE; i=i+1) begin : M
- sky130_fd_sc_hd__mux4_1 MUX[7:0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .A0(A0[(i+1)*8-1:i*8]),
- .A1(A1[(i+1)*8-1:i*8]),
- .A2(A2[(i+1)*8-1:i*8]),
- .A3(A3[(i+1)*8-1:i*8]),
- .S0(SEL0[i]),
- .S1(SEL1[i]),
- .X(X[(i+1)*8-1:i*8]) );
- end
- endgenerate
-endmodule
-
-module MUX2x1 #(parameter WIDTH=32)
-(
-`ifdef USE_POWER_PINS
- input wire VPWR,
- input wire VGND,
-`endif
- input wire [WIDTH-1:0] A0, A1, A2, A3,
- input wire S,
- output wire [WIDTH-1:0] X
-);
- localparam SIZE = WIDTH/8;
- wire [SIZE-1:0] SEL;
- sky130_fd_sc_hd__clkbuf_2 SELBUF[SIZE-1:0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(SEL), .A(S));
- generate
- genvar i;
- for(i=0; i<SIZE; i=i+1) begin : M
- sky130_fd_sc_hd__mux2_1 MUX[7:0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .A0(A0[(i+1)*8-1:i*8]), .A1(A1[(i+1)*8-1:i*8]), .S(SEL[i]), .X(X[(i+1)*8-1:i*8]) );
- end
- endgenerate
-endmodule
-
-module BYTE #( parameter USE_LATCH=`DFFRAM_USE_LATCH)(
-`ifdef USE_POWER_PINS
- input wire VPWR,
- input wire VGND,
-`endif
- input wire CLK, // FO: 1
- input wire WE, // FO: 1
- input wire SEL, // FO: 2
- input wire [7:0] Di, // FO: 1
- output wire [7:0] Do
-);
-
- wire [7:0] q_wire;
- wire we_wire;
- wire SEL_B;
- wire GCLK;
- wire CLK_B;
-
- generate
- genvar i;
-
- if(USE_LATCH == 1) begin
- sky130_fd_sc_hd__inv_1 CLKINV(
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .Y(CLK_B), .A(CLK));
- sky130_fd_sc_hd__dlclkp_1 CG(
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .CLK(CLK_B), .GCLK(GCLK), .GATE(we_wire) );
- end else
- sky130_fd_sc_hd__dlclkp_1 CG(
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .CLK(CLK), .GCLK(GCLK), .GATE(we_wire) );
-
- sky130_fd_sc_hd__inv_1 SELINV(
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .Y(SEL_B), .A(SEL));
- sky130_fd_sc_hd__and2_1 CGAND(
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .A(SEL), .B(WE), .X(we_wire) );
-
- for(i=0; i<8; i=i+1) begin : BIT
- if(USE_LATCH == 0)
- sky130_fd_sc_hd__dfxtp_1 FF (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .D(Di[i]), .Q(q_wire[i]), .CLK(GCLK) );
- else
- sky130_fd_sc_hd__dlxtp_1 LATCH (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .Q(q_wire[i]), .D(Di[i]), .GATE(GCLK) );
- sky130_fd_sc_hd__ebufn_2 OBUF (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .A(q_wire[i]), .Z(Do[i]), .TE_B(SEL_B) );
- end
- endgenerate
-
-endmodule
-
-
-module WORD #( parameter USE_LATCH=`DFFRAM_USE_LATCH,
- WSIZE=`DFFRAM_WSIZE ) (
-`ifdef USE_POWER_PINS
- input wire VPWR,
- input wire VGND,
-`endif
- input wire CLK, // FO: 1
- input wire [WSIZE-1:0] WE, // FO: 1
- input wire SEL, // FO: 1
- input wire [(WSIZE*8-1):0] Di, // FO: 1
- output wire [(WSIZE*8-1):0] Do
-);
-
- wire SEL_buf;
- wire CLK_buf;
- sky130_fd_sc_hd__clkbuf_2 SELBUF (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(SEL_buf), .A(SEL));
- sky130_fd_sc_hd__clkbuf_1 CLKBUF (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(CLK_buf), .A(CLK));
- generate
- genvar i;
- for(i=0; i<WSIZE; i=i+1) begin : BYTE
- BYTE #(.USE_LATCH(USE_LATCH)) B (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .CLK(CLK_buf), .WE(WE[i]), .SEL(SEL_buf), .Di(Di[(i+1)*8-1:i*8]), .Do(Do[(i+1)*8-1:i*8]) );
- end
- endgenerate
-
-endmodule
-
-
-module RAM8 #( parameter USE_LATCH=`DFFRAM_USE_LATCH,
- WSIZE=`DFFRAM_WSIZE ) (
-`ifdef USE_POWER_PINS
- input wire VPWR,
- input wire VGND,
-`endif
- input wire CLK, // FO: 1
- input wire [WSIZE-1:0] WE, // FO: 1
- input EN, // EN: 1
- input wire [2:0] A, // A: 1
- input wire [(WSIZE*8-1):0] Di, // FO: 1
- output wire [(WSIZE*8-1):0] Do
-);
-
- wire [7:0] SEL;
- wire [WSIZE-1:0] WE_buf;
- wire CLK_buf;
-
- DEC3x8 DEC (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .EN(EN), .A(A), .SEL(SEL));
- sky130_fd_sc_hd__clkbuf_2 WEBUF[WSIZE-1:0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(WE_buf), .A(WE));
- sky130_fd_sc_hd__clkbuf_2 CLKBUF (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(CLK_buf), .A(CLK));
-
- generate
- genvar i;
- for (i=0; i< 8; i=i+1) begin : WORD
- WORD #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) W (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .CLK(CLK_buf), .WE(WE_buf), .SEL(SEL[i]), .Di(Di), .Do(Do) );
- end
- endgenerate
-
-endmodule
-
-
-// 4 x RAM8 slices (128 bytes) with registered outout
-module RAM32 #( parameter USE_LATCH=`DFFRAM_USE_LATCH,
- WSIZE=`DFFRAM_WSIZE )
-(
-`ifdef USE_POWER_PINS
- input wire VPWR,
- input wire VGND,
-`endif
- input wire CLK, // FO: 1
- input wire [WSIZE-1:0] WE, // FO: 1
- input EN, // FO: 1
- input wire [4:0] A, // FO: 1
- input wire [(WSIZE*8-1):0] Di, // FO: 1
- output wire [(WSIZE*8-1):0] Do
-
-);
- wire [3:0] SEL;
- wire [4:0] A_buf;
- wire CLK_buf;
- wire [WSIZE-1:0] WE_buf;
- wire EN_buf;
-
- wire [(WSIZE*8-1):0] Do_pre;
- wire [(WSIZE*8-1):0] Di_buf;
-
- // Buffers
- // Di Buffers
- sky130_fd_sc_hd__clkbuf_16 DIBUF[(WSIZE*8-1):0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(Di_buf), .A(Di));
- // Control signals buffers
- sky130_fd_sc_hd__clkbuf_2 CLKBUF (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(CLK_buf), .A(CLK));
- sky130_fd_sc_hd__clkbuf_2 WEBUF[(WSIZE-1):0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(WE_buf), .A(WE));
- sky130_fd_sc_hd__clkbuf_2 ABUF[4:0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(A_buf), .A(A[4:0]));
- sky130_fd_sc_hd__clkbuf_2 ENBUF (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(EN_buf), .A(EN));
-
- DEC2x4 DEC (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .EN(EN_buf), .A(A_buf[4:3]), .SEL(SEL));
-
- generate
- genvar i;
- for (i=0; i< 4; i=i+1) begin : SLICE
- RAM8 #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM8 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .CLK(CLK_buf), .WE(WE_buf),.EN(SEL[i]), .Di(Di_buf), .Do(Do_pre), .A(A_buf[2:0]) );
- end
- endgenerate
-
- // Ensure that the Do_pre lines are not floating when EN = 0
- wire [WSIZE-1:0] lo;
- wire [WSIZE-1:0] float_buf_en;
- sky130_fd_sc_hd__clkbuf_2 FBUFENBUF[WSIZE-1:0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(float_buf_en), .A(EN) );
- sky130_fd_sc_hd__conb_1 TIE[WSIZE-1:0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .LO(lo), .HI());
-
- // Following split by group because each is done by one TIE CELL and ONE CLKINV_4
- // Provides default values for floating lines (lo)
- generate
- for (i=0; i< WSIZE; i=i+1) begin : BYTE
- sky130_fd_sc_hd__ebufn_2 FLOATBUF[(8*(i+1))-1:8*i] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .A( lo[i] ), .Z(Do_pre[(8*(i+1))-1:8*i]), .TE_B(float_buf_en[i]) );
- end
- endgenerate
-
- sky130_fd_sc_hd__dfxtp_1 Do_FF[WSIZE*8-1:0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .D(Do_pre), .Q(Do), .CLK(CLK) );
-
-endmodule
-
-
-/*
- 4 x RAM32 Blocks
-*/
-
-module RAM128 #(parameter USE_LATCH=`DFFRAM_USE_LATCH,
- WSIZE=`DFFRAM_WSIZE )
-(
-`ifdef USE_POWER_PINS
- input wire VPWR,
- input wire VGND,
-`endif
- input wire CLK, // FO: 1
- input wire [WSIZE-1:0] WE, // FO: 1
- input EN, // FO: 1
- input wire [6:0] A, // FO: 1
- input wire [(WSIZE*8-1):0] Di, // FO: 1
- output wire [(WSIZE*8-1):0] Do
-
-);
-
- wire CLK_buf;
- wire [WSIZE-1:0] WE_buf;
- wire EN_buf;
- wire [6:0] A_buf;
- wire [(WSIZE*8-1):0] Di_buf;
- wire [3:0] SEL;
-
- wire [(WSIZE*8-1):0] Do_pre[3:0];
-
- // Buffers
- sky130_fd_sc_hd__clkbuf_16 DIBUF[(WSIZE*8-1):0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(Di_buf), .A(Di));
- sky130_fd_sc_hd__clkbuf_4 CLKBUF (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(CLK_buf), .A(CLK));
- sky130_fd_sc_hd__clkbuf_2 WEBUF[WSIZE-1:0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(WE_buf), .A(WE));
- sky130_fd_sc_hd__clkbuf_2 ENBUF (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(EN_buf), .A(EN));
- sky130_fd_sc_hd__clkbuf_2 ABUF[6:0] (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .X(A_buf), .A(A));
-
- DEC2x4 DEC (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .EN(EN_buf), .A(A_buf[6:5]), .SEL(SEL));
-
- generate
- genvar i;
- for (i=0; i< 4; i=i+1) begin : BLOCK
- RAM32 #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM32 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .CLK(CLK_buf), .EN(SEL[i]), .WE(WE_buf), .Di(Di_buf), .Do(Do_pre[i]), .A(A_buf[4:0]) );
- end
- endgenerate
-
- // Output MUX
- MUX4x1 #(.WIDTH(WSIZE*8)) DoMUX (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .A0(Do_pre[0]), .A1(Do_pre[1]), .A2(Do_pre[2]), .A3(Do_pre[3]), .S(A_buf[6:5]), .X(Do) );
-
-endmodule
-
-module RAM256 #(parameter USE_LATCH=`DFFRAM_USE_LATCH,
- WSIZE=`DFFRAM_WSIZE )
-(
-`ifdef USE_POWER_PINS
- input wire VPWR,
- input wire VGND,
-`endif
- input wire CLK, // FO: 2
- input wire [WSIZE-1:0] WE, // FO: 2
- input EN, // FO: 2
- input wire [7:0] A, // FO: 5
- input wire [(WSIZE*8-1):0] Di, // FO: 2
- output wire [(WSIZE*8-1):0] Do
-
-);
-
- wire [1:0] SEL;
- wire [(WSIZE*8-1):0] Do_pre[1:0];
-
- // 1x2 DEC
- sky130_fd_sc_hd__inv_2 DEC (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .Y(SEL[0]), .A(A[7]));
- assign SEL[1] = A[7];
-
- generate
- genvar i;
- for (i=0; i< 2; i=i+1) begin : BLOCK
- RAM128 #(.USE_LATCH(USE_LATCH), .WSIZE(WSIZE)) RAM128 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .CLK(CLK), .EN(SEL[i]), .WE(WE), .Di(Di), .Do(Do_pre[i]), .A(A[6:0]) );
- end
- endgenerate
-
- // Output MUX
- MUX2x1 #(.WIDTH(WSIZE*8)) DoMUX (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .A0(Do_pre[0]), .A1(Do_pre[1]), .S(A[7]), .X(Do) );
-
-endmodule
diff --git a/caravel/rtl/README b/caravel/rtl/README
deleted file mode 100644
index 8bcafd1..0000000
--- a/caravel/rtl/README
+++ /dev/null
@@ -1,223 +0,0 @@
-<!---
-# SPDX-FileCopyrightText: 2020 Efabless Corporation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# SPDX-License-Identifier: Apache-2.0
--->
-
-A quick documentation of the Caravel memory map and operation
----------------------------------------------------------------
-
-Caravel pinout:
----------------
-
- vddio 3.3V supply for all I/O and ESD
- vssio Ground for all I/O and ESD
- vdda 3.3V supply for management area
- vssa Ground for management area
- vccd 1.8V supply for management area
- vssd Digital ground for management area
-
- vdda1 3.3V supply for user area 1
- vdda2 3.3V supply for user area 2
- vssa1 Ground for user area 1
- vssa2 Ground for user area 2
- vccd1 1.8 supply for user area 1
- vccd2 1.8 supply for user area 2
- vssd1 Digital ground for user area 1
- vssd2 Digital ground for user area 2
-
- clock Master clock input
- gpio 1 bit, mainly used for external LDO control of user power supply
- mprj_io 32 bits general purpose programmable digital or analog I/O
- resetb Master reset (sense inverted) input
- flash_csb SPI flash controller chip select (sense inverted)
- flash_clk SPI flash controller clock
- flash_io0 SPI flash controller data out
- flash_io1 SPI flash controller data in
-
-Special-use pins for the management SoC:
-----------------------------------------
-
- On power-up, the "mprj_io" GPIO are under complete control of the managment
- SoC. The first 8 user GPIO are special-purpose pads with dedicated functions
- for the management SoC:
-
- mprj_io[0] JTAG I/O
- mprj_io[1] SDO, housekeeping SPI
- mprj_io[2] SDI, housekeeping SPI
- mprj_io[3] CSB, housekeeping SPI
- mprj_io[4] SCK, housekeeping SPI
- mprj_io[5] Rx, UART
- mprj_io[6] Tx, UART
- mprj_io[7] IRQ
-
- The next 4 user GPIO are designed to be used with an SPI flash controller in
- the user space. They allow the four pins to be overridden by the housekeeping
- SPI to access the SPI flash in pass-through mode.
-
- mprj_io[8] user flash CSB
- mprj_io[9] user flash SCK
- mprj_io[10] user flash IO0
- mprj_io[11] user flash IO1
-
- The last 2 GPIO pins can be used by the management SoC to drive the SPI flash
- io2 and io3 pins for quad and DDR access, although they are set as inputs by
- default and whenever the SPI flash is not in quad mode:
-
- mprj_io[36] SPI flash io2
- mprj_io[37] SPI flash io3
-
- The user may additionally use any available GPIO for the SPI flash IO2 and IO3
- lines; the pass-through mode only uses the basic 4-pin SPI mode.
-
- All of the special-use pins are configured through a memory-mapped region. But
- to avoid a large number of wires in the user space to reach all of the GPIO
- pad controls, each user GPIO pad has a corresponding local control block. The
- control block holds the configuration data for the corresponding pad. This
- configuration data is a mirror of the data in the memory-mapped region, and is
- loaded by a "transfer" bit in another memory-mapped register. In addition to
- all of the static control bits for the GPIO, each block contains a single bit
- that specifies whether that pad is under the control of the user or the management
- area. All pins are configured from the management area. However, the configuration
- of static control bits leaves three dynamic signals: input, output, and output
- enable. One set of these three signals is available to the user when the pad is
- under user control. The other set of these three signals is available to the
- management SoC. Again, to reduce wiring, only the two pads for JTAG and the
- housekeeping SDO have all three pins under control of the SoC; the remaining
- pads have a single wire to the management SoC which is either an input wire
- or an output wire, depending on how the control signals for the pad are set.
-
- This setup gives a simplified view of the pad to the user: For digital
- applications, the user can treat the pad as a simple bidirectional digital
- pad with an output enable to switch between output and input functions.
- The user can set the output enable line high or low for a static input or
- output function. The user will also have access to the ESD-protected
- pad connections for analog signals, and can connect to the VDDA domain
- input digital signal if needed.
-
-Memory map:
------------
-
- The Caravel memory map is as follows:
-
- SRAM: 0000 0000
-
- Flash: Config: 1000 0000
-
- UART: Clock divider: 2000 0000
- Data: 2000 0004
- Enable 2000 0008
-
- GPIO: Data: 2100 0000
- Output enable: 2100 0004
- Pullup 2100 0008
- Pulldown 2100 000c
-
- Counter 1: Config: 2200 0000
- Value: 2200 0004
- Data: 2200 0008
-
- Counter 2: Config: 2300 0000
- Value: 2300 0004
- Data: 2300 0008
-
- SPI master: Config: 2400 0000
- Data: 2400 0004
-
- Logic analyzer: Data 0: 2500 0000
- Data 1: 2500 0004
- Data 2: 2500 0008
- Data 3: 2500 000c
- Enable 0: 2500 0010
- Enable 1: 2500 0014
- Enable 2: 2500 0018
- Enable 3: 2500 001c
-
- Project ctrl: Data (L): 2600 0000
- Data (H): 2600 0004
- Transfer: 2600 0008
- I/O Config: 2600 000c
- to 2600 009c
- Power Config: 2600 00a0
- to 2600 0130
-
- Flash ctrl: Config: 2D00 0000
-
- System: PLL out: 2F00 0000
- Trap out: 2F00 0004
- IRQ7 source: 2F00 0008
-
- User area base: 3000 0000
-
- Crossbar: QSPI control 8000 0000
- Storage area 9000 0000
- Any slave 1 a000 0000
- Any slave 2 b000 0000
-
-Project I/O Control:
----------------------
-
- Configuration bits per I/O (13 bits for each GPIO pad):
- Global Default
- Bits 12-10: digital mode (3 bits) 001
- Bit 9: voltage trip point select 0
- Bit 8: slow slew select 0
- Bit 7: analog bus polarity 0
- Bit 6: analog bus select 0
- Bit 5: analog bus enable 0
- Bit 4: IB mode select 0
- Bit 3: input disable 0
- Bit 2: holdover value 0
- Bit 1: output disable 1
- Bit 0: management control enable 1
-
-Default I/O modes:
-------------------
- mprj_io[0] JTAG I/O 110 0 0 0 0 0 0 0 0 0 1
- mprj_io[1] SDO, housekeeping SPI 110 0 0 0 0 0 0 0 0 0 1
- all others: 001 0 0 0 0 0 0 0 0 1 1
-
-
- Standard GPIO output configuration:
- mprj_io[6] Tx, UART 110 0 0 0 0 0 0 1 0 0 1
-
- Standard GPIO input configuration:
- mprj_io[*] 001 0 0 0 0 0 0 0 0 1 1
-
- Standard GPIO input configuration with pullup:
- mprj_io[*] 010 0 0 0 0 0 0 0 0 1 1
-
- Standard GPIO input configuration with pulldown:
- mprj_io[*] 011 0 0 0 0 0 0 0 0 1 1
-
- Specifically:
- JTAG and SDO are set to output. The output enable configure bit
- is a don't-care, since the output enable line is directly controlled
- by the module (JTAG or housekeeping SPI, respectively).
-
- All other I/O are set as input mode only, with output disabled.
-
- Tx is set to input like the others; before enabling the UART
- from a program in flash, the I/O must be set to an output configuration.
-
- Note that the standard input configurations with pull-up and pull-down
- require that "out" be set 1 or 0, respectively; since the I/O are
- designed with minimal wiring, there is only one wire for input and
- output, so the wire is used for input in these cases, and special
- signal handling is done locally to set the value of "out" equal to
- ~dm[0]. This is a (minor) restriction on the available I/O modes.
-
- Other possible modes are open-drain (for I2C), weak drive strength
- output (5k up + down), and analog mode (digital disabled)
diff --git a/caravel/rtl/__uprj_analog_netlists.v b/caravel/rtl/__uprj_analog_netlists.v
deleted file mode 100644
index 918b3c4..0000000
--- a/caravel/rtl/__uprj_analog_netlists.v
+++ /dev/null
@@ -1,35 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-/*--------------------------------------------------------------*/
-/* caravel, a project harness for the Google/SkyWater sky130 */
-/* fabrication process and open source PDK */
-/* */
-/* Copyright 2020 efabless, Inc. */
-/* Written by Tim Edwards, December 2019 */
-/* and Mohamed Shalan, August 2020 */
-/* This file is open source hardware released under the */
-/* Apache 2.0 license. See file LICENSE. */
-/* */
-/*--------------------------------------------------------------*/
-
-`define USE_POWER_PINS
-
-`include "defines.v"
-
-`ifdef GL
- `include "gl/__user_analog_project_wrapper.v"
-`else
- `include "__user_analog_project_wrapper.v"
-`endif
diff --git a/caravel/rtl/__uprj_netlists.v b/caravel/rtl/__uprj_netlists.v
deleted file mode 100644
index 673a32a..0000000
--- a/caravel/rtl/__uprj_netlists.v
+++ /dev/null
@@ -1,35 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-/*--------------------------------------------------------------*/
-/* caravel, a project harness for the Google/SkyWater sky130 */
-/* fabrication process and open source PDK */
-/* */
-/* Copyright 2020 efabless, Inc. */
-/* Written by Tim Edwards, December 2019 */
-/* and Mohamed Shalan, August 2020 */
-/* This file is open source hardware released under the */
-/* Apache 2.0 license. See file LICENSE. */
-/* */
-/*--------------------------------------------------------------*/
-
-`define USE_POWER_PINS
-
-`include "defines.v"
-
-`ifdef GL
- `include "gl/__user_project_wrapper.v"
-`else
- `include "__user_project_wrapper.v"
-`endif
\ No newline at end of file
diff --git a/caravel/rtl/__user_analog_project_wrapper.v b/caravel/rtl/__user_analog_project_wrapper.v
deleted file mode 100644
index 6360f0b..0000000
--- a/caravel/rtl/__user_analog_project_wrapper.v
+++ /dev/null
@@ -1,124 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-/*
- *-------------------------------------------------------------
- *
- * user_analog_project_wrapper
- *
- * This wrapper enumerates all of the pins available to the
- * user for the user analog project.
- *
- *-------------------------------------------------------------
- */
-
-module user_analog_project_wrapper (
-`ifdef USE_POWER_PINS
- inout vdda1, // User area 1 3.3V supply
- inout vdda2, // User area 2 3.3V supply
- inout vssa1, // User area 1 analog ground
- inout vssa2, // User area 2 analog ground
- inout vccd1, // User area 1 1.8V supply
- inout vccd2, // User area 2 1.8v supply
- inout vssd1, // User area 1 digital ground
- inout vssd2, // User area 2 digital ground
-`endif
-
- // Wishbone Slave ports (WB MI A)
- input wb_clk_i,
- input wb_rst_i,
- input wbs_stb_i,
- input wbs_cyc_i,
- input wbs_we_i,
- input [3:0] wbs_sel_i,
- input [31:0] wbs_dat_i,
- input [31:0] wbs_adr_i,
- output wbs_ack_o,
- output [31:0] wbs_dat_o,
-
- // Logic Analyzer Signals
- input [127:0] la_data_in,
- output [127:0] la_data_out,
- input [127:0] la_oenb,
-
- /* GPIOs. There are 27 GPIOs, on either side of the analog.
- * These have the following mapping to the GPIO padframe pins
- * and memory-mapped registers, since the numbering remains the
- * same as caravel but skips over the analog I/O:
- *
- * io_in/out/oeb/in_3v3 [26:14] <---> mprj_io[37:25]
- * io_in/out/oeb/in_3v3 [13:0] <---> mprj_io[13:0]
- *
- * When the GPIOs are configured by the Management SoC for
- * user use, they have three basic bidirectional controls:
- * in, out, and oeb (output enable, sense inverted). For
- * analog projects, a 3.3V copy of the signal input is
- * available. out and oeb must be 1.8V signals.
- */
-
- input [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] io_in,
- input [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] io_in_3v3,
- output [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] io_out,
- output [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] io_oeb,
-
- /* Analog (direct connection to GPIO pad---not for high voltage or
- * high frequency use). The management SoC must turn off both
- * input and output buffers on these GPIOs to allow analog access.
- * These signals may drive a voltage up to the value of VDDIO
- * (3.3V typical, 5.5V maximum).
- *
- * Note that analog I/O is not available on the 7 lowest-numbered
- * GPIO pads, and so the analog_io indexing is offset from the
- * GPIO indexing by 7, as follows:
- *
- * gpio_analog/noesd [17:7] <---> mprj_io[35:25]
- * gpio_analog/noesd [6:0] <---> mprj_io[13:7]
- *
- */
-
- inout [`MPRJ_IO_PADS-`ANALOG_PADS-10:0] gpio_analog,
- inout [`MPRJ_IO_PADS-`ANALOG_PADS-10:0] gpio_noesd,
-
- /* Analog signals, direct through to pad. These have no ESD at all,
- * so ESD protection is the responsibility of the designer.
- *
- * user_analog[10:0] <---> mprj_io[24:14]
- *
- */
- inout [`ANALOG_PADS-1:0] io_analog,
-
- /* Additional power supply ESD clamps, one per analog pad. The
- * high side should be connected to a 3.3-5.5V power supply.
- * The low side should be connected to ground.
- *
- * clamp_high[2:0] <---> mprj_io[20:18]
- * clamp_low[2:0] <---> mprj_io[20:18]
- *
- */
- inout [2:0] io_clamp_high,
- inout [2:0] io_clamp_low,
-
- // Independent clock (on independent integer divider)
- input user_clock2,
-
- // User maskable interrupt signals
- output [2:0] user_irq
-);
-
-// Dummy assignment so that we can take it through the openlane flow
-assign io_out = io_in;
-
-endmodule // user_analog_project_wrapper
diff --git a/caravel/rtl/__user_project_wrapper.v b/caravel/rtl/__user_project_wrapper.v
deleted file mode 100644
index 98ff3a8..0000000
--- a/caravel/rtl/__user_project_wrapper.v
+++ /dev/null
@@ -1,90 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-/*
- *-------------------------------------------------------------
- *
- * user_project_wrapper
- *
- * This wrapper enumerates all of the pins available to the
- * user for the user project.
- *
- * An example user project is provided in this wrapper. The
- * example should be removed and replaced with the actual
- * user project.
- *
- *-------------------------------------------------------------
- */
-
-module user_project_wrapper #(
- parameter BITS = 32
-)(
-`ifdef USE_POWER_PINS
- inout vdda1, // User area 1 3.3V supply
- inout vdda2, // User area 2 3.3V supply
- inout vssa1, // User area 1 analog ground
- inout vssa2, // User area 2 analog ground
- inout vccd1, // User area 1 1.8V supply
- inout vccd2, // User area 2 1.8v supply
- inout vssd1, // User area 1 digital ground
- inout vssd2, // User area 2 digital ground
-`endif
-
- // Wishbone Slave ports (WB MI A)
- input wb_clk_i,
- input wb_rst_i,
- input wbs_stb_i,
- input wbs_cyc_i,
- input wbs_we_i,
- input [3:0] wbs_sel_i,
- input [31:0] wbs_dat_i,
- input [31:0] wbs_adr_i,
- output wbs_ack_o,
- output [31:0] wbs_dat_o,
-
- // Logic Analyzer Signals
- input [127:0] la_data_in,
- output [127:0] la_data_out,
- input [127:0] la_oenb,
-
- // IOs
- input [`MPRJ_IO_PADS-1:0] io_in,
- output [`MPRJ_IO_PADS-1:0] io_out,
- output [`MPRJ_IO_PADS-1:0] io_oeb,
-
- // Analog (direct connection to GPIO pad---use with caution)
- // Note that analog I/O is not available on the 7 lowest-numbered
- // GPIO pads, and so the analog_io indexing is offset from the
- // GPIO indexing by 7 (also upper 2 GPIOs do not have analog_io).
- inout [`MPRJ_IO_PADS-10:0] analog_io,
-
- // Independent clock (on independent integer divider)
- input user_clock2,
-
- // User maskable interrupt signals
- output [2:0] user_irq
-);
-
-// Dummy assignments so that we can take it through the openlane flow
-`ifdef SIM
-// Needed for running GL simulation
-assign io_out = 0;
-assign io_oeb = 0;
-`else
-assign io_out = io_in;
-`endif
-
-endmodule // user_project_wrapper
diff --git a/caravel/rtl/caravan.v b/caravel/rtl/caravan.v
deleted file mode 100644
index 73c87f1..0000000
--- a/caravel/rtl/caravan.v
+++ /dev/null
@@ -1,874 +0,0 @@
-// `default_nettype none
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-/*--------------------------------------------------------------*/
-/* caravan, a project harness for the Google/SkyWater sky130 */
-/* fabrication process and open source PDK. caravan is an */
-/* alternative architecture to caravel that has simple straight */
-/* through connections replacing the GPIO pads on the top side */
-/* of the padframe. A total of 11 pads are converted from GPIO */
-/* to analog, leaving 27 GPIO. */
-/* */
-/* Copyright 2021 efabless, Inc. */
-/* Written by Tim Edwards, December 2019 */
-/* and Mohamed Shalan, August 2020 */
-/* This file is open source hardware released under the */
-/* Apache 2.0 license. See file LICENSE. */
-/* */
-/*--------------------------------------------------------------*/
-
-/*--------------------------------------------------------------*/
-/* Derived types for the array bounds on the two digital and */
-/* two analog pad arrays. As defined above, the sections have */
-/* the number of pads as follows: */
-/* */
-/* DIG2 : 13 GPIO pads */
-/* ANA2 : 6 analog pads */
-/* ANA1 : 5 analog pads */
-/* DIG1 : 14 GPIO pads */
-/* */
-/* This makes a total of 38 pads = `MPRJ_IO_PADS */
-/* The pads are still designated as mprj_io[37:0] around the */
-/* padframe. The SoC core remains the same, so the programming */
-/* of the digital signals remains the same, but the values for */
-/* GPIO 15-25 are not used. */
-/*--------------------------------------------------------------*/
-
-`define DIG2_TOP (`MPRJ_IO_PADS - 1)
-`define DIG2_BOT (`MPRJ_IO_PADS_1 + `ANALOG_PADS_2)
-`define ANA2_TOP (`MPRJ_IO_PADS_1 + `ANALOG_PADS_2 - 1)
-`define ANA2_BOT (`MPRJ_IO_PADS_1)
-`define ANA1_TOP (`MPRJ_IO_PADS_1 - 1)
-`define ANA1_BOT (`MPRJ_IO_PADS_1 - `ANALOG_PADS_1)
-`define DIG1_TOP (`MPRJ_IO_PADS_1 - `ANALOG_PADS_1 - 1)
-`define DIG1_BOT (0)
-
-`define MPRJ_DIG_PADS (`MPRJ_IO_PADS - `ANALOG_PADS)
-
-/*--------------------------------------------------------------*/
-/*--------------------------------------------------------------*/
-
-module caravan (
- inout vddio, // Common 3.3V padframe/ESD power
- inout vddio_2, // Common 3.3V padframe/ESD power
- inout vssio, // Common padframe/ESD ground
- inout vssio_2, // Common padframe/ESD ground
- inout vdda, // Management 3.3V power
- inout vssa, // Common analog ground
- inout vccd, // Management/Common 1.8V power
- inout vssd, // Common digital ground
- inout vdda1, // User area 1 3.3V power
- inout vdda1_2, // User area 1 3.3V power
- inout vdda2, // User area 2 3.3V power
- inout vssa1, // User area 1 analog ground
- inout vssa1_2, // User area 1 analog ground
- inout vssa2, // User area 2 analog ground
- inout vccd1, // User area 1 1.8V power
- inout vccd2, // User area 2 1.8V power
- inout vssd1, // User area 1 digital ground
- inout vssd2, // User area 2 digital ground
-
- inout gpio, // Used for external LDO control
- inout [`MPRJ_IO_PADS-1:0] mprj_io,
- output [`MPRJ_PWR_PADS-1:0] pwr_ctrl_out,
- input clock, // CMOS core clock input, not a crystal
- input resetb,
-
- // Note that only two pins are available on the flash so dual and
- // quad flash modes are not available.
-
- output flash_csb,
- output flash_clk,
- output flash_io0,
- output flash_io1
-);
-
- //------------------------------------------------------------
- // This value is uniquely defined for each user project.
- //------------------------------------------------------------
- parameter USER_PROJECT_ID = 32'h00000000;
-
- // These pins are overlaid on mprj_io space. They have the function
- // below when the management processor is in reset, or in the default
- // configuration. They are assigned to uses in the user space by the
- // configuration program running off of the SPI flash. Note that even
- // when the user has taken control of these pins, they can be restored
- // to the original use by setting the resetb pin low. The SPI pins and
- // UART pins can be connected directly to an FTDI chip as long as the
- // FTDI chip sets these lines to high impedence (input function) at
- // all times except when holding the chip in reset.
-
- // JTAG = mprj_io[0] (inout)
- // SDO = mprj_io[1] (output)
- // SDI = mprj_io[2] (input)
- // CSB = mprj_io[3] (input)
- // SCK = mprj_io[4] (input)
- // ser_rx = mprj_io[5] (input)
- // ser_tx = mprj_io[6] (output)
- // irq = mprj_io[7] (input)
-
- // These pins are reserved for any project that wants to incorporate
- // its own processor and flash controller. While a user project can
- // technically use any available I/O pins for the purpose, these
- // four pins connect to a pass-through mode from the SPI slave (pins
- // 1-4 above) so that any SPI flash connected to these specific pins
- // can be accessed through the SPI slave even when the processor is in
- // reset.
-
- // user_flash_csb = mprj_io[8]
- // user_flash_sck = mprj_io[9]
- // user_flash_io0 = mprj_io[10]
- // user_flash_io1 = mprj_io[11]
-
- // One-bit GPIO dedicated to management SoC (outside of user control)
- wire gpio_out_core;
- wire gpio_in_core;
- wire gpio_mode0_core;
- wire gpio_mode1_core;
- wire gpio_outenb_core;
- wire gpio_inenb_core;
-
- // 27 GPIO pads with full controls
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] mprj_io_inp_dis;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] mprj_io_oeb;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] mprj_io_ib_mode_sel;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] mprj_io_vtrip_sel;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] mprj_io_slow_sel;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] mprj_io_holdover;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] mprj_io_analog_en;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] mprj_io_analog_sel;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] mprj_io_analog_pol;
- wire [(`MPRJ_IO_PADS-`ANALOG_PADS)*3-1:0] mprj_io_dm;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] mprj_io_in;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] mprj_io_in_3v3;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] mprj_io_out;
-
- // User Project Control (user-facing)
- // 27 GPIO bidirectional with in/out/oeb and a 3.3V copy of the input
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] user_io_oeb;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] user_io_in;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] user_io_out;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] user_io_in_3v3;
-
- // 18 direct connections to GPIO for low-frequency, low-voltage analog
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-10:0] user_gpio_analog;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-10:0] user_gpio_noesd;
-
- // 3 power supply ESD clamps for user applications
- wire [2:0] user_clamp_high;
- wire [2:0] user_clamp_low;
-
- // 11 core connections to the analog pads
- wire [`ANALOG_PADS-1:0] user_analog;
-
- /* Padframe control signals */
- wire [`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1:0] gpio_serial_link_1;
- wire [`MPRJ_IO_PADS_2-`ANALOG_PADS_2-1:0] gpio_serial_link_2;
- wire mprj_io_loader_resetn;
- wire mprj_io_loader_clock;
- wire mprj_io_loader_data_1; /* user1 side serial loader */
- wire mprj_io_loader_data_2; /* user2 side serial loader */
-
- // User Project Control management I/O
- // There are two types of GPIO connections:
- // (1) Full Bidirectional: Management connects to in, out, and oeb
- // Uses: JTAG and SDO
- // (2) Selectable bidirectional: Management connects to in and out,
- // which are tied together. oeb is grounded (oeb from the
- // configuration is used)
-
- // SDI = mprj_io[2] (input)
- // CSB = mprj_io[3] (input)
- // SCK = mprj_io[4] (input)
- // ser_rx = mprj_io[5] (input)
- // ser_tx = mprj_io[6] (output)
- // irq = mprj_io[7] (input)
-
- wire [`MPRJ_IO_PADS-1:0] mgmt_io_in;
- wire jtag_out, sdo_out;
- wire jtag_outenb, sdo_outenb;
- wire gpio_flash_io2_out, gpio_flash_io3_out;
-
- wire [1:0] mgmt_io_nc; /* no-connects */
-
- wire clock_core;
-
- // Power-on-reset signal. The reset pad generates the sense-inverted
- // reset at 3.3V. The 1.8V signal and the inverted 1.8V signal are
- // derived.
-
- wire porb_h;
- wire porb_l;
- wire por_l;
-
- wire rstb_h;
- wire rstb_l;
-
- wire flash_clk_core, flash_csb_core;
- wire flash_clk_oeb_core, flash_csb_oeb_core;
- wire flash_clk_ieb_core, flash_csb_ieb_core;
- wire flash_io0_oeb_core, flash_io1_oeb_core;
- wire flash_io2_oeb_core, flash_io3_oeb_core;
- wire flash_io0_ieb_core, flash_io1_ieb_core;
- wire flash_io0_do_core, flash_io1_do_core;
- wire flash_io0_di_core, flash_io1_di_core;
-
- chip_io_alt #(
- .ANALOG_PADS_1(`ANALOG_PADS_1),
- .ANALOG_PADS_2(`ANALOG_PADS_2)
- ) padframe (
- `ifndef TOP_ROUTING
- // Package Pins
- .vddio_pad (vddio), // Common padframe/ESD supply
- .vddio_pad2 (vddio_2),
- .vssio_pad (vssio), // Common padframe/ESD ground
- .vssio_pad2 (vssio_2),
- .vccd_pad (vccd), // Common 1.8V supply
- .vssd_pad (vssd), // Common digital ground
- .vdda_pad (vdda), // Management analog 3.3V supply
- .vssa_pad (vssa), // Management analog ground
- .vdda1_pad (vdda1), // User area 1 3.3V supply
- .vdda1_pad2 (vdda1_2),
- .vdda2_pad (vdda2), // User area 2 3.3V supply
- .vssa1_pad (vssa1), // User area 1 analog ground
- .vssa1_pad2 (vssa1_2),
- .vssa2_pad (vssa2), // User area 2 analog ground
- .vccd1_pad (vccd1), // User area 1 1.8V supply
- .vccd2_pad (vccd2), // User area 2 1.8V supply
- .vssd1_pad (vssd1), // User area 1 digital ground
- .vssd2_pad (vssd2), // User area 2 digital ground
- `endif
-
- // Core Side Pins
- .vddio (vddio_core),
- .vssio (vssio_core),
- .vdda (vdda_core),
- .vssa (vssa_core),
- .vccd (vccd_core),
- .vssd (vssd_core),
- .vdda1 (vdda1_core),
- .vdda2 (vdda2_core),
- .vssa1 (vssa1_core),
- .vssa2 (vssa2_core),
- .vccd1 (vccd1_core),
- .vccd2 (vccd2_core),
- .vssd1 (vssd1_core),
- .vssd2 (vssd2_core),
-
- .gpio(gpio),
- .mprj_io(mprj_io),
- .clock(clock),
- .resetb(resetb),
- .flash_csb(flash_csb),
- .flash_clk(flash_clk),
- .flash_io0(flash_io0),
- .flash_io1(flash_io1),
- // SoC Core Interface
- .porb_h(porb_h),
- .por(por_l),
- .resetb_core_h(rstb_h),
- .clock_core(clock_core),
- .gpio_out_core(gpio_out_core),
- .gpio_in_core(gpio_in_core),
- .gpio_mode0_core(gpio_mode0_core),
- .gpio_mode1_core(gpio_mode1_core),
- .gpio_outenb_core(gpio_outenb_core),
- .gpio_inenb_core(gpio_inenb_core),
- .flash_csb_core(flash_csb_core),
- .flash_clk_core(flash_clk_core),
- .flash_csb_oeb_core(flash_csb_oeb_core),
- .flash_clk_oeb_core(flash_clk_oeb_core),
- .flash_io0_oeb_core(flash_io0_oeb_core),
- .flash_io1_oeb_core(flash_io1_oeb_core),
- .flash_csb_ieb_core(flash_csb_ieb_core),
- .flash_clk_ieb_core(flash_clk_ieb_core),
- .flash_io0_ieb_core(flash_io0_ieb_core),
- .flash_io1_ieb_core(flash_io1_ieb_core),
- .flash_io0_do_core(flash_io0_do_core),
- .flash_io1_do_core(flash_io1_do_core),
- .flash_io0_di_core(flash_io0_di_core),
- .flash_io1_di_core(flash_io1_di_core),
- .mprj_io_in(mprj_io_in),
- .mprj_io_in_3v3(mprj_io_in_3v3),
- .mprj_io_out(mprj_io_out),
- .mprj_io_oeb(mprj_io_oeb),
- .mprj_io_inp_dis(mprj_io_inp_dis),
- .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
- .mprj_io_vtrip_sel(mprj_io_vtrip_sel),
- .mprj_io_slow_sel(mprj_io_slow_sel),
- .mprj_io_holdover(mprj_io_holdover),
- .mprj_io_analog_en(mprj_io_analog_en),
- .mprj_io_analog_sel(mprj_io_analog_sel),
- .mprj_io_analog_pol(mprj_io_analog_pol),
- .mprj_io_dm(mprj_io_dm),
- .mprj_gpio_analog(user_gpio_analog),
- .mprj_gpio_noesd(user_gpio_noesd),
- .mprj_analog(user_analog),
- .mprj_clamp_high(user_clamp_high),
- .mprj_clamp_low(user_clamp_low)
- );
-
- // SoC core
- wire caravel_clk;
- wire caravel_clk2;
- wire caravel_rstn;
-
- wire [7:0] spi_ro_config_core;
-
- // LA signals
- wire [127:0] la_data_in_user; // From CPU to MPRJ
- wire [127:0] la_data_in_mprj; // From MPRJ to CPU
- wire [127:0] la_data_out_mprj; // From CPU to MPRJ
- wire [127:0] la_data_out_user; // From MPRJ to CPU
- wire [127:0] la_oenb_user; // From CPU to MPRJ
- wire [127:0] la_oenb_mprj; // From CPU to MPRJ
- wire [127:0] la_iena_mprj; // From CPU only
-
- wire [2:0] user_irq; // From MPRJ to CPU
- wire [2:0] user_irq_core;
- wire [2:0] user_irq_ena;
-
- // WB MI A (User Project)
- wire mprj_cyc_o_core;
- wire mprj_stb_o_core;
- wire mprj_we_o_core;
- wire [3:0] mprj_sel_o_core;
- wire [31:0] mprj_adr_o_core;
- wire [31:0] mprj_dat_o_core;
- wire mprj_ack_i_core;
- wire [31:0] mprj_dat_i_core;
-
- // Mask revision
- wire [31:0] mask_rev;
-
- wire mprj_clock;
- wire mprj_clock2;
- wire mprj_reset;
- wire mprj_cyc_o_user;
- wire mprj_stb_o_user;
- wire mprj_we_o_user;
- wire [3:0] mprj_sel_o_user;
- wire [31:0] mprj_adr_o_user;
- wire [31:0] mprj_dat_o_user;
- wire mprj_vcc_pwrgood;
- wire mprj2_vcc_pwrgood;
- wire mprj_vdd_pwrgood;
- wire mprj2_vdd_pwrgood;
-
- // Storage area
- // Management R/W interface
- wire [`RAM_BLOCKS-1:0] mgmt_ena;
- wire [`RAM_BLOCKS-1:0] mgmt_wen;
- wire [(`RAM_BLOCKS*4)-1:0] mgmt_wen_mask;
- wire [7:0] mgmt_addr;
- wire [31:0] mgmt_wdata;
- wire [(`RAM_BLOCKS*32)-1:0] mgmt_rdata;
- // Management RO interface
- wire mgmt_ena_ro;
- wire [7:0] mgmt_addr_ro;
- wire [31:0] mgmt_rdata_ro;
-
- mgmt_core soc (
- `ifdef USE_POWER_PINS
- .VPWR(vccd_core),
- .VGND(vssd_core),
- `endif
- // GPIO (1 pin)
- .gpio_out_pad(gpio_out_core),
- .gpio_in_pad(gpio_in_core),
- .gpio_mode0_pad(gpio_mode0_core),
- .gpio_mode1_pad(gpio_mode1_core),
- .gpio_outenb_pad(gpio_outenb_core),
- .gpio_inenb_pad(gpio_inenb_core),
- // Primary SPI flash controller
- .flash_csb(flash_csb_core),
- .flash_clk(flash_clk_core),
- .flash_csb_oeb(flash_csb_oeb_core),
- .flash_clk_oeb(flash_clk_oeb_core),
- .flash_io0_oeb(flash_io0_oeb_core),
- .flash_io1_oeb(flash_io1_oeb_core),
- .flash_csb_ieb(flash_csb_ieb_core),
- .flash_clk_ieb(flash_clk_ieb_core),
- .flash_io0_ieb(flash_io0_ieb_core),
- .flash_io1_ieb(flash_io1_ieb_core),
- .flash_io0_do(flash_io0_do_core),
- .flash_io1_do(flash_io1_do_core),
- .flash_io0_di(flash_io0_di_core),
- .flash_io1_di(flash_io1_di_core),
- // Master Reset
- .resetb(rstb_l),
- .porb(porb_l),
- // Clocks and reset
- .clock(clock_core),
- .core_clk(caravel_clk),
- .user_clk(caravel_clk2),
- .core_rstn(caravel_rstn),
- // IRQ
- .user_irq(user_irq),
- .user_irq_ena(user_irq_ena),
- // Logic Analyzer
- .la_input(la_data_in_mprj),
- .la_output(la_data_out_mprj),
- .la_oenb(la_oenb_mprj),
- .la_iena(la_iena_mprj),
- // User Project IO Control
- .mprj_vcc_pwrgood(mprj_vcc_pwrgood),
- .mprj2_vcc_pwrgood(mprj2_vcc_pwrgood),
- .mprj_vdd_pwrgood(mprj_vdd_pwrgood),
- .mprj2_vdd_pwrgood(mprj2_vdd_pwrgood),
- .mprj_io_loader_resetn(mprj_io_loader_resetn),
- .mprj_io_loader_clock(mprj_io_loader_clock),
- .mprj_io_loader_data_1(mprj_io_loader_data_1),
- .mprj_io_loader_data_2(mprj_io_loader_data_2),
- .mgmt_in_data(mgmt_io_in),
- .mgmt_out_data({gpio_flash_io3_out, gpio_flash_io2_out,
- mgmt_io_in[(`MPRJ_IO_PADS-3):2],
- mgmt_io_nc}),
- .pwr_ctrl_out(pwr_ctrl_out),
- .sdo_out(sdo_out),
- .sdo_outenb(sdo_outenb),
- .jtag_out(jtag_out),
- .jtag_outenb(jtag_outenb),
- .flash_io2_oeb(flash_io2_oeb_core),
- .flash_io3_oeb(flash_io3_oeb_core),
- // User Project Slave ports (WB MI A)
- .mprj_cyc_o(mprj_cyc_o_core),
- .mprj_stb_o(mprj_stb_o_core),
- .mprj_we_o(mprj_we_o_core),
- .mprj_sel_o(mprj_sel_o_core),
- .mprj_adr_o(mprj_adr_o_core),
- .mprj_dat_o(mprj_dat_o_core),
- .mprj_ack_i(mprj_ack_i_core),
- .mprj_dat_i(mprj_dat_i_core),
- // mask data
- .mask_rev(mask_rev),
- // MGMT area R/W interface
- .mgmt_ena(mgmt_ena),
- .mgmt_wen_mask(mgmt_wen_mask),
- .mgmt_wen(mgmt_wen),
- .mgmt_addr(mgmt_addr),
- .mgmt_wdata(mgmt_wdata),
- .mgmt_rdata(mgmt_rdata),
- // MGMT area RO interface
- .mgmt_ena_ro(mgmt_ena_ro),
- .mgmt_addr_ro(mgmt_addr_ro),
- .mgmt_rdata_ro(mgmt_rdata_ro)
- );
-
- /* Clock and reset to user space are passed through a tristate */
- /* buffer like the above, but since they are intended to be */
- /* always active, connect the enable to the logic-1 output from */
- /* the vccd1 domain. */
-
- mgmt_protect mgmt_buffers (
- `ifdef USE_POWER_PINS
- .vccd(vccd_core),
- .vssd(vssd_core),
- .vccd1(vccd1_core),
- .vssd1(vssd1_core),
- .vccd2(vccd2_core),
- .vssd2(vssd2_core),
- .vdda1(vdda1_core),
- .vssa1(vssa1_core),
- .vdda2(vdda2_core),
- .vssa2(vssa2_core),
- `endif
-
- .caravel_clk(caravel_clk),
- .caravel_clk2(caravel_clk2),
- .caravel_rstn(caravel_rstn),
- .mprj_cyc_o_core(mprj_cyc_o_core),
- .mprj_stb_o_core(mprj_stb_o_core),
- .mprj_we_o_core(mprj_we_o_core),
- .mprj_sel_o_core(mprj_sel_o_core),
- .mprj_adr_o_core(mprj_adr_o_core),
- .mprj_dat_o_core(mprj_dat_o_core),
- .user_irq_core(user_irq_core),
- .la_data_out_core(la_data_out_user),
- .la_data_out_mprj(la_data_out_mprj),
- .la_data_in_core(la_data_in_user),
- .la_data_in_mprj(la_data_in_mprj),
- .la_oenb_mprj(la_oenb_mprj),
- .la_oenb_core(la_oenb_user),
- .la_iena_mprj(la_iena_mprj),
- .user_irq_ena(user_irq_ena),
-
- .user_clock(mprj_clock),
- .user_clock2(mprj_clock2),
- .user_reset(mprj_reset),
- .mprj_cyc_o_user(mprj_cyc_o_user),
- .mprj_stb_o_user(mprj_stb_o_user),
- .mprj_we_o_user(mprj_we_o_user),
- .mprj_sel_o_user(mprj_sel_o_user),
- .mprj_adr_o_user(mprj_adr_o_user),
- .mprj_dat_o_user(mprj_dat_o_user),
- .user_irq(user_irq),
- .user1_vcc_powergood(mprj_vcc_pwrgood),
- .user2_vcc_powergood(mprj2_vcc_pwrgood),
- .user1_vdd_powergood(mprj_vdd_pwrgood),
- .user2_vdd_powergood(mprj2_vdd_pwrgood)
- );
-
-
- /*----------------------------------------------*/
- /* Wrapper module around the user project */
- /*----------------------------------------------*/
-
- assign user_io_in_3v3 = mprj_io_in_3v3;
-
- user_analog_project_wrapper mprj (
- `ifdef USE_POWER_PINS
- .vdda1(vdda1_core), // User area 1 3.3V power
- .vdda2(vdda2_core), // User area 2 3.3V power
- .vssa1(vssa1_core), // User area 1 analog ground
- .vssa2(vssa2_core), // User area 2 analog ground
- .vccd1(vccd1_core), // User area 1 1.8V power
- .vccd2(vccd2_core), // User area 2 1.8V power
- .vssd1(vssd1_core), // User area 1 digital ground
- .vssd2(vssd2_core), // User area 2 digital ground
- `endif
-
- .wb_clk_i(mprj_clock),
- .wb_rst_i(mprj_reset),
- // MGMT SoC Wishbone Slave
- .wbs_cyc_i(mprj_cyc_o_user),
- .wbs_stb_i(mprj_stb_o_user),
- .wbs_we_i(mprj_we_o_user),
- .wbs_sel_i(mprj_sel_o_user),
- .wbs_adr_i(mprj_adr_o_user),
- .wbs_dat_i(mprj_dat_o_user),
- .wbs_ack_o(mprj_ack_i_core),
- .wbs_dat_o(mprj_dat_i_core),
- // Logic Analyzer
- .la_data_in(la_data_in_user),
- .la_data_out(la_data_out_user),
- .la_oenb(la_oenb_user),
- // IO Pads
- .io_in (user_io_in),
- .io_in_3v3 (user_io_in_3v3),
- .io_out(user_io_out),
- .io_oeb(user_io_oeb),
- .gpio_analog(user_gpio_analog),
- .gpio_noesd(user_gpio_noesd),
- .io_clamp_high(user_clamp_high),
- .io_clamp_low(user_clamp_low),
- .io_analog(user_analog),
- // Independent clock
- .user_clock2(mprj_clock2),
- // IRQ
- .user_irq(user_irq_core)
- );
-
- /*--------------------------------------*/
- /* End user project instantiation */
- /*--------------------------------------*/
-
- wire [`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1:0] gpio_serial_link_1_shifted;
- wire [`MPRJ_IO_PADS_2-`ANALOG_PADS_2-1:0] gpio_serial_link_2_shifted;
-
- assign gpio_serial_link_1_shifted = {gpio_serial_link_1[`MPRJ_IO_PADS_1-`ANALOG_PADS_1-2:0],
- mprj_io_loader_data_1};
- // Note that serial_link_2 is backwards compared to serial_link_1, so it
- // shifts in the other direction.
- assign gpio_serial_link_2_shifted = {mprj_io_loader_data_2,
- gpio_serial_link_2[`MPRJ_IO_PADS_2-`ANALOG_PADS_2-1:1]};
-
- // Propagating clock and reset to mitigate timing and fanout issues
- wire [`MPRJ_IO_PADS_1-1:0] gpio_clock_1;
- wire [`MPRJ_IO_PADS_2-1:0] gpio_clock_2;
- wire [`MPRJ_IO_PADS_1-1:0] gpio_resetn_1;
- wire [`MPRJ_IO_PADS_2-1:0] gpio_resetn_2;
- wire [`MPRJ_IO_PADS_1-6:0] gpio_clock_1_shifted;
- wire [`MPRJ_IO_PADS_2-7:0] gpio_clock_2_shifted;
- wire [`MPRJ_IO_PADS_1-6:0] gpio_resetn_1_shifted;
- wire [`MPRJ_IO_PADS_2-7:0] gpio_resetn_2_shifted;
-
- assign gpio_clock_1_shifted = {gpio_clock_1[`MPRJ_IO_PADS_1-`ANALOG_PADS_1-2:0],
- mprj_io_loader_clock};
- assign gpio_clock_2_shifted = {mprj_io_loader_clock,
- gpio_clock_2[`MPRJ_IO_PADS_2-`ANALOG_PADS_2-1:1]};
- assign gpio_resetn_1_shifted = {gpio_resetn_1[`MPRJ_IO_PADS_1-`ANALOG_PADS_1-2:0],
- mprj_io_loader_resetn};
- assign gpio_resetn_2_shifted = {mprj_io_loader_resetn,
- gpio_resetn_2[`MPRJ_IO_PADS_2-`ANALOG_PADS_2-1:1]};
-
- // Each control block sits next to an I/O pad in the user area.
- // It gets input through a serial chain from the previous control
- // block and passes it to the next control block. Due to the nature
- // of the shift register, bits are presented in reverse, as the first
- // bit in ends up as the last bit of the last I/O pad control block.
-
- // There are two types of block; the first two and the last two
- // are configured to be full bidirectional under control of the
- // management Soc (JTAG and SDO for the first two; flash_io2 and
- // flash_io3 for the last two). The rest are configured to be default
- // (input). Note that the first two and last two are the ones closest
- // to the management SoC on either side, which minimizes the wire length
- // of the extra signals those pads need.
-
- /* First two GPIOs (JTAG and SDO) */
- gpio_control_block #(
- .DM_INIT(`DM_INIT), // Mode = output, strong up/down
- .OENB_INIT(`OENB_INIT) // Enable output signaling from wire
- ) gpio_control_bidir_1 [1:0] (
- `ifdef USE_POWER_PINS
- .vccd(vccd_core),
- .vssd(vssd_core),
- .vccd1(vccd1_core),
- .vssd1(vssd1_core),
- `endif
-
- // Management Soc-facing signals
-
- .resetn(gpio_resetn_1_shifted[1:0]),
- .serial_clock(gpio_clock_1_shifted[1:0]),
-
- .resetn_out(gpio_resetn_1[1:0]),
- .serial_clock_out(gpio_clock_1[1:0]),
-
- .mgmt_gpio_in(mgmt_io_in[1:0]),
- .mgmt_gpio_out({sdo_out, jtag_out}),
- .mgmt_gpio_oeb({sdo_outenb, jtag_outenb}),
-
- .one(),
- .zero(),
-
- // Serial data chain for pad configuration
- .serial_data_in(gpio_serial_link_1_shifted[1:0]),
- .serial_data_out(gpio_serial_link_1[1:0]),
-
- // User-facing signals
- .user_gpio_out(user_io_out[1:0]),
- .user_gpio_oeb(user_io_oeb[1:0]),
- .user_gpio_in(user_io_in[1:0]),
-
- // Pad-facing signals (Pad GPIOv2)
- .pad_gpio_inenb(mprj_io_inp_dis[1:0]),
- .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[1:0]),
- .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[1:0]),
- .pad_gpio_slow_sel(mprj_io_slow_sel[1:0]),
- .pad_gpio_holdover(mprj_io_holdover[1:0]),
- .pad_gpio_ana_en(mprj_io_analog_en[1:0]),
- .pad_gpio_ana_sel(mprj_io_analog_sel[1:0]),
- .pad_gpio_ana_pol(mprj_io_analog_pol[1:0]),
- .pad_gpio_dm(mprj_io_dm[5:0]),
- .pad_gpio_outenb(mprj_io_oeb[1:0]),
- .pad_gpio_out(mprj_io_out[1:0]),
- .pad_gpio_in(mprj_io_in[1:0])
- );
-
- /* Section 1 GPIOs (GPIO 0 to 18) */
- wire [`MPRJ_IO_PADS_1-`ANALOG_PADS_1-3:0] one_loop1;
- gpio_control_block gpio_control_in_1 [`MPRJ_IO_PADS_1-`ANALOG_PADS_1-3:0] (
- `ifdef USE_POWER_PINS
- .vccd(vccd_core),
- .vssd(vssd_core),
- .vccd1(vccd1_core),
- .vssd1(vssd1_core),
- `endif
-
- // Management Soc-facing signals
-
- .resetn(gpio_resetn_1_shifted[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .serial_clock(gpio_clock_1_shifted[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
-
- .resetn_out(gpio_resetn_1[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .serial_clock_out(gpio_clock_1[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
-
- .mgmt_gpio_in(mgmt_io_in[`DIG1_TOP:2]),
- .mgmt_gpio_out(mgmt_io_in[`DIG1_TOP:2]),
- .mgmt_gpio_oeb(one_loop1),
-
- .one(one_loop1),
- .zero(),
-
- // Serial data chain for pad configuration
- .serial_data_in(gpio_serial_link_1_shifted[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .serial_data_out(gpio_serial_link_1[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
-
- // User-facing signals
- .user_gpio_out(user_io_out[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .user_gpio_in(user_io_in[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
-
- // Pad-facing signals (Pad GPIOv2)
- .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)*3-1:6]),
- .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2]),
- .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS_1-`ANALOG_PADS_1-1):2])
- );
-
- /* Last two GPIOs (flash_io2 and flash_io3) */
- gpio_control_block #(
- .DM_INIT(`DM_INIT), // Mode = output, strong up/down
- .OENB_INIT(`OENB_INIT) // Enable output signaling from wire
- ) gpio_control_bidir_2 [1:0] (
- `ifdef USE_POWER_PINS
- .vccd(vccd_core),
- .vssd(vssd_core),
- .vccd1(vccd1_core),
- .vssd1(vssd1_core),
- `endif
-
- // Management Soc-facing signals
-
- .resetn(gpio_resetn_1_shifted[(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-1):(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-2)]),
- .serial_clock(gpio_clock_1_shifted[(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-1):(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-2)]),
-
- .resetn_out(gpio_resetn_1[(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-1):(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-2)]),
- .serial_clock_out(gpio_clock_1[(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-1):(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-2)]),
-
- .mgmt_gpio_in(mgmt_io_in[(`DIG2_TOP):(`DIG2_TOP-1)]),
- .mgmt_gpio_out({gpio_flash_io3_out, gpio_flash_io2_out}),
- .mgmt_gpio_oeb({flash_io3_oeb_core, flash_io2_oeb_core}),
-
- .one(),
- .zero(),
-
- // Serial data chain for pad configuration
- .serial_data_in(gpio_serial_link_2_shifted[(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-1):(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-2)]),
- .serial_data_out(gpio_serial_link_2[(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-1):(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-2)]),
-
- // User-facing signals
- .user_gpio_out(user_io_out[(`MPRJ_DIG_PADS-1):(`MPRJ_DIG_PADS-2)]),
- .user_gpio_oeb(user_io_oeb[(`MPRJ_DIG_PADS-1):(`MPRJ_DIG_PADS-2)]),
- .user_gpio_in(user_io_in[(`MPRJ_DIG_PADS-1):(`MPRJ_DIG_PADS-2)]),
-
- // Pad-facing signals (Pad GPIOv2)
- .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_DIG_PADS-1):(`MPRJ_DIG_PADS-2)]),
- .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_DIG_PADS-1):(`MPRJ_DIG_PADS-2)]),
- .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_DIG_PADS-1):(`MPRJ_DIG_PADS-2)]),
- .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_DIG_PADS-1):(`MPRJ_DIG_PADS-2)]),
- .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_DIG_PADS-1):(`MPRJ_DIG_PADS-2)]),
- .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_DIG_PADS-1):(`MPRJ_DIG_PADS-2)]),
- .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_DIG_PADS-1):(`MPRJ_DIG_PADS-2)]),
- .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_DIG_PADS-1):(`MPRJ_DIG_PADS-2)]),
- .pad_gpio_dm(mprj_io_dm[(`MPRJ_DIG_PADS*3-1):(`MPRJ_DIG_PADS*3-6)]),
- .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_DIG_PADS-1):(`MPRJ_DIG_PADS-2)]),
- .pad_gpio_out(mprj_io_out[(`MPRJ_DIG_PADS-1):(`MPRJ_DIG_PADS-2)]),
- .pad_gpio_in(mprj_io_in[(`MPRJ_DIG_PADS-1):(`MPRJ_DIG_PADS-2)])
- );
-
- /* Section 2 GPIOs (GPIO 19 to 37) */
- wire [`MPRJ_IO_PADS_2-`ANALOG_PADS_2-3:0] one_loop2;
- gpio_control_block gpio_control_in_2 [`MPRJ_IO_PADS_2-`ANALOG_PADS_2-3:0] (
- `ifdef USE_POWER_PINS
- .vccd(vccd_core),
- .vssd(vssd_core),
- .vccd1(vccd1_core),
- .vssd1(vssd1_core),
- `endif
-
- // Management Soc-facing signals
-
- .resetn(gpio_resetn_1_shifted[(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-3):0]),
- .serial_clock(gpio_clock_1_shifted[(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-3):0]),
-
- .resetn_out(gpio_resetn_1[(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-3):0]),
- .serial_clock_out(gpio_clock_1[(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-3):0]),
-
- .mgmt_gpio_in(mgmt_io_in[(`DIG2_TOP-2):`DIG2_BOT]),
- .mgmt_gpio_out(mgmt_io_in[(`DIG2_TOP-2):`DIG2_BOT]),
- .mgmt_gpio_oeb(one_loop2),
-
- .one(one_loop2),
- .zero(),
-
- // Serial data chain for pad configuration
- .serial_data_in(gpio_serial_link_2_shifted[(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-3):0]),
- .serial_data_out(gpio_serial_link_2[(`MPRJ_IO_PADS_2-`ANALOG_PADS_2-3):0]),
-
- // User-facing signals
- .user_gpio_out(user_io_out[(`MPRJ_DIG_PADS-3):(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)]),
- .user_gpio_oeb(user_io_oeb[(`MPRJ_DIG_PADS-3):(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)]),
- .user_gpio_in(user_io_in[(`MPRJ_DIG_PADS-3):(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)]),
-
- // Pad-facing signals (Pad GPIOv2)
- .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_DIG_PADS-3):(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)]),
- .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_DIG_PADS-3):(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)]),
- .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_DIG_PADS-3):(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)]),
- .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_DIG_PADS-3):(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)]),
- .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_DIG_PADS-3):(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)]),
- .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_DIG_PADS-3):(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)]),
- .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_DIG_PADS-3):(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)]),
- .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_DIG_PADS-3):(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)]),
- .pad_gpio_dm(mprj_io_dm[((`MPRJ_DIG_PADS)*3-7):((`MPRJ_IO_PADS_1-`ANALOG_PADS_1)*3)]),
- .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_DIG_PADS-3):(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)]),
- .pad_gpio_out(mprj_io_out[(`MPRJ_DIG_PADS-3):(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)]),
- .pad_gpio_in(mprj_io_in[(`MPRJ_DIG_PADS-3):(`MPRJ_IO_PADS_1-`ANALOG_PADS_1)])
- );
-
- user_id_programming #(
- .USER_PROJECT_ID(USER_PROJECT_ID)
- ) user_id_value (
- `ifdef USE_POWER_PINS
- .VPWR(vccd_core),
- .VGND(vssd_core),
- `endif
- .mask_rev(mask_rev)
- );
-
- // Power-on-reset circuit
- simple_por por (
- `ifdef USE_POWER_PINS
- .vdd3v3(vddio_core),
- .vdd1v8(vccd_core),
- .vss(vssio_core),
- `endif
- .porb_h(porb_h),
- .porb_l(porb_l),
- .por_l(por_l)
- );
-
- // XRES (chip input pin reset) reset level converter
- sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped rstb_level (
- `ifdef USE_POWER_PINS
- .VPWR(vddio_core),
- .LVPWR(vccd_core),
- .VGND(vssio_core),
- `endif
- .A(rstb_h),
- .X(rstb_l)
- );
-
- // Storage area
- storage storage(
- `ifdef USE_POWER_PINS
- .VPWR(vccd_core),
- .VGND(vssd_core),
- `endif
- .mgmt_clk(caravel_clk),
- .mgmt_ena(mgmt_ena),
- .mgmt_wen(mgmt_wen),
- .mgmt_wen_mask(mgmt_wen_mask),
- .mgmt_addr(mgmt_addr),
- .mgmt_wdata(mgmt_wdata),
- .mgmt_rdata(mgmt_rdata),
- // Management RO interface
- .mgmt_ena_ro(mgmt_ena_ro),
- .mgmt_addr_ro(mgmt_addr_ro),
- .mgmt_rdata_ro(mgmt_rdata_ro)
- );
-
-endmodule
-// `default_nettype wire
diff --git a/caravel/rtl/caravan_netlists.v b/caravel/rtl/caravan_netlists.v
deleted file mode 100644
index 60ff673..0000000
--- a/caravel/rtl/caravan_netlists.v
+++ /dev/null
@@ -1,93 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`timescale 1 ns / 1 ps
-
-`define UNIT_DELAY #1
-`define USE_POWER_PINS
-
-`ifdef SIM
-
-`include "defines.v"
-`include "pads.v"
-
-/* NOTE: Need to pass the PDK root directory to iverilog with option -I */
-`ifdef EF_STYLE // efabless style pdk installation; mainly for open galaxy users
- `include "libs.ref/verilog/sky130_fd_io/sky130_fd_io.v"
- `include "libs.ref/verilog/sky130_fd_io/sky130_ef_io.v"
- `include "libs.ref/verilog/sky130_fd_io/sky130_ef_io__gpiov2_pad_wrapped.v"
- `include "libs.ref/verilog/sky130_fd_io/sky130_ef_io__analog_pad.v"
-
- `include "libs.ref/verilog/sky130_fd_sc_hd/primitives.v"
- `include "libs.ref/verilog/sky130_fd_sc_hd/sky130_fd_sc_hd.v"
- `include "libs.ref/verilog/sky130_fd_sc_hvl/primitives.v"
- `include "libs.ref/verilog/sky130_fd_sc_hvl/sky130_fd_sc_hvl.v"
-`else
- `include "libs.ref/sky130_fd_io/verilog/sky130_fd_io.v"
- `include "libs.ref/sky130_fd_io/verilog/sky130_ef_io.v"
- `include "libs.ref/sky130_fd_io/verilog/sky130_ef_io__gpiov2_pad_wrapped.v"
- `include "libs.ref/sky130_fd_io/verilog/sky130_ef_io__analog_pad.v"
-
- `include "libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
- `include "libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
- `include "libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
- `include "libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
-`endif
-
-`ifdef GL
- // Assume default net type to be wire because GL netlists don't have the wire definitions
- `default_nettype wire
- `include "gl/mgmt_core.v"
- `include "gl/digital_pll.v"
- `include "gl/DFFRAM.v"
- `include "gl/storage.v"
- `include "gl/user_id_programming.v"
- `include "gl/chip_io_alt.v"
- `include "gl/mprj_logic_high.v"
- `include "gl/mprj2_logic_high.v"
- `include "gl/mgmt_protect.v"
- `include "gl/mgmt_protect_hv.v"
- `include "gl/gpio_logic_high.v"
- `include "gl/gpio_control_block.v"
- `include "gl/sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped.v"
- `include "gl/caravan.v"
-`else
- `include "mgmt_soc.v"
- `include "housekeeping_spi.v"
- `include "caravel_clocking.v"
- `include "mgmt_core.v"
- `include "digital_pll.v"
- `include "DFFRAM.v"
- `include "DFFRAMBB.v"
- `include "storage.v"
- `include "user_id_programming.v"
- `include "clock_div.v"
- `include "storage_bridge_wb.v"
- `include "mprj_io.v"
- `include "chip_io_alt.v"
- `include "mprj_logic_high.v"
- `include "mprj2_logic_high.v"
- `include "mgmt_protect.v"
- `include "mgmt_protect_hv.v"
- `include "gpio_control_block.v"
- `include "gpio_logic_high.v"
- `include "sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped.v"
- `include "caravan.v"
-`endif
-
-`include "simple_por.v"
-`include "sram_1rw1r_32_256_8_sky130.v"
-
-`endif
diff --git a/caravel/rtl/caravel.v b/caravel/rtl/caravel.v
deleted file mode 100644
index eb8ad2d..0000000
--- a/caravel/rtl/caravel.v
+++ /dev/null
@@ -1,818 +0,0 @@
-// `default_nettype none
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-/*--------------------------------------------------------------*/
-/* caravel, a project harness for the Google/SkyWater sky130 */
-/* fabrication process and open source PDK */
-/* */
-/* Copyright 2020 efabless, Inc. */
-/* Written by Tim Edwards, December 2019 */
-/* and Mohamed Shalan, August 2020 */
-/* This file is open source hardware released under the */
-/* Apache 2.0 license. See file LICENSE. */
-/* */
-/*--------------------------------------------------------------*/
-
-module caravel (
- inout vddio, // Common 3.3V padframe/ESD power
- inout vddio_2, // Common 3.3V padframe/ESD power
- inout vssio, // Common padframe/ESD ground
- inout vssio_2, // Common padframe/ESD ground
- inout vdda, // Management 3.3V power
- inout vssa, // Common analog ground
- inout vccd, // Management/Common 1.8V power
- inout vssd, // Common digital ground
- inout vdda1, // User area 1 3.3V power
- inout vdda1_2, // User area 1 3.3V power
- inout vdda2, // User area 2 3.3V power
- inout vssa1, // User area 1 analog ground
- inout vssa1_2, // User area 1 analog ground
- inout vssa2, // User area 2 analog ground
- inout vccd1, // User area 1 1.8V power
- inout vccd2, // User area 2 1.8V power
- inout vssd1, // User area 1 digital ground
- inout vssd2, // User area 2 digital ground
-
- inout gpio, // Used for external LDO control
- inout [`MPRJ_IO_PADS-1:0] mprj_io,
- output [`MPRJ_PWR_PADS-1:0] pwr_ctrl_out,
- input clock, // CMOS core clock input, not a crystal
- input resetb,
-
- // Note that only two pins are available on the flash so dual and
- // quad flash modes are not available.
-
- output flash_csb,
- output flash_clk,
- output flash_io0,
- output flash_io1
-);
-
- //------------------------------------------------------------
- // This value is uniquely defined for each user project.
- //------------------------------------------------------------
- parameter USER_PROJECT_ID = 32'h00000000;
-
- // These pins are overlaid on mprj_io space. They have the function
- // below when the management processor is in reset, or in the default
- // configuration. They are assigned to uses in the user space by the
- // configuration program running off of the SPI flash. Note that even
- // when the user has taken control of these pins, they can be restored
- // to the original use by setting the resetb pin low. The SPI pins and
- // UART pins can be connected directly to an FTDI chip as long as the
- // FTDI chip sets these lines to high impedence (input function) at
- // all times except when holding the chip in reset.
-
- // JTAG = mprj_io[0] (inout)
- // SDO = mprj_io[1] (output)
- // SDI = mprj_io[2] (input)
- // CSB = mprj_io[3] (input)
- // SCK = mprj_io[4] (input)
- // ser_rx = mprj_io[5] (input)
- // ser_tx = mprj_io[6] (output)
- // irq = mprj_io[7] (input)
-
- // These pins are reserved for any project that wants to incorporate
- // its own processor and flash controller. While a user project can
- // technically use any available I/O pins for the purpose, these
- // four pins connect to a pass-through mode from the SPI slave (pins
- // 1-4 above) so that any SPI flash connected to these specific pins
- // can be accessed through the SPI slave even when the processor is in
- // reset.
-
- // user_flash_csb = mprj_io[8]
- // user_flash_sck = mprj_io[9]
- // user_flash_io0 = mprj_io[10]
- // user_flash_io1 = mprj_io[11]
-
- // One-bit GPIO dedicated to management SoC (outside of user control)
- wire gpio_out_core;
- wire gpio_in_core;
- wire gpio_mode0_core;
- wire gpio_mode1_core;
- wire gpio_outenb_core;
- wire gpio_inenb_core;
-
- // User Project Control (pad-facing)
- wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
- wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb;
- wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
- wire [`MPRJ_IO_PADS-1:0] mprj_io_vtrip_sel;
- wire [`MPRJ_IO_PADS-1:0] mprj_io_slow_sel;
- wire [`MPRJ_IO_PADS-1:0] mprj_io_holdover;
- wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
- wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
- wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
- wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
- wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
- wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
-
- // User Project Control (user-facing)
- wire [`MPRJ_IO_PADS-1:0] user_io_oeb;
- wire [`MPRJ_IO_PADS-1:0] user_io_in;
- wire [`MPRJ_IO_PADS-1:0] user_io_out;
- wire [`MPRJ_IO_PADS-10:0] user_analog_io;
-
- /* Padframe control signals */
- wire [`MPRJ_IO_PADS_1-1:0] gpio_serial_link_1;
- wire [`MPRJ_IO_PADS_2-1:0] gpio_serial_link_2;
- wire mprj_io_loader_resetn;
- wire mprj_io_loader_clock;
- wire mprj_io_loader_data_1; /* user1 side serial loader */
- wire mprj_io_loader_data_2; /* user2 side serial loader */
-
- // User Project Control management I/O
- // There are two types of GPIO connections:
- // (1) Full Bidirectional: Management connects to in, out, and oeb
- // Uses: JTAG and SDO
- // (2) Selectable bidirectional: Management connects to in and out,
- // which are tied together. oeb is grounded (oeb from the
- // configuration is used)
-
- // SDI = mprj_io[2] (input)
- // CSB = mprj_io[3] (input)
- // SCK = mprj_io[4] (input)
- // ser_rx = mprj_io[5] (input)
- // ser_tx = mprj_io[6] (output)
- // irq = mprj_io[7] (input)
-
- wire [`MPRJ_IO_PADS-1:0] mgmt_io_in;
- wire jtag_out, sdo_out;
- wire jtag_outenb, sdo_outenb;
- wire gpio_flash_io2_out, gpio_flash_io3_out;
-
- wire [1:0] mgmt_io_nc; /* no-connects */
-
- wire clock_core;
-
- // Power-on-reset signal. The reset pad generates the sense-inverted
- // reset at 3.3V. The 1.8V signal and the inverted 1.8V signal are
- // derived.
-
- wire porb_h;
- wire porb_l;
- wire por_l;
-
- wire rstb_h;
- wire rstb_l;
-
- wire flash_clk_core, flash_csb_core;
- wire flash_clk_oeb_core, flash_csb_oeb_core;
- wire flash_clk_ieb_core, flash_csb_ieb_core;
- wire flash_io0_oeb_core, flash_io1_oeb_core;
- wire flash_io2_oeb_core, flash_io3_oeb_core;
- wire flash_io0_ieb_core, flash_io1_ieb_core;
- wire flash_io0_do_core, flash_io1_do_core;
- wire flash_io0_di_core, flash_io1_di_core;
-
- chip_io padframe(
- `ifndef TOP_ROUTING
- // Package Pins
- .vddio_pad (vddio), // Common padframe/ESD supply
- .vddio_pad2 (vddio_2),
- .vssio_pad (vssio), // Common padframe/ESD ground
- .vssio_pad2 (vssio_2),
- .vccd_pad (vccd), // Common 1.8V supply
- .vssd_pad (vssd), // Common digital ground
- .vdda_pad (vdda), // Management analog 3.3V supply
- .vssa_pad (vssa), // Management analog ground
- .vdda1_pad (vdda1), // User area 1 3.3V supply
- .vdda1_pad2 (vdda1_2),
- .vdda2_pad (vdda2), // User area 2 3.3V supply
- .vssa1_pad (vssa1), // User area 1 analog ground
- .vssa1_pad2 (vssa1_2),
- .vssa2_pad (vssa2), // User area 2 analog ground
- .vccd1_pad (vccd1), // User area 1 1.8V supply
- .vccd2_pad (vccd2), // User area 2 1.8V supply
- .vssd1_pad (vssd1), // User area 1 digital ground
- .vssd2_pad (vssd2), // User area 2 digital ground
- `endif
- // Core Side Pins
- .vddio (vddio_core),
- .vssio (vssio_core),
- .vdda (vdda_core),
- .vssa (vssa_core),
- .vccd (vccd_core),
- .vssd (vssd_core),
- .vdda1 (vdda1_core),
- .vdda2 (vdda2_core),
- .vssa1 (vssa1_core),
- .vssa2 (vssa2_core),
- .vccd1 (vccd1_core),
- .vccd2 (vccd2_core),
- .vssd1 (vssd1_core),
- .vssd2 (vssd2_core),
-
- .gpio(gpio),
- .mprj_io(mprj_io),
- .clock(clock),
- .resetb(resetb),
- .flash_csb(flash_csb),
- .flash_clk(flash_clk),
- .flash_io0(flash_io0),
- .flash_io1(flash_io1),
- // SoC Core Interface
- .porb_h(porb_h),
- .por(por_l),
- .resetb_core_h(rstb_h),
- .clock_core(clock_core),
- .gpio_out_core(gpio_out_core),
- .gpio_in_core(gpio_in_core),
- .gpio_mode0_core(gpio_mode0_core),
- .gpio_mode1_core(gpio_mode1_core),
- .gpio_outenb_core(gpio_outenb_core),
- .gpio_inenb_core(gpio_inenb_core),
- .flash_csb_core(flash_csb_core),
- .flash_clk_core(flash_clk_core),
- .flash_csb_oeb_core(flash_csb_oeb_core),
- .flash_clk_oeb_core(flash_clk_oeb_core),
- .flash_io0_oeb_core(flash_io0_oeb_core),
- .flash_io1_oeb_core(flash_io1_oeb_core),
- .flash_csb_ieb_core(flash_csb_ieb_core),
- .flash_clk_ieb_core(flash_clk_ieb_core),
- .flash_io0_ieb_core(flash_io0_ieb_core),
- .flash_io1_ieb_core(flash_io1_ieb_core),
- .flash_io0_do_core(flash_io0_do_core),
- .flash_io1_do_core(flash_io1_do_core),
- .flash_io0_di_core(flash_io0_di_core),
- .flash_io1_di_core(flash_io1_di_core),
- .mprj_io_in(mprj_io_in),
- .mprj_io_out(mprj_io_out),
- .mprj_io_oeb(mprj_io_oeb),
- .mprj_io_inp_dis(mprj_io_inp_dis),
- .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
- .mprj_io_vtrip_sel(mprj_io_vtrip_sel),
- .mprj_io_slow_sel(mprj_io_slow_sel),
- .mprj_io_holdover(mprj_io_holdover),
- .mprj_io_analog_en(mprj_io_analog_en),
- .mprj_io_analog_sel(mprj_io_analog_sel),
- .mprj_io_analog_pol(mprj_io_analog_pol),
- .mprj_io_dm(mprj_io_dm),
- .mprj_analog_io(user_analog_io)
- );
-
- // SoC core
- wire caravel_clk;
- wire caravel_clk2;
- wire caravel_rstn;
-
- wire [7:0] spi_ro_config_core;
-
- // LA signals
- wire [127:0] la_data_in_user; // From CPU to MPRJ
- wire [127:0] la_data_in_mprj; // From MPRJ to CPU
- wire [127:0] la_data_out_mprj; // From CPU to MPRJ
- wire [127:0] la_data_out_user; // From MPRJ to CPU
- wire [127:0] la_oenb_user; // From CPU to MPRJ
- wire [127:0] la_oenb_mprj; // From CPU to MPRJ
- wire [127:0] la_iena_mprj; // From CPU only
- wire [2:0] user_irq; // From MRPJ to CPU
- wire [2:0] user_irq_core;
- wire [2:0] user_irq_ena;
-
- // WB MI A (User Project)
- wire mprj_cyc_o_core;
- wire mprj_stb_o_core;
- wire mprj_we_o_core;
- wire [3:0] mprj_sel_o_core;
- wire [31:0] mprj_adr_o_core;
- wire [31:0] mprj_dat_o_core;
- wire mprj_ack_i_core;
- wire [31:0] mprj_dat_i_core;
-
- // WB MI B (xbar)
- wire xbar_cyc_o_core;
- wire xbar_stb_o_core;
- wire xbar_we_o_core;
- wire [3:0] xbar_sel_o_core;
- wire [31:0] xbar_adr_o_core;
- wire [31:0] xbar_dat_o_core;
- wire xbar_ack_i_core;
- wire [31:0] xbar_dat_i_core;
-
- // Mask revision
- wire [31:0] mask_rev;
-
- wire mprj_clock;
- wire mprj_clock2;
- wire mprj_reset;
- wire mprj_cyc_o_user;
- wire mprj_stb_o_user;
- wire mprj_we_o_user;
- wire [3:0] mprj_sel_o_user;
- wire [31:0] mprj_adr_o_user;
- wire [31:0] mprj_dat_o_user;
- wire mprj_vcc_pwrgood;
- wire mprj2_vcc_pwrgood;
- wire mprj_vdd_pwrgood;
- wire mprj2_vdd_pwrgood;
-
- // Storage area
- // Management R/W interface
- wire [`RAM_BLOCKS-1:0] mgmt_ena;
- wire [`RAM_BLOCKS-1:0] mgmt_wen;
- wire [(`RAM_BLOCKS*4)-1:0] mgmt_wen_mask;
- wire [7:0] mgmt_addr;
- wire [31:0] mgmt_wdata;
- wire [(`RAM_BLOCKS*32)-1:0] mgmt_rdata;
- // Management RO interface
- wire mgmt_ena_ro;
- wire [7:0] mgmt_addr_ro;
- wire [31:0] mgmt_rdata_ro;
-
- mgmt_core soc (
- `ifdef USE_POWER_PINS
- .VPWR(vccd_core),
- .VGND(vssd_core),
- `endif
- // GPIO (1 pin)
- .gpio_out_pad(gpio_out_core),
- .gpio_in_pad(gpio_in_core),
- .gpio_mode0_pad(gpio_mode0_core),
- .gpio_mode1_pad(gpio_mode1_core),
- .gpio_outenb_pad(gpio_outenb_core),
- .gpio_inenb_pad(gpio_inenb_core),
- // Primary SPI flash controller
- .flash_csb(flash_csb_core),
- .flash_clk(flash_clk_core),
- .flash_csb_oeb(flash_csb_oeb_core),
- .flash_clk_oeb(flash_clk_oeb_core),
- .flash_io0_oeb(flash_io0_oeb_core),
- .flash_io1_oeb(flash_io1_oeb_core),
- .flash_csb_ieb(flash_csb_ieb_core),
- .flash_clk_ieb(flash_clk_ieb_core),
- .flash_io0_ieb(flash_io0_ieb_core),
- .flash_io1_ieb(flash_io1_ieb_core),
- .flash_io0_do(flash_io0_do_core),
- .flash_io1_do(flash_io1_do_core),
- .flash_io0_di(flash_io0_di_core),
- .flash_io1_di(flash_io1_di_core),
- // Master Reset
- .resetb(rstb_l),
- .porb(porb_l),
- // Clocks and reset
- .clock(clock_core),
- .core_clk(caravel_clk),
- .user_clk(caravel_clk2),
- .core_rstn(caravel_rstn),
- // IRQ
- .user_irq(user_irq),
- .user_irq_ena(user_irq_ena),
- // Logic Analyzer
- .la_input(la_data_in_mprj),
- .la_output(la_data_out_mprj),
- .la_oenb(la_oenb_mprj),
- .la_iena(la_iena_mprj),
- // User Project IO Control
- .mprj_vcc_pwrgood(mprj_vcc_pwrgood),
- .mprj2_vcc_pwrgood(mprj2_vcc_pwrgood),
- .mprj_vdd_pwrgood(mprj_vdd_pwrgood),
- .mprj2_vdd_pwrgood(mprj2_vdd_pwrgood),
- .mprj_io_loader_resetn(mprj_io_loader_resetn),
- .mprj_io_loader_clock(mprj_io_loader_clock),
- .mprj_io_loader_data_1(mprj_io_loader_data_1),
- .mprj_io_loader_data_2(mprj_io_loader_data_2),
- .mgmt_in_data(mgmt_io_in),
- .mgmt_out_data({gpio_flash_io3_out, gpio_flash_io2_out,
- mgmt_io_in[(`MPRJ_IO_PADS-3):2], mgmt_io_nc}),
- .pwr_ctrl_out(pwr_ctrl_out),
- .sdo_out(sdo_out),
- .sdo_outenb(sdo_outenb),
- .jtag_out(jtag_out),
- .jtag_outenb(jtag_outenb),
- .flash_io2_oeb(flash_io2_oeb_core),
- .flash_io3_oeb(flash_io3_oeb_core),
- // User Project Slave ports (WB MI A)
- .mprj_cyc_o(mprj_cyc_o_core),
- .mprj_stb_o(mprj_stb_o_core),
- .mprj_we_o(mprj_we_o_core),
- .mprj_sel_o(mprj_sel_o_core),
- .mprj_adr_o(mprj_adr_o_core),
- .mprj_dat_o(mprj_dat_o_core),
- .mprj_ack_i(mprj_ack_i_core),
- .mprj_dat_i(mprj_dat_i_core),
- // mask data
- .mask_rev(mask_rev),
- // MGMT area R/W interface
- .mgmt_ena(mgmt_ena),
- .mgmt_wen_mask(mgmt_wen_mask),
- .mgmt_wen(mgmt_wen),
- .mgmt_addr(mgmt_addr),
- .mgmt_wdata(mgmt_wdata),
- .mgmt_rdata(mgmt_rdata),
- // MGMT area RO interface
- .mgmt_ena_ro(mgmt_ena_ro),
- .mgmt_addr_ro(mgmt_addr_ro),
- .mgmt_rdata_ro(mgmt_rdata_ro)
- );
-
- /* Clock and reset to user space are passed through a tristate */
- /* buffer like the above, but since they are intended to be */
- /* always active, connect the enable to the logic-1 output from */
- /* the vccd1 domain. */
-
- mgmt_protect mgmt_buffers (
- `ifdef USE_POWER_PINS
- .vccd(vccd_core),
- .vssd(vssd_core),
- .vccd1(vccd1_core),
- .vssd1(vssd1_core),
- .vccd2(vccd2_core),
- .vssd2(vssd2_core),
- .vdda1(vdda1_core),
- .vssa1(vssa1_core),
- .vdda2(vdda2_core),
- .vssa2(vssa2_core),
- `endif
- .caravel_clk(caravel_clk),
- .caravel_clk2(caravel_clk2),
- .caravel_rstn(caravel_rstn),
- .mprj_cyc_o_core(mprj_cyc_o_core),
- .mprj_stb_o_core(mprj_stb_o_core),
- .mprj_we_o_core(mprj_we_o_core),
- .mprj_sel_o_core(mprj_sel_o_core),
- .mprj_adr_o_core(mprj_adr_o_core),
- .mprj_dat_o_core(mprj_dat_o_core),
- .user_irq_core(user_irq_core),
- .la_data_out_core(la_data_out_user),
- .la_data_out_mprj(la_data_out_mprj),
- .la_data_in_core(la_data_in_user),
- .la_data_in_mprj(la_data_in_mprj),
- .la_oenb_mprj(la_oenb_mprj),
- .la_oenb_core(la_oenb_user),
- .la_iena_mprj(la_iena_mprj),
- .user_irq_ena(user_irq_ena),
-
- .user_clock(mprj_clock),
- .user_clock2(mprj_clock2),
- .user_reset(mprj_reset),
- .mprj_cyc_o_user(mprj_cyc_o_user),
- .mprj_stb_o_user(mprj_stb_o_user),
- .mprj_we_o_user(mprj_we_o_user),
- .mprj_sel_o_user(mprj_sel_o_user),
- .mprj_adr_o_user(mprj_adr_o_user),
- .mprj_dat_o_user(mprj_dat_o_user),
- .user_irq(user_irq),
- .user1_vcc_powergood(mprj_vcc_pwrgood),
- .user2_vcc_powergood(mprj2_vcc_pwrgood),
- .user1_vdd_powergood(mprj_vdd_pwrgood),
- .user2_vdd_powergood(mprj2_vdd_pwrgood)
- );
-
-
- /*----------------------------------------------*/
- /* Wrapper module around the user project */
- /*----------------------------------------------*/
-
- user_project_wrapper mprj (
- `ifdef USE_POWER_PINS
- .vdda1(vdda1_core), // User area 1 3.3V power
- .vdda2(vdda2_core), // User area 2 3.3V power
- .vssa1(vssa1_core), // User area 1 analog ground
- .vssa2(vssa2_core), // User area 2 analog ground
- .vccd1(vccd1_core), // User area 1 1.8V power
- .vccd2(vccd2_core), // User area 2 1.8V power
- .vssd1(vssd1_core), // User area 1 digital ground
- .vssd2(vssd2_core), // User area 2 digital ground
- `endif
-
- .wb_clk_i(mprj_clock),
- .wb_rst_i(mprj_reset),
- // MGMT SoC Wishbone Slave
- .wbs_cyc_i(mprj_cyc_o_user),
- .wbs_stb_i(mprj_stb_o_user),
- .wbs_we_i(mprj_we_o_user),
- .wbs_sel_i(mprj_sel_o_user),
- .wbs_adr_i(mprj_adr_o_user),
- .wbs_dat_i(mprj_dat_o_user),
- .wbs_ack_o(mprj_ack_i_core),
- .wbs_dat_o(mprj_dat_i_core),
- // Logic Analyzer
- .la_data_in(la_data_in_user),
- .la_data_out(la_data_out_user),
- .la_oenb(la_oenb_user),
- // IO Pads
- .io_in (user_io_in),
- .io_out(user_io_out),
- .io_oeb(user_io_oeb),
- .analog_io(user_analog_io),
- // Independent clock
- .user_clock2(mprj_clock2),
- // IRQ
- .user_irq(user_irq_core)
- );
-
- /*--------------------------------------*/
- /* End user project instantiation */
- /*--------------------------------------*/
-
- wire [`MPRJ_IO_PADS_1-1:0] gpio_serial_link_1_shifted;
- wire [`MPRJ_IO_PADS_2-1:0] gpio_serial_link_2_shifted;
-
- assign gpio_serial_link_1_shifted = {gpio_serial_link_1[`MPRJ_IO_PADS_1-2:0],
- mprj_io_loader_data_1};
- // Note that serial_link_2 is backwards compared to serial_link_1, so it
- // shifts in the other direction.
- assign gpio_serial_link_2_shifted = {mprj_io_loader_data_2,
- gpio_serial_link_2[`MPRJ_IO_PADS_2-1:1]};
-
- // Propagating clock and reset to mitigate timing and fanout issues
- wire [`MPRJ_IO_PADS_1-1:0] gpio_clock_1;
- wire [`MPRJ_IO_PADS_2-1:0] gpio_clock_2;
- wire [`MPRJ_IO_PADS_1-1:0] gpio_resetn_1;
- wire [`MPRJ_IO_PADS_2-1:0] gpio_resetn_2;
- wire [`MPRJ_IO_PADS_1-1:0] gpio_clock_1_shifted;
- wire [`MPRJ_IO_PADS_2-1:0] gpio_clock_2_shifted;
- wire [`MPRJ_IO_PADS_1-1:0] gpio_resetn_1_shifted;
- wire [`MPRJ_IO_PADS_2-1:0] gpio_resetn_2_shifted;
-
- assign gpio_clock_1_shifted = {gpio_clock_1[`MPRJ_IO_PADS_1-2:0],
- mprj_io_loader_clock};
- assign gpio_clock_2_shifted = {mprj_io_loader_clock,
- gpio_clock_2[`MPRJ_IO_PADS_2-1:1]};
- assign gpio_resetn_1_shifted = {gpio_resetn_1[`MPRJ_IO_PADS_1-2:0],
- mprj_io_loader_resetn};
- assign gpio_resetn_2_shifted = {mprj_io_loader_resetn,
- gpio_resetn_2[`MPRJ_IO_PADS_2-1:1]};
-
- // Each control block sits next to an I/O pad in the user area.
- // It gets input through a serial chain from the previous control
- // block and passes it to the next control block. Due to the nature
- // of the shift register, bits are presented in reverse, as the first
- // bit in ends up as the last bit of the last I/O pad control block.
-
- // There are two types of block; the first two and the last two
- // are configured to be full bidirectional under control of the
- // management Soc (JTAG and SDO for the first two; flash_io2 and
- // flash_io3 for the last two). The rest are configured to be default
- // (input). Note that the first two and last two are the ones closest
- // to the management SoC on either side, which minimizes the wire length
- // of the extra signals those pads need.
-
- /* First two GPIOs (JTAG and SDO) */
- gpio_control_block #(
- .DM_INIT(`DM_INIT), // Mode = output, strong up/down
- .OENB_INIT(`OENB_INIT) // Enable output signaling from wire
- ) gpio_control_bidir_1 [1:0] (
- `ifdef USE_POWER_PINS
- .vccd(vccd_core),
- .vssd(vssd_core),
- .vccd1(vccd1_core),
- .vssd1(vssd1_core),
- `endif
-
- // Management Soc-facing signals
-
- .resetn(gpio_resetn_1_shifted[1:0]),
- .serial_clock(gpio_clock_1_shifted[1:0]),
-
- .resetn_out(gpio_resetn_1[1:0]),
- .serial_clock_out(gpio_clock_1[1:0]),
-
- .mgmt_gpio_in(mgmt_io_in[1:0]),
- .mgmt_gpio_out({sdo_out, jtag_out}),
- .mgmt_gpio_oeb({sdo_outenb, jtag_outenb}),
-
- .one(),
- .zero(),
-
- // Serial data chain for pad configuration
- .serial_data_in(gpio_serial_link_1_shifted[1:0]),
- .serial_data_out(gpio_serial_link_1[1:0]),
-
- // User-facing signals
- .user_gpio_out(user_io_out[1:0]),
- .user_gpio_oeb(user_io_oeb[1:0]),
- .user_gpio_in(user_io_in[1:0]),
-
- // Pad-facing signals (Pad GPIOv2)
- .pad_gpio_inenb(mprj_io_inp_dis[1:0]),
- .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[1:0]),
- .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[1:0]),
- .pad_gpio_slow_sel(mprj_io_slow_sel[1:0]),
- .pad_gpio_holdover(mprj_io_holdover[1:0]),
- .pad_gpio_ana_en(mprj_io_analog_en[1:0]),
- .pad_gpio_ana_sel(mprj_io_analog_sel[1:0]),
- .pad_gpio_ana_pol(mprj_io_analog_pol[1:0]),
- .pad_gpio_dm(mprj_io_dm[5:0]),
- .pad_gpio_outenb(mprj_io_oeb[1:0]),
- .pad_gpio_out(mprj_io_out[1:0]),
- .pad_gpio_in(mprj_io_in[1:0])
- );
-
- /* Section 1 GPIOs (GPIO 0 to 18) */
- wire [`MPRJ_IO_PADS_1-1:2] one_loop1;
- gpio_control_block gpio_control_in_1 [`MPRJ_IO_PADS_1-3:0] (
- `ifdef USE_POWER_PINS
- .vccd(vccd_core),
- .vssd(vssd_core),
- .vccd1(vccd1_core),
- .vssd1(vssd1_core),
- `endif
-
- // Management Soc-facing signals
-
- .resetn(gpio_resetn_1_shifted[(`MPRJ_IO_PADS_1-1):2]),
- .serial_clock(gpio_clock_1_shifted[(`MPRJ_IO_PADS_1-1):2]),
-
- .resetn_out(gpio_resetn_1[(`MPRJ_IO_PADS_1-1):2]),
- .serial_clock_out(gpio_clock_1[(`MPRJ_IO_PADS_1-1):2]),
-
- .mgmt_gpio_in(mgmt_io_in[(`MPRJ_IO_PADS_1-1):2]),
- .mgmt_gpio_out(mgmt_io_in[(`MPRJ_IO_PADS_1-1):2]),
- .mgmt_gpio_oeb(one_loop1),
-
- .one(one_loop1),
- .zero(),
-
- // Serial data chain for pad configuration
- .serial_data_in(gpio_serial_link_1_shifted[(`MPRJ_IO_PADS_1-1):2]),
- .serial_data_out(gpio_serial_link_1[(`MPRJ_IO_PADS_1-1):2]),
-
- // User-facing signals
- .user_gpio_out(user_io_out[(`MPRJ_IO_PADS_1-1):2]),
- .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS_1-1):2]),
- .user_gpio_in(user_io_in[(`MPRJ_IO_PADS_1-1):2]),
-
- // Pad-facing signals (Pad GPIOv2)
- .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS_1-1):2]),
- .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS_1-1):2]),
- .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS_1-1):2]),
- .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS_1-1):2]),
- .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS_1-1):2]),
- .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS_1-1):2]),
- .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS_1-1):2]),
- .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS_1-1):2]),
- .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS_1*3-1):6]),
- .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS_1-1):2]),
- .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS_1-1):2]),
- .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS_1-1):2])
- );
-
- /* Last two GPIOs (flash_io2 and flash_io3) */
- gpio_control_block #(
- .DM_INIT(`DM_INIT), // Mode = output, strong up/down
- .OENB_INIT(`OENB_INIT) // Enable output signaling from wire
- ) gpio_control_bidir_2 [1:0] (
- `ifdef USE_POWER_PINS
- .vccd(vccd_core),
- .vssd(vssd_core),
- .vccd1(vccd1_core),
- .vssd1(vssd1_core),
- `endif
-
- // Management Soc-facing signals
-
- .resetn(gpio_resetn_1_shifted[(`MPRJ_IO_PADS_2-1):(`MPRJ_IO_PADS_2-2)]),
- .serial_clock(gpio_clock_1_shifted[(`MPRJ_IO_PADS_2-1):(`MPRJ_IO_PADS_2-2)]),
-
- .resetn_out(gpio_resetn_1[(`MPRJ_IO_PADS_2-1):(`MPRJ_IO_PADS_2-2)]),
- .serial_clock_out(gpio_clock_1[(`MPRJ_IO_PADS_2-1):(`MPRJ_IO_PADS_2-2)]),
-
- .mgmt_gpio_in(mgmt_io_in[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)]),
- .mgmt_gpio_out({gpio_flash_io3_out, gpio_flash_io2_out}),
- .mgmt_gpio_oeb({flash_io3_oeb_core, flash_io2_oeb_core}),
-
- .one(),
- .zero(),
-
- // Serial data chain for pad configuration
- .serial_data_in(gpio_serial_link_2_shifted[(`MPRJ_IO_PADS_2-1):(`MPRJ_IO_PADS_2-2)]),
- .serial_data_out(gpio_serial_link_2[(`MPRJ_IO_PADS_2-1):(`MPRJ_IO_PADS_2-2)]),
-
- // User-facing signals
- .user_gpio_out(user_io_out[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)]),
- .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)]),
- .user_gpio_in(user_io_in[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)]),
-
- // Pad-facing signals (Pad GPIOv2)
- .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)]),
- .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)]),
- .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)]),
- .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)]),
- .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)]),
- .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)]),
- .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)]),
- .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)]),
- .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS*3-1):(`MPRJ_IO_PADS*3-6)]),
- .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)]),
- .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)]),
- .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS-1):(`MPRJ_IO_PADS-2)])
- );
-
- /* Section 2 GPIOs (GPIO 19 to 37) */
- wire [`MPRJ_IO_PADS_2-3:0] one_loop2;
- gpio_control_block gpio_control_in_2 [`MPRJ_IO_PADS_2-3:0] (
- `ifdef USE_POWER_PINS
- .vccd(vccd_core),
- .vssd(vssd_core),
- .vccd1(vccd1_core),
- .vssd1(vssd1_core),
- `endif
-
- // Management Soc-facing signals
-
- .resetn(gpio_resetn_1_shifted[(`MPRJ_IO_PADS_2-3):0]),
- .serial_clock(gpio_clock_1_shifted[(`MPRJ_IO_PADS_2-3):0]),
-
- .resetn_out(gpio_resetn_1[(`MPRJ_IO_PADS_2-3):0]),
- .serial_clock_out(gpio_clock_1[(`MPRJ_IO_PADS_2-3):0]),
-
- .mgmt_gpio_in(mgmt_io_in[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
- .mgmt_gpio_out(mgmt_io_in[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
- .mgmt_gpio_oeb(one_loop2),
-
- .one(one_loop2),
- .zero(),
-
- // Serial data chain for pad configuration
- .serial_data_in(gpio_serial_link_2_shifted[(`MPRJ_IO_PADS_2-3):0]),
- .serial_data_out(gpio_serial_link_2[(`MPRJ_IO_PADS_2-3):0]),
-
- // User-facing signals
- .user_gpio_out(user_io_out[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
- .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
- .user_gpio_in(user_io_in[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
-
- // Pad-facing signals (Pad GPIOv2)
- .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
- .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
- .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
- .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
- .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
- .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
- .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
- .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
- .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS*3-7):(`MPRJ_IO_PADS_1*3)]),
- .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
- .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)]),
- .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS-3):(`MPRJ_IO_PADS_1)])
- );
-
- user_id_programming #(
- .USER_PROJECT_ID(USER_PROJECT_ID)
- ) user_id_value (
- `ifdef USE_POWER_PINS
- .VPWR(vccd_core),
- .VGND(vssd_core),
- `endif
- .mask_rev(mask_rev)
- );
-
- // Power-on-reset circuit
- simple_por por (
- `ifdef USE_POWER_PINS
- .vdd3v3(vddio_core),
- .vdd1v8(vccd_core),
- .vss(vssio_core),
- `endif
- .porb_h(porb_h),
- .porb_l(porb_l),
- .por_l(por_l)
- );
-
- // XRES (chip input pin reset) reset level converter
- sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped rstb_level (
- `ifdef USE_POWER_PINS
- .VPWR(vddio_core),
- .LVPWR(vccd_core),
- .LVGND(vssd_core),
- .VGND(vssio_core),
- `endif
- .A(rstb_h),
- .X(rstb_l)
- );
-
- // Storage area
- storage storage(
- `ifdef USE_POWER_PINS
- .VPWR(vccd_core),
- .VGND(vssd_core),
- `endif
- .mgmt_clk(caravel_clk),
- .mgmt_ena(mgmt_ena),
- .mgmt_wen(mgmt_wen),
- .mgmt_wen_mask(mgmt_wen_mask),
- .mgmt_addr(mgmt_addr),
- .mgmt_wdata(mgmt_wdata),
- .mgmt_rdata(mgmt_rdata),
- // Management RO interface
- .mgmt_ena_ro(mgmt_ena_ro),
- .mgmt_addr_ro(mgmt_addr_ro),
- .mgmt_rdata_ro(mgmt_rdata_ro)
- );
-
-endmodule
-// `default_nettype wire
diff --git a/caravel/rtl/caravel_clocking.v b/caravel/rtl/caravel_clocking.v
deleted file mode 100644
index cc0af25..0000000
--- a/caravel/rtl/caravel_clocking.v
+++ /dev/null
@@ -1,111 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-// This routine synchronizes the
-
-module caravel_clocking(
-`ifdef USE_POWER_PINS
- input vdd1v8,
- input vss,
-`endif
- input resetb, // Master (negative sense) reset
- input ext_clk_sel, // 0=use PLL clock, 1=use external (pad) clock
- input ext_clk, // External pad (slow) clock
- input pll_clk, // Internal PLL (fast) clock
- input pll_clk90, // Internal PLL (fast) clock, 90 degree phase
- input [2:0] sel, // Select clock divider value (0=thru, 1=divide-by-2, etc.)
- input [2:0] sel2, // Select clock divider value for 90 degree phase divided clock
- input ext_reset, // Positive sense reset from housekeeping SPI.
- output core_clk, // Output core clock
- output user_clk, // Output user (secondary) clock
- output resetb_sync // Output propagated and buffered reset
-);
-
- wire pll_clk_sel;
- wire pll_clk_divided;
- wire pll_clk90_divided;
- wire core_ext_clk;
- reg use_pll_first;
- reg use_pll_second;
- reg ext_clk_syncd_pre;
- reg ext_clk_syncd;
-
- assign pll_clk_sel = ~ext_clk_sel;
-
- // Note that this implementation does not guard against switching to
- // the PLL clock if the PLL clock is not present.
-
- always @(posedge pll_clk or negedge resetb) begin
- if (resetb == 1'b0) begin
- use_pll_first <= 1'b0;
- use_pll_second <= 1'b0;
- ext_clk_syncd <= 1'b0;
- end else begin
- use_pll_first <= pll_clk_sel;
- use_pll_second <= use_pll_first;
- ext_clk_syncd_pre <= ext_clk; // Sync ext_clk to pll_clk
- ext_clk_syncd <= ext_clk_syncd_pre; // Do this twice (resolve metastability)
- end
- end
-
- // Apply PLL clock divider
-
- clock_div #(
- .SIZE(3)
- ) divider (
- .in(pll_clk),
- .out(pll_clk_divided),
- .N(sel),
- .resetb(resetb)
- );
-
- // Secondary PLL clock divider for user space access
-
- clock_div #(
- .SIZE(3)
- ) divider2 (
- .in(pll_clk90),
- .out(pll_clk90_divided),
- .N(sel2),
- .resetb(resetb)
- );
-
-
- // Multiplex the clock output
-
- assign core_ext_clk = (use_pll_first) ? ext_clk_syncd : ext_clk;
- assign core_clk = (use_pll_second) ? pll_clk_divided : core_ext_clk;
- assign user_clk = (use_pll_second) ? pll_clk90_divided : core_ext_clk;
-
- // Reset assignment. "reset" comes from POR, while "ext_reset"
- // comes from standalone SPI (and is normally zero unless
- // activated from the SPI).
-
- // Staged-delay reset
- reg [2:0] reset_delay;
-
- always @(posedge core_clk or negedge resetb) begin
- if (resetb == 1'b0) begin
- reset_delay <= 3'b111;
- end else begin
- reset_delay <= {1'b0, reset_delay[2:1]};
- end
- end
-
- assign resetb_sync = ~(reset_delay[0] | ext_reset);
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/caravel_netlists.v b/caravel/rtl/caravel_netlists.v
deleted file mode 100644
index 1330104..0000000
--- a/caravel/rtl/caravel_netlists.v
+++ /dev/null
@@ -1,90 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`timescale 1 ns / 1 ps
-
-`define UNIT_DELAY #1
-`define USE_POWER_PINS
-
-`ifdef SIM
-
-`include "defines.v"
-`include "pads.v"
-
-/* NOTE: Need to pass the PDK root directory to iverilog with option -I */
-
-`ifdef EF_STYLE
- `include "libs.ref/verilog/sky130_fd_io/sky130_fd_io.v"
- `include "libs.ref/verilog/sky130_fd_io/sky130_ef_io.v"
- `include "libs.ref/verilog/sky130_fd_io/sky130_ef_io__gpiov2_pad_wrapped.v"
-
- `include "libs.ref/verilog/sky130_fd_sc_hd/primitives.v"
- `include "libs.ref/verilog/sky130_fd_sc_hd/sky130_fd_sc_hd.v"
- `include "libs.ref/verilog/sky130_fd_sc_hvl/primitives.v"
- `include "libs.ref/verilog/sky130_fd_sc_hvl/sky130_fd_sc_hvl.v"
-`else
- `include "libs.ref/sky130_fd_io/verilog/sky130_fd_io.v"
- `include "libs.ref/sky130_fd_io/verilog/sky130_ef_io.v"
- `include "libs.ref/sky130_fd_io/verilog/sky130_ef_io__gpiov2_pad_wrapped.v"
-
- `include "libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
- `include "libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
- `include "libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
- `include "libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
-`endif
-
-`ifdef GL
- `include "gl/mgmt_core.v"
- `include "gl/digital_pll.v"
- `include "gl/DFFRAM.v"
- `include "gl/storage.v"
- `include "gl/user_id_programming.v"
- `include "gl/chip_io.v"
- `include "gl/mprj_logic_high.v"
- `include "gl/mprj2_logic_high.v"
- `include "gl/mgmt_protect.v"
- `include "gl/mgmt_protect_hv.v"
- `include "gl/gpio_control_block.v"
- `include "gl/gpio_logic_high.v"
- `include "gl/sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped.v"
- `include "gl/caravel.v"
-`else
- `include "mgmt_soc.v"
- `include "housekeeping_spi.v"
- `include "caravel_clocking.v"
- `include "mgmt_core.v"
- `include "digital_pll.v"
- `include "DFFRAM.v"
- `include "DFFRAMBB.v"
- `include "storage.v"
- `include "user_id_programming.v"
- `include "clock_div.v"
- `include "storage_bridge_wb.v"
- `include "mprj_io.v"
- `include "chip_io.v"
- `include "mprj_logic_high.v"
- `include "mprj2_logic_high.v"
- `include "mgmt_protect.v"
- `include "mgmt_protect_hv.v"
- `include "gpio_control_block.v"
- `include "gpio_logic_high.v"
- `include "sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped.v"
- `include "caravel.v"
-`endif
-
-`include "simple_por.v"
-`include "sram_1rw1r_32_256_8_sky130.v"
-
-`endif
diff --git a/caravel/rtl/chip_io.v b/caravel/rtl/chip_io.v
deleted file mode 100644
index 39d2ac6..0000000
--- a/caravel/rtl/chip_io.v
+++ /dev/null
@@ -1,444 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-// `default_nettype none
-module chip_io(
- // Package Pins
- inout vddio_pad, // Common padframe/ESD supply
- inout vddio_pad2,
- inout vssio_pad, // Common padframe/ESD ground
- inout vssio_pad2,
- inout vccd_pad, // Common 1.8V supply
- inout vssd_pad, // Common digital ground
- inout vdda_pad, // Management analog 3.3V supply
- inout vssa_pad, // Management analog ground
- inout vdda1_pad, // User area 1 3.3V supply
- inout vdda1_pad2,
- inout vdda2_pad, // User area 2 3.3V supply
- inout vssa1_pad, // User area 1 analog ground
- inout vssa1_pad2,
- inout vssa2_pad, // User area 2 analog ground
- inout vccd1_pad, // User area 1 1.8V supply
- inout vccd2_pad, // User area 2 1.8V supply
- inout vssd1_pad, // User area 1 digital ground
- inout vssd2_pad, // User area 2 digital ground
-
- // Core Side
- inout vddio, // Common padframe/ESD supply
- inout vssio, // Common padframe/ESD ground
- inout vccd, // Common 1.8V supply
- inout vssd, // Common digital ground
- inout vdda, // Management analog 3.3V supply
- inout vssa, // Management analog ground
- inout vdda1, // User area 1 3.3V supply
- inout vdda2, // User area 2 3.3V supply
- inout vssa1, // User area 1 analog ground
- inout vssa2, // User area 2 analog ground
- inout vccd1, // User area 1 1.8V supply
- inout vccd2, // User area 2 1.8V supply
- inout vssd1, // User area 1 digital ground
- inout vssd2, // User area 2 digital ground
-
- inout gpio,
- input clock,
- input resetb,
- output flash_csb,
- output flash_clk,
- inout flash_io0,
- inout flash_io1,
- // Chip Core Interface
- input porb_h,
- input por,
- output resetb_core_h,
- output clock_core,
- input gpio_out_core,
- output gpio_in_core,
- input gpio_mode0_core,
- input gpio_mode1_core,
- input gpio_outenb_core,
- input gpio_inenb_core,
- input flash_csb_core,
- input flash_clk_core,
- input flash_csb_oeb_core,
- input flash_clk_oeb_core,
- input flash_io0_oeb_core,
- input flash_io1_oeb_core,
- input flash_csb_ieb_core,
- input flash_clk_ieb_core,
- input flash_io0_ieb_core,
- input flash_io1_ieb_core,
- input flash_io0_do_core,
- input flash_io1_do_core,
- output flash_io0_di_core,
- output flash_io1_di_core,
- // User project IOs
- inout [`MPRJ_IO_PADS-1:0] mprj_io,
- input [`MPRJ_IO_PADS-1:0] mprj_io_out,
- input [`MPRJ_IO_PADS-1:0] mprj_io_oeb,
- input [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis,
- input [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel,
- input [`MPRJ_IO_PADS-1:0] mprj_io_vtrip_sel,
- input [`MPRJ_IO_PADS-1:0] mprj_io_slow_sel,
- input [`MPRJ_IO_PADS-1:0] mprj_io_holdover,
- input [`MPRJ_IO_PADS-1:0] mprj_io_analog_en,
- input [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel,
- input [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol,
- input [`MPRJ_IO_PADS*3-1:0] mprj_io_dm,
- output [`MPRJ_IO_PADS-1:0] mprj_io_in,
- // User project direct access to gpio pad connections for analog
- // (all but the lowest-numbered 7 pads)
- inout [`MPRJ_IO_PADS-10:0] mprj_analog_io
-);
-
- // To be considered: Master hold signal on all user pads (?)
- // For now, set holdh_n to 1 (NOTE: This is in the 3.3V domain)
- // and setting enh to porb_h.
-
- wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
- wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
-
- assign mprj_io_hldh_n = {`MPRJ_IO_PADS{vddio}};
- assign mprj_io_enh = {`MPRJ_IO_PADS{porb_h}};
-
- wire analog_a, analog_b;
- wire vddio_q, vssio_q;
-
- // Instantiate power and ground pads for management domain
- // 12 pads: vddio, vssio, vdda, vssa, vccd, vssd
- // One each HV and LV clamp.
-
- // HV clamps connect between one HV power rail and one ground
- // LV clamps have two clamps connecting between any two LV power
- // rails and grounds, and one back-to-back diode which connects
- // between the first LV clamp ground and any other ground.
-
- sky130_ef_io__vddio_hvc_clamped_pad \mgmt_vddio_hvclamp_pad[0] (
- `MGMT_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VDDIO(vddio)
-`else
- ,.VDDIO_PAD(vddio_pad)
-`endif
- );
-
- // lies in user area 2
- sky130_ef_io__vddio_hvc_clamped_pad \mgmt_vddio_hvclamp_pad[1] (
- `USER2_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VDDIO(vddio)
-`else
- ,.VDDIO_PAD(vddio_pad2)
-`endif
- );
-
- sky130_ef_io__vdda_hvc_clamped_pad mgmt_vdda_hvclamp_pad (
- `MGMT_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VDDA(vdda)
-`else
- ,.VDDA_PAD(vdda_pad)
-`endif
- );
-
- sky130_ef_io__vccd_lvc_clamped_pad mgmt_vccd_lvclamp_pad (
- `MGMT_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VCCD(vccd)
-`else
- ,.VCCD_PAD(vccd_pad)
-`endif
- );
-
- sky130_ef_io__vssio_hvc_clamped_pad \mgmt_vssio_hvclamp_pad[0] (
- `MGMT_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSIO(vssio)
-`else
- ,.VSSIO_PAD(vssio_pad)
-`endif
- );
-
- sky130_ef_io__vssio_hvc_clamped_pad \mgmt_vssio_hvclamp_pad[1] (
- `USER2_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSIO(vssio)
-`else
- ,.VSSIO_PAD(vssio_pad2)
-`endif
- );
-
- sky130_ef_io__vssa_hvc_clamped_pad mgmt_vssa_hvclamp_pad (
- `MGMT_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSA(vssa)
-`else
- ,.VSSA_PAD(vssa_pad)
-`endif
- );
-
- sky130_ef_io__vssd_lvc_clamped_pad mgmt_vssd_lvclmap_pad (
- `MGMT_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSD(vssd)
-`else
- ,.VSSD_PAD(vssd_pad)
-`endif
- );
-
- // Instantiate power and ground pads for user 1 domain
- // 8 pads: vdda, vssa, vccd, vssd; One each HV and LV clamp.
-
- sky130_ef_io__vdda_hvc_clamped_pad \user1_vdda_hvclamp_pad[0] (
- `USER1_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VDDA(vdda1)
-`else
- ,.VDDA_PAD(vdda1_pad)
-`endif
- );
-
- sky130_ef_io__vdda_hvc_clamped_pad \user1_vdda_hvclamp_pad[1] (
- `USER1_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VDDA(vdda1)
-`else
- ,.VDDA_PAD(vdda1_pad2)
-`endif
- );
-
- sky130_ef_io__vccd_lvc_clamped2_pad user1_vccd_lvclamp_pad (
- `USER1_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VCCD(vccd1)
-`else
- ,.VCCD_PAD(vccd1_pad)
-`endif
- );
-
- sky130_ef_io__vssa_hvc_clamped_pad \user1_vssa_hvclamp_pad[0] (
- `USER1_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSA(vssa1)
-`else
- ,.VSSA_PAD(vssa1_pad)
-`endif
- );
-
-
- sky130_ef_io__vssa_hvc_clamped_pad \user1_vssa_hvclamp_pad[1] (
- `USER1_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSA(vssa1)
-`else
- ,.VSSA_PAD(vssa1_pad2)
-`endif
- );
-
- sky130_ef_io__vssd_lvc_clamped2_pad user1_vssd_lvclmap_pad (
- `USER1_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSD(vssd1)
-`else
- ,.VSSD_PAD(vssd1_pad)
-`endif
- );
-
- // Instantiate power and ground pads for user 2 domain
- // 8 pads: vdda, vssa, vccd, vssd; One each HV and LV clamp.
-
- sky130_ef_io__vdda_hvc_clamped_pad user2_vdda_hvclamp_pad (
- `USER2_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VDDA(vdda2)
-`else
- ,.VDDA_PAD(vdda2_pad)
-`endif
- );
-
- sky130_ef_io__vccd_lvc_clamped2_pad user2_vccd_lvclamp_pad (
- `USER2_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VCCD(vccd2)
-`else
- ,.VCCD_PAD(vccd2_pad)
-`endif
- );
-
- sky130_ef_io__vssa_hvc_clamped_pad user2_vssa_hvclamp_pad (
- `USER2_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSA(vssa2)
-`else
- ,.VSSA_PAD(vssa2_pad)
-`endif
- );
-
- sky130_ef_io__vssd_lvc_clamped2_pad user2_vssd_lvclmap_pad (
- `USER2_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSD(vssd2)
-`else
- ,.VSSD_PAD(vssd2_pad)
-`endif
- );
-
- wire [2:0] dm_all =
- {gpio_mode1_core, gpio_mode1_core, gpio_mode0_core};
- wire[2:0] flash_io0_mode =
- {flash_io0_ieb_core, flash_io0_ieb_core, flash_io0_oeb_core};
- wire[2:0] flash_io1_mode =
- {flash_io1_ieb_core, flash_io1_ieb_core, flash_io1_oeb_core};
-
- // Management clock input pad
- `INPUT_PAD(clock, clock_core);
-
- // Management GPIO pad
- `INOUT_PAD(
- gpio, gpio_in_core, gpio_out_core,
- gpio_inenb_core, gpio_outenb_core, dm_all);
-
- // Management Flash SPI pads
- `INOUT_PAD(
- flash_io0, flash_io0_di_core, flash_io0_do_core,
- flash_io0_ieb_core, flash_io0_oeb_core, flash_io0_mode);
- `INOUT_PAD(
- flash_io1, flash_io1_di_core, flash_io1_do_core,
- flash_io1_ieb_core, flash_io1_oeb_core, flash_io1_mode);
-
- `OUTPUT_PAD(flash_csb, flash_csb_core, flash_csb_ieb_core, flash_csb_oeb_core);
- `OUTPUT_PAD(flash_clk, flash_clk_core, flash_clk_ieb_core, flash_clk_oeb_core);
-
- // NOTE: The analog_out pad from the raven chip has been replaced by
- // the digital reset input resetb on caravel due to the lack of an on-board
- // power-on-reset circuit. The XRES pad is used for providing a glitch-
- // free reset.
-
- wire xresloop;
- sky130_fd_io__top_xres4v2 resetb_pad (
- `MGMT_ABUTMENT_PINS
- `ifndef TOP_ROUTING
- ,.PAD(resetb),
- `endif
- .TIE_WEAK_HI_H(xresloop), // Loop-back connection to pad through pad_a_esd_h
- .TIE_HI_ESD(),
- .TIE_LO_ESD(),
- .PAD_A_ESD_H(xresloop),
- .XRES_H_N(resetb_core_h),
- .DISABLE_PULLUP_H(vssio), // 0 = enable pull-up on reset pad
- .ENABLE_H(porb_h), // Power-on-reset
- .EN_VDDIO_SIG_H(vssio), // No idea.
- .INP_SEL_H(vssio), // 1 = use filt_in_h else filter the pad input
- .FILT_IN_H(vssio), // Alternate input for glitch filter
- .PULLUP_H(vssio), // Pullup connection for alternate filter input
- .ENABLE_VDDIO(vccd)
- );
-
- // Corner cells (These are overlay cells; it is not clear what is normally
- // supposed to go under them.)
-
- sky130_ef_io__corner_pad mgmt_corner [1:0] (
-`ifndef TOP_ROUTING
- .VSSIO(vssio),
- .VDDIO(vddio),
- .VDDIO_Q(vddio_q),
- .VSSIO_Q(vssio_q),
- .AMUXBUS_A(analog_a),
- .AMUXBUS_B(analog_b),
- .VSSD(vssd),
- .VSSA(vssa),
- .VSWITCH(vddio),
- .VDDA(vdda),
- .VCCD(vccd),
- .VCCHIB(vccd)
-`else
- .VCCHIB()
-`endif
-
- );
- sky130_ef_io__corner_pad user1_corner (
-`ifndef TOP_ROUTING
- .VSSIO(vssio),
- .VDDIO(vddio),
- .VDDIO_Q(vddio_q),
- .VSSIO_Q(vssio_q),
- .AMUXBUS_A(analog_a),
- .AMUXBUS_B(analog_b),
- .VSSD(vssd1),
- .VSSA(vssa1),
- .VSWITCH(vddio),
- .VDDA(vdda1),
- .VCCD(vccd1),
- .VCCHIB(vccd)
-`else
- .VCCHIB()
-`endif
- );
- sky130_ef_io__corner_pad user2_corner (
-`ifndef TOP_ROUTING
- .VSSIO(vssio),
- .VDDIO(vddio),
- .VDDIO_Q(vddio_q),
- .VSSIO_Q(vssio_q),
- .AMUXBUS_A(analog_a),
- .AMUXBUS_B(analog_b),
- .VSSD(vssd2),
- .VSSA(vssa2),
- .VSWITCH(vddio),
- .VDDA(vdda2),
- .VCCD(vccd2),
- .VCCHIB(vccd)
-`else
- .VCCHIB()
-`endif
- );
-
- mprj_io mprj_pads(
- .vddio(vddio),
- .vssio(vssio),
- .vccd(vccd),
- .vssd(vssd),
- .vdda1(vdda1),
- .vdda2(vdda2),
- .vssa1(vssa1),
- .vssa2(vssa2),
- .vccd1(vccd1),
- .vccd2(vccd2),
- .vssd1(vssd1),
- .vssd2(vssd2),
- .vddio_q(vddio_q),
- .vssio_q(vssio_q),
- .analog_a(analog_a),
- .analog_b(analog_b),
- .porb_h(porb_h),
- .io(mprj_io),
- .io_out(mprj_io_out),
- .oeb(mprj_io_oeb),
- .hldh_n(mprj_io_hldh_n),
- .enh(mprj_io_enh),
- .inp_dis(mprj_io_inp_dis),
- .ib_mode_sel(mprj_io_ib_mode_sel),
- .vtrip_sel(mprj_io_vtrip_sel),
- .holdover(mprj_io_holdover),
- .slow_sel(mprj_io_slow_sel),
- .analog_en(mprj_io_analog_en),
- .analog_sel(mprj_io_analog_sel),
- .analog_pol(mprj_io_analog_pol),
- .dm(mprj_io_dm),
- .io_in(mprj_io_in),
- .analog_io(mprj_analog_io)
- );
-
-endmodule
-// `default_nettype wire
diff --git a/caravel/rtl/chip_io_alt.v b/caravel/rtl/chip_io_alt.v
deleted file mode 100644
index 9e05c01..0000000
--- a/caravel/rtl/chip_io_alt.v
+++ /dev/null
@@ -1,525 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-// `default_nettype none
-
-/* Alternative padframe that removes the GPIO from the top row, */
-/* replacing them with un-overlaid power pads which have a */
-/* direct connection from pad to core. */
-
-/* For convenience, all of the original GPIO signals remain */
-/* defined in the I/O list, although some are not connected. */
-
-/* ANALOG_PADS_1 = Number of GPIO pads in the user 1 section */
-/* that are replaced by straight-through analog */
-/* ANALOG_PADS_2 = Number of GPIO pads in the user 2 section */
-/* that are replaced by straight-through analog */
-
-module chip_io_alt #(
- parameter ANALOG_PADS_1 = 5,
- parameter ANALOG_PADS_2 = 6
-) (
- // Package Pins
- inout vddio_pad, // Common padframe/ESD supply
- inout vddio_pad2, // Common padframe/ESD supply
- inout vssio_pad, // Common padframe/ESD ground
- inout vssio_pad2, // Common padframe/ESD ground
- inout vccd_pad, // Common 1.8V supply
- inout vssd_pad, // Common digital ground
- inout vdda_pad, // Management analog 3.3V supply
- inout vssa_pad, // Management analog ground
- inout vdda1_pad, // User area 1 3.3V supply
- inout vdda1_pad2, // User area 1 3.3V supply
- inout vdda2_pad, // User area 2 3.3V supply
- inout vssa1_pad, // User area 1 analog ground
- inout vssa1_pad2, // User area 1 analog ground
- inout vssa2_pad, // User area 2 analog ground
- inout vccd1_pad, // User area 1 1.8V supply
- inout vccd2_pad, // User area 2 1.8V supply
- inout vssd1_pad, // User area 1 digital ground
- inout vssd2_pad, // User area 2 digital ground
-
- // Core Side
- inout vddio, // Common padframe/ESD supply
- inout vssio, // Common padframe/ESD ground
- inout vccd, // Common 1.8V supply
- inout vssd, // Common digital ground
- inout vdda, // Management analog 3.3V supply
- inout vssa, // Management analog ground
- inout vdda1, // User area 1 3.3V supply
- inout vdda2, // User area 2 3.3V supply
- inout vssa1, // User area 1 analog ground
- inout vssa2, // User area 2 analog ground
- inout vccd1, // User area 1 1.8V supply
- inout vccd2, // User area 2 1.8V supply
- inout vssd1, // User area 1 digital ground
- inout vssd2, // User area 2 digital ground
-
- inout gpio,
- input clock,
- input resetb,
- output flash_csb,
- output flash_clk,
- inout flash_io0,
- inout flash_io1,
- // Chip Core Interface
- input porb_h,
- input por,
- output resetb_core_h,
- output clock_core,
- input gpio_out_core,
- output gpio_in_core,
- input gpio_mode0_core,
- input gpio_mode1_core,
- input gpio_outenb_core,
- input gpio_inenb_core,
- input flash_csb_core,
- input flash_clk_core,
- input flash_csb_oeb_core,
- input flash_clk_oeb_core,
- input flash_io0_oeb_core,
- input flash_io1_oeb_core,
- input flash_csb_ieb_core,
- input flash_clk_ieb_core,
- input flash_io0_ieb_core,
- input flash_io1_ieb_core,
- input flash_io0_do_core,
- input flash_io1_do_core,
- output flash_io0_di_core,
- output flash_io1_di_core,
- // User project IOs
- // mprj_io is defined for all pads, both digital and analog
- inout [`MPRJ_IO_PADS-1:0] mprj_io,
- // The section below is for the digital pads only.
- input [`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2-1:0] mprj_io_out,
- input [`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2-1:0] mprj_io_oeb,
- input [`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2-1:0] mprj_io_inp_dis,
- input [`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2-1:0] mprj_io_ib_mode_sel,
- input [`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2-1:0] mprj_io_vtrip_sel,
- input [`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2-1:0] mprj_io_slow_sel,
- input [`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2-1:0] mprj_io_holdover,
- input [`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2-1:0] mprj_io_analog_en,
- input [`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2-1:0] mprj_io_analog_sel,
- input [`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2-1:0] mprj_io_analog_pol,
- input [(`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2)*3-1:0] mprj_io_dm,
- output [`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2-1:0] mprj_io_in,
- output [`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2-1:0] mprj_io_in_3v3,
-
- // User project direct access to gpio pad connections for analog
- // "analog" connects to the "esd_0" pin of the GPIO pad, and
- // "analog_noesd" connects to the "noesd" pin of the GPIO pad.
-
- // User side 1: Connects to all but the first 7 pads;
- // User side 2: Connects to all but the last 2 pads
- inout [`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2-10:0] mprj_gpio_analog,
- inout [`MPRJ_IO_PADS-ANALOG_PADS_1-ANALOG_PADS_2-10:0] mprj_gpio_noesd,
-
- // Core connections for the analog signals
- inout [ANALOG_PADS_1+ANALOG_PADS_2-1:0] mprj_analog,
-
- // These are clamp connections for the clamps in the analog cells, if
- // they are used for power supplies.
- // User side 1: Connects to
- input [2:0] mprj_clamp_high,
- input [2:0] mprj_clamp_low
-);
-
- wire analog_a, analog_b;
- wire vddio_q, vssio_q;
-
- // To be considered: Master hold signal on all user pads (?)
- // For now, set holdh_n to 1 (NOTE: This is in the 3.3V domain)
- // and setting enh to porb_h.
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] mprj_io_hldh_n;
- wire [`MPRJ_IO_PADS-`ANALOG_PADS-1:0] mprj_io_enh;
-
- assign mprj_io_hldh_n = {`MPRJ_IO_PADS{vddio}};
- assign mprj_io_enh = {`MPRJ_IO_PADS{porb_h}};
-
- // Instantiate power and ground pads for management domain
- // 12 pads: vddio, vssio, vdda, vssa, vccd, vssd
- // One each HV and LV clamp.
-
- // HV clamps connect between one HV power rail and one ground
- // LV clamps have two clamps connecting between any two LV power
- // rails and grounds, and one back-to-back diode which connects
- // between the first LV clamp ground and any other ground.
-
- sky130_ef_io__vddio_hvc_clamped_pad \mgmt_vddio_hvclamp_pad[0] (
- `MGMT_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VDDIO(vddio)
-`else
- ,.VDDIO_PAD(vddio_pad)
-`endif
- );
-
- // lies in user area 2
- sky130_ef_io__vddio_hvc_clamped_pad \mgmt_vddio_hvclamp_pad[1] (
- `USER2_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VDDIO(vddio)
-`else
- ,.VDDIO_PAD(vddio_pad2)
-`endif
- );
-
- sky130_ef_io__vdda_hvc_clamped_pad mgmt_vdda_hvclamp_pad (
- `MGMT_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VDDA(vdda)
-`else
- ,.VDDA_PAD(vdda_pad)
-`endif );
-
- sky130_ef_io__vccd_lvc_clamped_pad mgmt_vccd_lvclamp_pad (
- `MGMT_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VCCD(vccd)
-`else
- ,.VCCD_PAD(vccd_pad)
-`endif
- );
-
- sky130_ef_io__vssio_hvc_clamped_pad \mgmt_vssio_hvclamp_pad[0] (
- `MGMT_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSIO(vssio)
-`else
- ,.VSSIO_PAD(vssio_pad)
-`endif
- );
-
- sky130_ef_io__vssio_hvc_clamped_pad \mgmt_vssio_hvclamp_pad[1] (
- `USER2_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSIO(vssio)
-`else
- ,.VSSIO_PAD(vssio_pad2)
-`endif
- );
-
- sky130_ef_io__vssa_hvc_clamped_pad mgmt_vssa_hvclamp_pad (
- `MGMT_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSA(vssa)
-`else
- ,.VSSA_PAD(vssa_pad)
-`endif
- );
-
- sky130_ef_io__vssd_lvc_clamped_pad mgmt_vssd_lvclmap_pad (
- `MGMT_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSD(vssd)
-`else
- ,.VSSD_PAD(vssd_pad)
-`endif
- );
-
- // Instantiate power and ground pads for user 1 domain
- // 8 pads: vdda, vssa, vccd, vssd; One each HV and LV clamp.
-
- sky130_ef_io__vdda_hvc_clamped_pad \user1_vdda_hvclamp_pad[0] (
- `USER1_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VDDA(vdda1)
-`else
- ,.VDDA_PAD(vdda1_pad)
-`endif
- );
-
- sky130_ef_io__vdda_hvc_clamped_pad \user1_vdda_hvclamp_pad[1] (
- `USER1_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VDDA(vdda1)
-`else
- ,.VDDA_PAD(vdda1_pad2)
-`endif
- );
-
- sky130_ef_io__vccd_lvc_clamped2_pad user1_vccd_lvclamp_pad (
- `USER1_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VCCD(vccd1)
-`else
- ,.VCCD_PAD(vccd1_pad)
-`endif
- );
-
- sky130_ef_io__vssa_hvc_clamped_pad \user1_vssa_hvclamp_pad[0] (
- `USER1_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSA(vssa1)
-`else
- ,.VSSA_PAD(vssa1_pad)
-`endif
- );
-
- sky130_ef_io__vssa_hvc_clamped_pad \user1_vssa_hvclamp_pad[1] (
- `USER1_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSA(vssa1)
-`else
- ,.VSSA_PAD(vssa1_pad2)
-`endif
- );
-
- sky130_ef_io__vssd_lvc_clamped2_pad user1_vssd_lvclmap_pad (
- `USER1_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSD(vssd1)
-`else
- ,.VSSD_PAD(vssd1_pad)
-`endif
- );
-
- // Instantiate power and ground pads for user 2 domain
- // 8 pads: vdda, vssa, vccd, vssd; One each HV and LV clamp.
-
- sky130_ef_io__vdda_hvc_clamped_pad user2_vdda_hvclamp_pad (
- `USER2_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VDDA(vdda2)
-`else
- ,.VDDA_PAD(vdda2_pad)
-`endif
- );
-
- sky130_ef_io__vccd_lvc_clamped2_pad user2_vccd_lvclamp_pad (
- `USER2_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VCCD(vccd2)
-`else
- ,.VCCD_PAD(vccd2_pad)
-`endif
- );
-
- sky130_ef_io__vssa_hvc_clamped_pad user2_vssa_hvclamp_pad (
- `USER2_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSA(vssa2)
-`else
- ,.VSSA_PAD(vssa2_pad)
-`endif
- );
-
- sky130_ef_io__vssd_lvc_clamped2_pad user2_vssd_lvclmap_pad (
- `USER2_ABUTMENT_PINS
-`ifdef TOP_ROUTING
- .VSSD(vssd2)
-`else
- ,.VSSD_PAD(vssd2_pad)
-`endif
- );
-
- // Instantiate analog pads in user area 1 using the custom analog pad
- sky130_ef_io__analog_pad user1_analog_pad [ANALOG_PADS_1-2:0] (
- `USER1_ABUTMENT_PINS
-`ifndef TOP_ROUTING
- // .VDDIO(vddio)
- ,.P_PAD(mprj_io[`MPRJ_IO_PADS_1-2:`MPRJ_IO_PADS_1-ANALOG_PADS_1]),
-`endif
- .P_CORE(mprj_analog[ANALOG_PADS_1-2:0])
- );
-
- // Last analog pad is a power pad, to provide a clamp resource.
- sky130_ef_io__top_power_hvc user1_analog_pad_with_clamp (
- `USER1_ABUTMENT_PINS
-`ifndef TOP_ROUTING
- // .VDDIO(vddio)
- ,.P_PAD(mprj_io[`MPRJ_IO_PADS_1-1]),
-`endif
- `HVCLAMP_PINS(mprj_clamp_high[0],
- mprj_clamp_low[0]),
- .P_CORE(mprj_analog[ANALOG_PADS_1-1])
- );
-
- // Instantiate analog pads in user area 2 using the custom analog pad.
- sky130_ef_io__analog_pad user2_analog_pad [ANALOG_PADS_2-3:0] (
- `USER2_ABUTMENT_PINS
-`ifndef TOP_ROUTING
- // .VDDIO(vddio)
- ,.P_PAD(mprj_io[`MPRJ_IO_PADS_1+ANALOG_PADS_2-1:`MPRJ_IO_PADS_1+2]),
-`endif
- .P_CORE(mprj_analog[ANALOG_PADS_2+ANALOG_PADS_1-1:ANALOG_PADS_1+2])
- );
-
- // Last two analog pads are power pads, to provide clamp resources.
- sky130_ef_io__top_power_hvc user2_analog_pad_with_clamp [1:0] (
- `USER2_ABUTMENT_PINS
-`ifndef TOP_ROUTING
- // .VDDIO(vddio)
- ,.P_PAD(mprj_io[`MPRJ_IO_PADS_1+1:`MPRJ_IO_PADS_1]),
-`endif
- `HVCLAMP_PINS(mprj_clamp_high[2:1], mprj_clamp_low[2:1]),
- .P_CORE(mprj_analog[`ANALOG_PADS_1+1:ANALOG_PADS_1])
- );
-
- wire [2:0] dm_all =
- {gpio_mode1_core, gpio_mode1_core, gpio_mode0_core};
- wire[2:0] flash_io0_mode =
- {flash_io0_ieb_core, flash_io0_ieb_core, flash_io0_oeb_core};
- wire[2:0] flash_io1_mode =
- {flash_io1_ieb_core, flash_io1_ieb_core, flash_io1_oeb_core};
-
- // Management clock input pad
- `INPUT_PAD(clock, clock_core);
-
- // Management GPIO pad
- `INOUT_PAD(
- gpio, gpio_in_core, gpio_out_core,
- gpio_inenb_core, gpio_outenb_core, dm_all);
-
- // Management Flash SPI pads
- `INOUT_PAD(
- flash_io0, flash_io0_di_core, flash_io0_do_core,
- flash_io0_ieb_core, flash_io0_oeb_core, flash_io0_mode);
- `INOUT_PAD(
- flash_io1, flash_io1_di_core, flash_io1_do_core,
- flash_io1_ieb_core, flash_io1_oeb_core, flash_io1_mode);
-
- `OUTPUT_PAD(flash_csb, flash_csb_core, flash_csb_ieb_core, flash_csb_oeb_core);
- `OUTPUT_PAD(flash_clk, flash_clk_core, flash_clk_ieb_core, flash_clk_oeb_core);
-
- // NOTE: The analog_out pad from the raven chip has been replaced by
- // the digital reset input resetb on caravel due to the lack of an on-board
- // power-on-reset circuit. The XRES pad is used for providing a glitch-
- // free reset.
-
- wire xresloop;
- sky130_fd_io__top_xres4v2 resetb_pad (
- `MGMT_ABUTMENT_PINS
- `ifndef TOP_ROUTING
- ,.PAD(resetb),
- `endif
- .TIE_WEAK_HI_H(xresloop), // Loop-back connection to pad through pad_a_esd_h
- .TIE_HI_ESD(),
- .TIE_LO_ESD(),
- .PAD_A_ESD_H(xresloop),
- .XRES_H_N(resetb_core_h),
- .DISABLE_PULLUP_H(vssio), // 0 = enable pull-up on reset pad
- .ENABLE_H(porb_h), // Power-on-reset
- .EN_VDDIO_SIG_H(vssio), // No idea.
- .INP_SEL_H(vssio), // 1 = use filt_in_h else filter the pad input
- .FILT_IN_H(vssio), // Alternate input for glitch filter
- .PULLUP_H(vssio), // Pullup connection for alternate filter input
- .ENABLE_VDDIO(vccd)
- );
-
- // Corner cells (These are overlay cells; it is not clear what is normally
- // supposed to go under them.)
-
- sky130_ef_io__corner_pad mgmt_corner [1:0] (
-`ifndef TOP_ROUTING
- .VSSIO(vssio),
- .VDDIO(vddio),
- .VDDIO_Q(vddio_q),
- .VSSIO_Q(vssio_q),
- .AMUXBUS_A(analog_a),
- .AMUXBUS_B(analog_b),
- .VSSD(vssd),
- .VSSA(vssa),
- .VSWITCH(vddio),
- .VDDA(vdda),
- .VCCD(vccd),
- .VCCHIB(vccd)
-`else
- .VCCHIB()
-`endif
-
- );
- sky130_ef_io__corner_pad user1_corner (
-`ifndef TOP_ROUTING
- .VSSIO(vssio),
- .VDDIO(vddio),
- .VDDIO_Q(vddio_q),
- .VSSIO_Q(vssio_q),
- .AMUXBUS_A(analog_a),
- .AMUXBUS_B(analog_b),
- .VSSD(vssd1),
- .VSSA(vssa1),
- .VSWITCH(vddio),
- .VDDA(vdda1),
- .VCCD(vccd1),
- .VCCHIB(vccd)
-`else
- .VCCHIB()
-`endif
- );
- sky130_ef_io__corner_pad user2_corner (
-`ifndef TOP_ROUTING
- .VSSIO(vssio),
- .VDDIO(vddio),
- .VDDIO_Q(vddio_q),
- .VSSIO_Q(vssio_q),
- .AMUXBUS_A(analog_a),
- .AMUXBUS_B(analog_b),
- .VSSD(vssd2),
- .VSSA(vssa2),
- .VSWITCH(vddio),
- .VDDA(vdda2),
- .VCCD(vccd2),
- .VCCHIB(vccd)
-`else
- .VCCHIB()
-`endif
- );
-
- mprj_io #(
- .AREA1PADS(`MPRJ_IO_PADS_1 - ANALOG_PADS_1),
- .TOTAL_PADS(`MPRJ_IO_PADS - ANALOG_PADS_1 - ANALOG_PADS_2)
- ) mprj_pads (
- .vddio(vddio),
- .vssio(vssio),
- .vccd(vccd),
- .vssd(vssd),
- .vdda1(vdda1),
- .vdda2(vdda2),
- .vssa1(vssa1),
- .vssa2(vssa2),
- .vccd1(vccd1),
- .vccd2(vccd2),
- .vssd1(vssd1),
- .vssd2(vssd2),
- .vddio_q(vddio_q),
- .vssio_q(vssio_q),
- .analog_a(analog_a),
- .analog_b(analog_b),
- .porb_h(porb_h),
-
- .io({mprj_io[`MPRJ_IO_PADS-1:`MPRJ_IO_PADS_1+ANALOG_PADS_2],
- mprj_io[`MPRJ_IO_PADS_1-ANALOG_PADS_1-1:0]}),
- .io_out(mprj_io_out),
- .oeb(mprj_io_oeb),
- .hldh_n(mprj_io_hldh_n),
- .enh(mprj_io_enh),
- .inp_dis(mprj_io_inp_dis),
- .ib_mode_sel(mprj_io_ib_mode_sel),
- .vtrip_sel(mprj_io_vtrip_sel),
- .holdover(mprj_io_holdover),
- .slow_sel(mprj_io_slow_sel),
- .analog_en(mprj_io_analog_en),
- .analog_sel(mprj_io_analog_sel),
- .analog_pol(mprj_io_analog_pol),
- .dm(mprj_io_dm),
- .io_in(mprj_io_in),
- .io_in_3v3(mprj_io_in_3v3),
- .analog_io(mprj_gpio_analog),
- .analog_noesd_io(mprj_gpio_noesd)
- );
-
-endmodule
-// `default_nettype wire
diff --git a/caravel/rtl/clock_div.v b/caravel/rtl/clock_div.v
deleted file mode 100644
index 49ff44b..0000000
--- a/caravel/rtl/clock_div.v
+++ /dev/null
@@ -1,213 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-/* Integer-N clock divider */
-`default_nettype none
-
-module clock_div #(
- parameter SIZE = 3 // Number of bits for the divider value
-) (
- in, out, N, resetb
-);
- input in; // input clock
- input [SIZE-1:0] N; // the number to be divided by
- input resetb; // asynchronous reset (sense negative)
- output out; // divided output clock
-
- wire out_odd; // output of odd divider
- wire out_even; // output of even divider
- wire not_zero; // signal to find divide by 0 case
- wire enable_even; // enable of even divider
- wire enable_odd; // enable of odd divider
-
- reg [SIZE-1:0] syncN; // N synchronized to output clock
- reg [SIZE-1:0] syncNp; // N synchronized to output clock
-
- assign not_zero = | syncN[SIZE-1:1];
-
- assign out = (out_odd & syncN[0] & not_zero) | (out_even & !syncN[0]);
- assign enable_odd = syncN[0] & not_zero;
- assign enable_even = !syncN[0];
-
- // Divider value synchronization (double-synchronized to avoid metastability)
- always @(posedge out or negedge resetb) begin
- if (resetb == 1'b0) begin
- syncN <= `CLK_DIV; // Default to divide-by-2 on system reset
- syncNp <= `CLK_DIV; // Default to divide-by-2 on system reset
- end else begin
- syncNp <= N;
- syncN <= syncNp;
- end
- end
-
- // Even divider
- even even_0(in, out_even, syncN, resetb, not_zero, enable_even);
- // Odd divider
- odd odd_0(in, out_odd, syncN, resetb, enable_odd);
-
-endmodule // clock_div
-
-/* Odd divider */
-
-module odd #(
- parameter SIZE = 3
-) (
- clk, out, N, resetb, enable
-);
- input clk; // slow clock
- output out; // fast output clock
- input [SIZE-1:0] N; // division factor
- input resetb; // synchronous reset
- input enable; // odd enable
-
- reg [SIZE-1:0] counter; // these 2 counters are used
- reg [SIZE-1:0] counter2; // to non-overlapping signals
- reg out_counter; // positive edge triggered counter
- reg out_counter2; // negative edge triggered counter
- reg rst_pulse; // pulse generated when vector N changes
- reg [SIZE-1:0] old_N; // gets set to old N when N is changed
- wire not_zero; // if !not_zero, we devide by 1
-
- // xor to generate 50% duty, half-period waves of final output
- assign out = out_counter2 ^ out_counter;
-
- // positive edge counter/divider
- always @(posedge clk or negedge resetb) begin
- if (resetb == 1'b0) begin
- counter <= `CLK_DIV;
- out_counter <= 1;
- end else if (rst_pulse) begin
- counter <= N;
- out_counter <= 1;
- end else if (enable) begin
- if (counter == 1) begin
- counter <= N;
- out_counter <= ~out_counter;
- end else begin
- counter <= counter - 1'b1;
- end
- end
- end
-
- reg [SIZE-1:0] initial_begin; // this is used to offset the negative edge counter
- // wire [SIZE:0] interm_3; // from the positive edge counter in order to
- // assign interm_3 = {1'b0,N} + 2'b11; // guarante 50% duty cycle.
- localparam [SIZE:0] interm_3 = {1'b0,`CLK_DIV} + 2'b11;
-
- // Counter driven by negative edge of clock.
-
- always @(negedge clk or negedge resetb) begin
- if (resetb == 1'b0) begin
- // reset the counter at system reset
- counter2 <= `CLK_DIV;
- initial_begin <= interm_3[SIZE:1];
- out_counter2 <= 1;
- end else if (rst_pulse) begin
- // reset the counter at change of N.
- counter2 <= N;
- initial_begin <= interm_3[SIZE:1];
- out_counter2 <= 1;
- end else if ((initial_begin <= 1) && enable) begin
-
- // Do normal logic after odd calibration.
- // This is the same as the even counter.
- if (counter2 == 1) begin
- counter2 <= N;
- out_counter2 <= ~out_counter2;
- end else begin
- counter2 <= counter2 - 1'b1;
- end
- end else if (enable) begin
- initial_begin <= initial_begin - 1'b1;
- end
- end
-
- //
- // reset pulse generator:
- // __ __ __ __ _
- // clk: __/ \__/ \__/ \__/ \__/
- // _ __________________________
- // N: _X__________________________
- // _____
- // rst_pulse: __/ \___________________
- //
- // This block generates an internal reset for the odd divider in the
- // form of a single pulse signal when the odd divider is enabled.
-
- always @(posedge clk or negedge resetb) begin
- if (resetb == 1'b0) begin
- rst_pulse <= 0;
- end else if (enable) begin
- if (N != old_N) begin
- // pulse when reset changes
- rst_pulse <= 1;
- end else begin
- rst_pulse <= 0;
- end
- end
- end
-
- always @(posedge clk) begin
- // always save the old N value to guarante reset from
- // an even-to-odd transition.
- old_N <= N;
- end
-
-endmodule // odd
-
-/* Even divider */
-
-module even #(
- parameter SIZE = 3
-) (
- clk, out, N, resetb, not_zero, enable
-);
- input clk; // fast input clock
- output out; // slower divided clock
- input [SIZE-1:0] N; // divide by factor 'N'
- input resetb; // asynchronous reset
- input not_zero; // if !not_zero divide by 1
- input enable; // enable the even divider
-
- reg [SIZE-1:0] counter;
- reg out_counter;
- wire [SIZE-1:0] div_2;
-
- // if N=0 just output the clock, otherwise, divide it.
- assign out = (clk & !not_zero) | (out_counter & not_zero);
- assign div_2 = {1'b0, N[SIZE-1:1]};
-
- // simple flip-flop even divider
- always @(posedge clk or negedge resetb) begin
- if (resetb == 1'b0) begin
- counter <= 1;
- out_counter <= 1;
-
- end else if (enable) begin
- // only use switching power if enabled
- if (counter == 1) begin
- // divide after counter has reached bottom
- // of interval 'N' which will be value '1'
- counter <= div_2;
- out_counter <= ~out_counter;
- end else begin
- // decrement the counter and wait
- counter <= counter-1; // to start next transition.
- end
- end
- end
-
-endmodule //even
-`default_nettype wire
diff --git a/caravel/rtl/convert_gpio_sigs.v b/caravel/rtl/convert_gpio_sigs.v
deleted file mode 100644
index e9e8351..0000000
--- a/caravel/rtl/convert_gpio_sigs.v
+++ /dev/null
@@ -1,51 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-/* Convert the standard set of GPIO signals: input, output, output_enb,
- * pullup, and pulldown into the set needed by the s8 GPIO pads:
- * input, output, output_enb, input_enb, mode. Note that dm[2] on
- * thepads is always equal to dm[1] in this setup, so mode is shown as
- * only a 2-bit signal.
- *
- * This module is bit-sliced. Instantiate once for each GPIO pad.
- * (Caravel has only one GPIO pad, so bit-slicing is irrelevant.)
- */
-
-module convert_gpio_sigs (
- input gpio_out,
- input gpio_outenb,
- input gpio_pu,
- input gpio_pd,
- output gpio_out_pad,
- output gpio_outenb_pad,
- output gpio_inenb_pad,
- output gpio_mode1_pad,
- output gpio_mode0_pad
-);
-
- assign gpio_out_pad = (gpio_pu == 1'b0 && gpio_pd == 1'b0) ? gpio_out :
- (gpio_pu == 1'b1) ? 1 : 0;
-
- assign gpio_outenb_pad = (gpio_outenb == 1'b0) ? 0 :
- (gpio_pu == 1'b1 || gpio_pd == 1'b1) ? 0 : 1;
-
- assign gpio_inenb_pad = ~gpio_outenb;
-
- assign gpio_mode1_pad = ~gpio_outenb_pad;
- assign gpio_mode0_pad = gpio_outenb;
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/counter_timer_high.v b/caravel/rtl/counter_timer_high.v
deleted file mode 100644
index e13172e..0000000
--- a/caravel/rtl/counter_timer_high.v
+++ /dev/null
@@ -1,295 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-/* Simple 32-bit counter-timer for Caravel. */
-
-/* Counter acts as high 32 bits of a 64-bit counter
- * when chained with the other counter
- */
-
-module counter_timer_high_wb # (
- parameter BASE_ADR = 32'h2400_0000,
- parameter CONFIG = 8'h00,
- parameter VALUE = 8'h04,
- parameter DATA = 8'h08
-) (
- input wb_clk_i,
- input wb_rst_i,
- input [31:0] wb_adr_i,
- input [31:0] wb_dat_i,
- input [3:0] wb_sel_i,
- input wb_we_i,
- input wb_cyc_i,
- input wb_stb_i,
-
- output wb_ack_o,
- output [31:0] wb_dat_o,
- input enable_in,
- input stop_in,
- input strobe,
- input is_offset,
- output stop_out,
- output enable_out,
- output irq
-);
- wire [31:0] counter_timer_reg_cfg_do;
- wire [31:0] counter_timer_reg_val_do;
- wire [31:0] counter_timer_reg_dat_do;
-
- wire resetn = ~wb_rst_i;
- wire valid = wb_stb_i && wb_cyc_i;
- wire counter_timer_reg_cfg_sel = valid && (wb_adr_i == (BASE_ADR | CONFIG));
- wire counter_timer_reg_val_sel = valid && (wb_adr_i == (BASE_ADR | VALUE));
- wire counter_timer_reg_dat_sel = valid && (wb_adr_i == (BASE_ADR | DATA));
-
- wire reg_cfg_we = (counter_timer_reg_cfg_sel) ?
- (wb_sel_i[0] & {wb_we_i}): 1'b0;
- wire [3:0] reg_val_we = (counter_timer_reg_val_sel) ?
- (wb_sel_i & {4{wb_we_i}}): 4'b0000;
- wire [3:0] reg_dat_we = (counter_timer_reg_dat_sel) ?
- (wb_sel_i & {4{wb_we_i}}): 4'b0000;
-
- wire [31:0] mem_wdata = wb_dat_i;
- wire reg_dat_re = counter_timer_reg_dat_sel && !wb_sel_i && ~wb_we_i;
-
- assign wb_dat_o = (counter_timer_reg_cfg_sel) ? counter_timer_reg_cfg_do :
- (counter_timer_reg_val_sel) ? counter_timer_reg_val_do :
- counter_timer_reg_dat_do;
- assign wb_ack_o = counter_timer_reg_cfg_sel || counter_timer_reg_val_sel ||
- counter_timer_reg_dat_sel;
-
- counter_timer_high counter_timer_high_inst (
- .resetn(resetn),
- .clkin(wb_clk_i),
- .reg_val_we(reg_val_we),
- .reg_val_di(mem_wdata),
- .reg_val_do(counter_timer_reg_val_do),
- .reg_cfg_we(reg_cfg_we),
- .reg_cfg_di(mem_wdata),
- .reg_cfg_do(counter_timer_reg_cfg_do),
- .reg_dat_we(reg_dat_we),
- .reg_dat_di(mem_wdata),
- .reg_dat_do(counter_timer_reg_dat_do),
- .enable_in(enable_in),
- .stop_in(stop_in),
- .is_offset(is_offset),
- .stop_out(stop_out),
- .strobe(strobe),
- .enable_out(enable_out),
- .irq_out(irq)
- );
-
-endmodule
-
-module counter_timer_high (
- input resetn,
- input clkin,
-
- input [3:0] reg_val_we,
- input [31:0] reg_val_di,
- output [31:0] reg_val_do,
-
- input reg_cfg_we,
- input [31:0] reg_cfg_di,
- output [31:0] reg_cfg_do,
-
- input [3:0] reg_dat_we,
- input [31:0] reg_dat_di,
- output [31:0] reg_dat_do,
- input stop_in,
- input enable_in,
- input is_offset,
- input strobe,
- output stop_out,
- output enable_out,
- output irq_out
-);
-
-reg [31:0] value_cur;
-reg [31:0] value_reset;
-reg irq_out;
-wire enable_in; // Enable from chained counter
-wire strobe; // Count strobe from low word counter
-wire enable_out; // Enable to chained counter (sync)
-reg stop_out; // Stop signal to low word counter
-
-wire [31:0] value_cur_plus; // Next value, on up-count
-wire [31:0] value_cur_minus; // Next value, on down-count
-wire [31:0] value_check_plus; // Value to check for stop condition during up count
-wire loc_enable; // Local enable
-
-reg enable; // Enable (start) the counter/timer
-reg lastenable; // Previous state of enable (catch rising/falling edge)
-reg oneshot; // Set oneshot (1) mode or continuous (0) mode
-reg updown; // Count up (1) or down (0)
-reg irq_ena; // Enable interrupt on timeout
-reg chain; // Chain to a secondary timer
-
-// Configuration register
-
-assign reg_cfg_do = {27'd0, irq_ena, chain, updown, oneshot, enable};
-
-always @(posedge clkin or negedge resetn) begin
- if (resetn == 1'b0) begin
- enable <= 1'b0;
- oneshot <= 1'b0;
- updown <= 1'b0;
- chain <= 1'b0;
- irq_ena <= 1'b0;
- end else begin
- if (reg_cfg_we) begin
- enable <= reg_cfg_di[0];
- oneshot <= reg_cfg_di[1];
- updown <= reg_cfg_di[2];
- chain <= reg_cfg_di[3];
- irq_ena <= reg_cfg_di[4];
- end
- end
-end
-
-// Counter/timer reset value register
-
-assign reg_val_do = value_reset;
-
-always @(posedge clkin or negedge resetn) begin
- if (resetn == 1'b0) begin
- value_reset <= 32'd0;
- end else begin
- if (reg_val_we[3]) value_reset[31:24] <= reg_val_di[31:24];
- if (reg_val_we[2]) value_reset[23:16] <= reg_val_di[23:16];
- if (reg_val_we[1]) value_reset[15:8] <= reg_val_di[15:8];
- if (reg_val_we[0]) value_reset[7:0] <= reg_val_di[7:0];
- end
-end
-
-assign reg_dat_do = value_cur;
-
-// Counter/timer current value register and timer implementation
-
-assign value_cur_plus = value_cur + 1;
-assign value_cur_minus = value_cur - 1;
-
-assign value_check_plus = (is_offset) ? value_cur_plus : value_cur;
-
-assign enable_out = enable;
-assign loc_enable = (chain == 1'b1) ? (enable && enable_in) : enable;
-
-// When acting as the high 32 bit word of a 64-bit chained counter:
-//
-// It counts when the low 32-bit counter strobes (strobe == 1).
-// It sets "stop_out" and stops on the stop condition.
-
-always @(posedge clkin or negedge resetn) begin
- if (resetn == 1'b0) begin
- value_cur <= 32'd0;
- stop_out <= 1'b0;
- irq_out <= 1'b0;
- lastenable <= 1'b0;
- end else begin
- lastenable <= loc_enable;
-
- if (reg_dat_we != 4'b0000) begin
- if (reg_dat_we[3] == 1'b1) value_cur[31:24] <= reg_dat_di[31:24];
- if (reg_dat_we[2] == 1'b1) value_cur[23:16] <= reg_dat_di[23:16];
- if (reg_dat_we[1] == 1'b1) value_cur[15:8] <= reg_dat_di[15:8];
- if (reg_dat_we[0] == 1'b1) value_cur[7:0] <= reg_dat_di[7:0];
-
- end else if (loc_enable == 1'b1) begin
- /* IRQ signals one cycle after stop, if IRQ is enabled */
- /* IRQ lasts for one cycle only. */
- irq_out <= (irq_ena) ? (stop_out & ~irq_out) : 1'b0;
-
- if (updown == 1'b1) begin
- if (lastenable == 1'b0) begin
- value_cur <= 32'd0;
- stop_out <= 1'b0;
- end else if (chain) begin
- // Chained counter behavior
- if (value_check_plus == value_reset) begin
- stop_out <= 1'b1;
- end
- if (stop_in == 1'b1) begin // lower word counter stopped
- if (oneshot != 1'b1) begin
- value_cur <= 32'd0; // reset count
- stop_out <= 1'b0; // no longer stopped
- end else if (strobe == 1'b1) begin
- value_cur <= value_cur_plus;
- end
- end else if (strobe == 1'b1) begin
- value_cur <= value_cur_plus;
- end
- end else begin
- // Standalone counter behavior
- if (value_cur == value_reset) begin
- if (oneshot != 1'b1) begin
- value_cur <= 32'd0;
- stop_out <= 1'b0;
- end else begin
- stop_out <= 1'b1;
- end
- end else begin
- if (value_cur_plus == 32'd0) begin
- stop_out <= 1'b1;
- end else begin
- stop_out <= 1'b0;
- end
- value_cur <= value_cur_plus; // count up
- end
- end
- end else begin
- if (lastenable == 1'b0) begin
- value_cur <= value_reset;
- stop_out <= 1'b0;
- end else if (chain) begin
- // Chained counter behavior
- if (value_cur == 32'd0) begin
- stop_out <= 1'b1;
- end
- if (stop_in == 1'b1) begin // lower word counter stopped
- if (oneshot != 1'b1) begin
- value_cur <= value_reset; // reset count
- stop_out <= 1'b0; // no longer stopped
- end
- end else if (strobe == 1'b1) begin
- value_cur <= value_cur_minus; // count down
- end
- end else begin
- // Standalone counter behavior
- if (value_cur == 32'd0) begin
- if (oneshot != 1'b1) begin
- value_cur <= value_reset;
- stop_out <= 1'b0;
- end else begin
- stop_out <= 1'b1;
- end
- end else begin
- if (value_cur_minus == 32'd0) begin
- stop_out <= 1'b1;
- end else begin
- stop_out <= 1'b0;
- end
- value_cur <= value_cur_minus; // count down
- end
- end
- end
- end else begin
- stop_out <= 1'b0;
- end
- end
-end
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/counter_timer_low.v b/caravel/rtl/counter_timer_low.v
deleted file mode 100644
index 06ed5d1..0000000
--- a/caravel/rtl/counter_timer_low.v
+++ /dev/null
@@ -1,327 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-/* Simple 32-bit counter-timer for Caravel. */
-
-/* Counter acts as low 32 bits of a 64-bit counter
- * when chained with the other counter.
- */
-
-module counter_timer_low_wb # (
- parameter BASE_ADR = 32'h2400_0000,
- parameter CONFIG = 8'h00,
- parameter VALUE = 8'h04,
- parameter DATA = 8'h08
-) (
- input wb_clk_i,
- input wb_rst_i,
- input [31:0] wb_adr_i,
- input [31:0] wb_dat_i,
- input [3:0] wb_sel_i,
- input wb_we_i,
- input wb_cyc_i,
- input wb_stb_i,
-
- output wb_ack_o,
- output [31:0] wb_dat_o,
-
- input stop_in,
- input enable_in,
- output strobe,
- output is_offset,
- output stop_out,
- output enable_out,
- output irq
-);
- wire [31:0] counter_timer_reg_cfg_do;
- wire [31:0] counter_timer_reg_val_do;
- wire [31:0] counter_timer_reg_dat_do;
-
- wire resetn = ~wb_rst_i;
- wire valid = wb_stb_i && wb_cyc_i;
- wire counter_timer_reg_cfg_sel = valid && (wb_adr_i == (BASE_ADR | CONFIG));
- wire counter_timer_reg_val_sel = valid && (wb_adr_i == (BASE_ADR | VALUE));
- wire counter_timer_reg_dat_sel = valid && (wb_adr_i == (BASE_ADR | DATA));
-
- wire reg_cfg_we = (counter_timer_reg_cfg_sel) ?
- (wb_sel_i[0] & {wb_we_i}): 1'b0;
- wire [3:0] reg_val_we = (counter_timer_reg_val_sel) ?
- (wb_sel_i & {4{wb_we_i}}): 4'b0000;
- wire [3:0] reg_dat_we = (counter_timer_reg_dat_sel) ?
- (wb_sel_i & {4{wb_we_i}}): 4'b0000;
-
- wire [31:0] mem_wdata = wb_dat_i;
- wire reg_dat_re = counter_timer_reg_dat_sel && !wb_sel_i && ~wb_we_i;
-
- assign wb_dat_o = (counter_timer_reg_cfg_sel) ? counter_timer_reg_cfg_do :
- (counter_timer_reg_val_sel) ? counter_timer_reg_val_do :
- counter_timer_reg_dat_do;
- assign wb_ack_o = counter_timer_reg_cfg_sel || counter_timer_reg_val_sel ||
- counter_timer_reg_dat_sel;
-
- counter_timer_low counter_timer_low_inst (
- .resetn(resetn),
- .clkin(wb_clk_i),
- .reg_val_we(reg_val_we),
- .reg_val_di(mem_wdata),
- .reg_val_do(counter_timer_reg_val_do),
- .reg_cfg_we(reg_cfg_we),
- .reg_cfg_di(mem_wdata),
- .reg_cfg_do(counter_timer_reg_cfg_do),
- .reg_dat_we(reg_dat_we),
- .reg_dat_di(mem_wdata),
- .reg_dat_do(counter_timer_reg_dat_do),
- .stop_in(stop_in),
- .strobe(strobe),
- .is_offset(is_offset),
- .enable_in(enable_in),
- .stop_out(stop_out),
- .enable_out(enable_out),
- .irq_out(irq)
- );
-
-endmodule
-
-module counter_timer_low (
- input resetn,
- input clkin,
-
- input [3:0] reg_val_we,
- input [31:0] reg_val_di,
- output [31:0] reg_val_do,
-
- input reg_cfg_we,
- input [31:0] reg_cfg_di,
- output [31:0] reg_cfg_do,
-
- input [3:0] reg_dat_we,
- input [31:0] reg_dat_di,
- output [31:0] reg_dat_do,
-
- input stop_in,
- input enable_in,
- output strobe,
- output enable_out,
- output stop_out,
- output is_offset,
- output irq_out
-);
-
-reg [31:0] value_cur;
-reg [31:0] value_reset;
-reg irq_out;
-wire stop_in; // High 32 bits counter has stopped
-reg strobe; // Strobe to high 32 bits counter; occurs
- // one cycle before actual timeout and
- // irq signal.
-reg stop_out; // Stop condition flag
-
-wire [31:0] value_cur_plus; // Next value, on up-count
-wire [31:0] value_cur_minus; // Next value, on down-count
-wire is_offset;
-wire loc_enable;
-
-reg enable; // Enable (start) the counter/timer
-reg lastenable; // Previous state of enable (catch rising/falling edge)
-reg oneshot; // Set oneshot (1) mode or continuous (0) mode
-reg updown; // Count up (1) or down (0)
-reg irq_ena; // Enable interrupt on timeout
-reg chain; // Chain to a secondary timer
-
-// Configuration register
-
-assign reg_cfg_do = {27'd0, irq_ena, chain, updown, oneshot, enable};
-
-always @(posedge clkin or negedge resetn) begin
- if (resetn == 1'b0) begin
- enable <= 1'b0;
- oneshot <= 1'b0;
- updown <= 1'b0;
- chain <= 1'b0;
- irq_ena <= 1'b0;
- end else begin
- if (reg_cfg_we) begin
- enable <= reg_cfg_di[0];
- oneshot <= reg_cfg_di[1];
- updown <= reg_cfg_di[2];
- chain <= reg_cfg_di[3];
- irq_ena <= reg_cfg_di[4];
- end
- end
-end
-
-// Counter/timer reset value register
-
-assign reg_val_do = value_reset;
-
-always @(posedge clkin or negedge resetn) begin
- if (resetn == 1'b0) begin
- value_reset <= 32'd0;
- end else begin
- if (reg_val_we[3]) value_reset[31:24] <= reg_val_di[31:24];
- if (reg_val_we[2]) value_reset[23:16] <= reg_val_di[23:16];
- if (reg_val_we[1]) value_reset[15:8] <= reg_val_di[15:8];
- if (reg_val_we[0]) value_reset[7:0] <= reg_val_di[7:0];
- end
-end
-
-assign reg_dat_do = value_cur;
-
-// Counter/timer current value register and timer implementation
-
-assign value_cur_plus = value_cur + 1;
-assign value_cur_minus = value_cur - 1;
-
-assign loc_enable = (chain == 1'b1) ? (enable && enable_in) : enable;
-assign enable_out = enable;
-
-// If counting up and the stop condition on the low 32 bits is zero,
-// then signal to the high word counter that the stop condition of the
-// high word must be adjusted by one, since it will roll over at the same
-// time and must be signaled early.
-
-assign is_offset = ((updown == 1'b1) && (value_reset == 0));
-
-// When acting as low 32-bit word of a 64-bit chained counter:
-// It sets the output strobe on the stop condition, one cycle early.
-// It stops on the stop condition if "stop_in" is high.
-
-always @(posedge clkin or negedge resetn) begin
- if (resetn == 1'b0) begin
- value_cur <= 32'd0;
- strobe <= 1'b0;
- stop_out <= 1'b0;
- irq_out <= 1'b0;
- lastenable <= 1'b0;
- end else begin
- lastenable <= loc_enable;
-
- if (reg_dat_we != 4'b0000) begin
- if (reg_dat_we[3] == 1'b1) value_cur[31:24] <= reg_dat_di[31:24];
- if (reg_dat_we[2] == 1'b1) value_cur[23:16] <= reg_dat_di[23:16];
- if (reg_dat_we[1] == 1'b1) value_cur[15:8] <= reg_dat_di[15:8];
- if (reg_dat_we[0] == 1'b1) value_cur[7:0] <= reg_dat_di[7:0];
-
- end else if (loc_enable == 1'b1) begin
- /* IRQ signals one cycle after stop_out, if IRQ is enabled */
- /* IRQ lasts for one clock cycle only. */
- irq_out <= (irq_ena) ? (stop_out & ~irq_out) : 1'b0;
-
- if (updown == 1'b1) begin
- if (lastenable == 1'b0) begin
- value_cur <= 32'd0;
- strobe <= 1'b0;
- stop_out <= 1'b0;
- end else if (chain == 1'b1) begin
- // Rollover strobe (2 clock cycles advanced)
- if (value_cur == -1) begin
- strobe <= 1'b1;
- end else begin
- strobe <= 1'b0;
- end
-
- // Chained counter behavior
- if ((stop_in == 1'b1) && (value_cur == value_reset)) begin
- if (oneshot != 1'b1) begin
- value_cur <= 32'd0;
- stop_out <= 1'b0;
- end else begin
- stop_out <= 1'b1;
- end
- end else begin
- if ((stop_in == 1'b1) && (value_cur_plus == value_reset)) begin
- stop_out <= 1'b1;
- end else begin
- stop_out <= 1'b0;
- end
- value_cur <= value_cur_plus; // count up
- end
- end else begin
-
- // Single 32-bit counter behavior
- if (value_cur == value_reset) begin
- if (oneshot != 1'b1) begin
- value_cur <= 32'd0;
- stop_out <= 1'b0;
- end else begin
- stop_out <= 1'b1;
- end
- end else begin
- if (value_cur_plus == value_reset) begin
- stop_out <= 1'b1;
- end else begin
- stop_out <= 1'b0;
- end
- value_cur <= value_cur_plus; // count up
- end
- end
- end else begin
- if (lastenable == 1'b0) begin
- value_cur <= value_reset;
- stop_out <= 1'b0;
- strobe <= 1'b0;
- end else if (chain == 1'b1) begin
- // Rollover strobe (2 clock cycles advanced)
- if (value_cur == 2) begin
- strobe <= 1'b1;
- end else begin
- strobe <= 1'b0;
- end
-
- // Chained counter behavior
- if ((stop_in == 1'b1) && (value_cur == 32'd0)) begin
- if (oneshot != 1'b1) begin
- value_cur <= value_reset;
- stop_out <= 1'b0;
- end else begin
- stop_out <= 1'b1;
- end
- end else begin
- if ((stop_in == 1'b1) && (value_cur_minus == 32'd0)) begin
- stop_out <= 1'b1;
- end else begin
- stop_out <= 1'b0;
- end
- value_cur <= value_cur_minus; // count down
- end
- end else begin
-
- // Single 32-bit counter behavior
- if (value_cur == 32'd0) begin
- if (oneshot != 1'b1) begin
- value_cur <= value_reset;
- stop_out <= 1'b0;
- end else begin
- stop_out <= 1'b1;
- end
- end else begin
- if (value_cur_minus == 32'd0) begin
- stop_out <= 1'b1;
- end else begin
- stop_out <= 1'b0;
- end
- value_cur <= value_cur_minus; // count down
- end
- end
- end
- end else begin
- strobe <= 1'b0;
- end
- end
-end
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/defines.v b/caravel/rtl/defines.v
deleted file mode 100644
index 9c3120c..0000000
--- a/caravel/rtl/defines.v
+++ /dev/null
@@ -1,62 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-
-`ifndef __GLOBAL_DEFINE_H
-// Global parameters
-`define __GLOBAL_DEFINE_H
-
-`define MPRJ_IO_PADS_1 19 /* number of user GPIO pads on user1 side */
-`define MPRJ_IO_PADS_2 19 /* number of user GPIO pads on user2 side */
-`define MPRJ_IO_PADS (`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2)
-
-`define MPRJ_PWR_PADS_1 2 /* vdda1, vccd1 enable/disable control */
-`define MPRJ_PWR_PADS_2 2 /* vdda2, vccd2 enable/disable control */
-`define MPRJ_PWR_PADS (`MPRJ_PWR_PADS_1 + `MPRJ_PWR_PADS_2)
-
-// Analog pads are only used by the "caravan" module and associated
-// modules such as user_analog_project_wrapper and chip_io_alt.
-
-`define ANALOG_PADS_1 5
-`define ANALOG_PADS_2 6
-
-`define ANALOG_PADS (`ANALOG_PADS_1 + `ANALOG_PADS_2)
-
-// Size of soc_mem_synth
-
-// Type and size of soc_mem
-// `define USE_OPENRAM
-`define USE_CUSTOM_DFFRAM
-// don't change the following without double checking addr widths
-`define MEM_WORDS 256
-
-// Number of columns in the custom memory; takes one of three values:
-// 1 column : 1 KB, 2 column: 2 KB, 4 column: 4KB
-`define DFFRAM_WSIZE 4
-`define DFFRAM_USE_LATCH 0
-
-// not really parameterized but just to easily keep track of the number
-// of ram_block across different modules
-`define RAM_BLOCKS 2
-
-// Clock divisor default value
-`define CLK_DIV 3'b010
-
-// GPIO conrol default mode and enable
-`define DM_INIT 3'b110
-`define OENB_INIT 1'b1
-
-`endif // __GLOBAL_DEFINE_H
diff --git a/caravel/rtl/digital_pll.v b/caravel/rtl/digital_pll.v
deleted file mode 100644
index b8dd69e..0000000
--- a/caravel/rtl/digital_pll.v
+++ /dev/null
@@ -1,71 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-// Digital PLL (ring oscillator + controller)
-// Technically this is a frequency locked loop, not a phase locked loop.
-
-`include "digital_pll_controller.v"
-`include "ring_osc2x13.v"
-
-module digital_pll(
-`ifdef USE_POWER_PINS
- VPWR,
- VGND,
-`endif
- resetb, enable, osc, clockp, div, dco, ext_trim);
-
-`ifdef USE_POWER_PINS
- input VPWR;
- input VGND;
-`endif
-
- input resetb; // Sense negative reset
- input enable; // Enable PLL
- input osc; // Input oscillator to match
- input [4:0] div; // PLL feedback division ratio
- input dco; // Run in DCO mode
- input [25:0] ext_trim; // External trim for DCO mode
-
- output [1:0] clockp; // Two 90 degree clock phases
-
- wire [25:0] itrim; // Internally generated trim bits
- wire [25:0] otrim; // Trim bits applied to the ring oscillator
- wire creset; // Controller reset
- wire ireset; // Internal reset (external reset OR disable)
-
- assign ireset = ~resetb | ~enable;
-
- // In DCO mode: Hold controller in reset and apply external trim value
-
- assign itrim = (dco == 1'b0) ? otrim : ext_trim;
- assign creset = (dco == 1'b0) ? ireset : 1'b1;
-
- ring_osc2x13 ringosc (
- .reset(ireset),
- .trim(itrim),
- .clockp(clockp)
- );
-
- digital_pll_controller pll_control (
- .reset(creset),
- .clock(clockp[0]),
- .osc(osc),
- .div(div),
- .trim(otrim)
- );
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/digital_pll_controller.v b/caravel/rtl/digital_pll_controller.v
deleted file mode 100644
index ae13d9d..0000000
--- a/caravel/rtl/digital_pll_controller.v
+++ /dev/null
@@ -1,136 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-// (True) digital PLL
-//
-// Output goes to a trimmable ring oscillator (see documentation).
-// Ring oscillator should be trimmable to above and below maximum
-// ranges of the input.
-//
-// Input "osc" comes from a fixed clock source (e.g., crystal oscillator
-// output).
-//
-// Input "div" is the target number of clock cycles per oscillator cycle.
-// e.g., if div == 8 then this is an 8X PLL.
-//
-// Clock "clock" is the PLL output being trimmed.
-// (NOTE: To be done: Pass-through enable)
-//
-// Algorithm:
-//
-// 1) Trim is done by thermometer code. Reset to the highest value
-// in case the fastest rate clock is too fast for the logic.
-//
-// 2) Count the number of contiguous 1s and 0s in "osc"
-// periods of the master clock. If the count maxes out, it does
-// not roll over.
-//
-// 3) Add the two counts together.
-//
-// 4) If the sum is less than div, then the clock is too slow, so
-// decrease the trim code. If the sum is greater than div, the
-// clock is too fast, so increase the trim code. If the sum
-// is equal to div, the the trim code does not change.
-//
-
-module digital_pll_controller(reset, clock, osc, div, trim);
- input reset;
- input clock;
- input osc;
- input [4:0] div;
- output [25:0] trim; // Use ring_osc2x13, with 26 trim bits
-
- wire [25:0] trim;
- reg [2:0] oscbuf;
- reg [2:0] prep;
-
- reg [4:0] count0;
- reg [4:0] count1;
- reg [6:0] tval; // Includes 2 bits fractional
- wire [4:0] tint; // Integer part of the above
-
- wire [5:0] sum;
-
- assign sum = count0 + count1;
-
- // Integer to thermometer code (maybe there's an algorithmic way?)
- assign tint = tval[6:2];
- // |<--second-->|<-- first-->|
- assign trim = (tint == 5'd0) ? 26'b0000000000000_0000000000000 :
- (tint == 5'd1) ? 26'b0000000000000_0000000000001 :
- (tint == 5'd2) ? 26'b0000000000000_0000001000001 :
- (tint == 5'd3) ? 26'b0000000000000_0010001000001 :
- (tint == 5'd4) ? 26'b0000000000000_0010001001001 :
- (tint == 5'd5) ? 26'b0000000000000_0010101001001 :
- (tint == 5'd6) ? 26'b0000000000000_1010101001001 :
- (tint == 5'd7) ? 26'b0000000000000_1010101101001 :
- (tint == 5'd8) ? 26'b0000000000000_1010101101101 :
- (tint == 5'd9) ? 26'b0000000000000_1011101101101 :
- (tint == 5'd10) ? 26'b0000000000000_1011101111101 :
- (tint == 5'd11) ? 26'b0000000000000_1111101111101 :
- (tint == 5'd12) ? 26'b0000000000000_1111101111111 :
- (tint == 5'd13) ? 26'b0000000000000_1111111111111 :
- (tint == 5'd14) ? 26'b0000000000001_1111111111111 :
- (tint == 5'd15) ? 26'b0000001000001_1111111111111 :
- (tint == 5'd16) ? 26'b0010001000001_1111111111111 :
- (tint == 5'd17) ? 26'b0010001001001_1111111111111 :
- (tint == 5'd18) ? 26'b0010101001001_1111111111111 :
- (tint == 5'd19) ? 26'b1010101001001_1111111111111 :
- (tint == 5'd20) ? 26'b1010101101001_1111111111111 :
- (tint == 5'd21) ? 26'b1010101101101_1111111111111 :
- (tint == 5'd22) ? 26'b1011101101101_1111111111111 :
- (tint == 5'd23) ? 26'b1011101111101_1111111111111 :
- (tint == 5'd24) ? 26'b1111101111101_1111111111111 :
- (tint == 5'd25) ? 26'b1111101111111_1111111111111 :
- 26'b1111111111111_1111111111111;
-
- always @(posedge clock or posedge reset) begin
- if (reset == 1'b1) begin
- tval <= 7'd0; // Note: trim[0] must be zero for startup to work.
- oscbuf <= 3'd0;
- prep <= 3'd0;
- count0 <= 5'd0;
- count1 <= 5'd0;
-
- end else begin
- oscbuf <= {oscbuf[1:0], osc};
-
- if (oscbuf[2] != oscbuf[1]) begin
- count1 <= count0;
- count0 <= 5'b00001;
- prep <= {prep[1:0], 1'b1};
-
- if (prep == 3'b111) begin
- if (sum > div) begin
- if (tval < 127) begin
- tval <= tval + 1;
- end
- end else if (sum < div) begin
- if (tval > 0) begin
- tval <= tval - 1;
- end
- end
- end
- end else begin
- if (count0 != 5'b11111) begin
- count0 <= count0 + 1;
- end
- end
- end
- end
-
-endmodule // digital_pll_controller
-`default_nettype wire
diff --git a/caravel/rtl/gpio_control_block.v b/caravel/rtl/gpio_control_block.v
deleted file mode 100644
index 48f3979..0000000
--- a/caravel/rtl/gpio_control_block.v
+++ /dev/null
@@ -1,278 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-/*
- *---------------------------------------------------------------------
- * See gpio_control_block for description. This module is like
- * gpio_contro_block except that it has an additional two management-
- * Soc-facing pins, which are the out_enb line and the output line.
- * If the chip is configured for output with the oeb control
- * register = 1, then the oeb line is controlled by the additional
- * signal from the management SoC. If the oeb control register = 0,
- * then the output is disabled completely. The "io" line is input
- * only in this module.
- *
- *---------------------------------------------------------------------
- */
-
-/*
- *---------------------------------------------------------------------
- *
- * This module instantiates a shift register chain that passes through
- * each gpio cell. These are connected end-to-end around the padframe
- * periphery. The purpose is to avoid a massive number of control
- * wires between the digital core and I/O, passing through the user area.
- *
- * See mprj_ctrl.v for the module that registers the data for each
- * I/O and drives the input to the shift register.
- *
- *---------------------------------------------------------------------
- */
-
-module gpio_control_block #(
- parameter PAD_CTRL_BITS = 13,
- // Parameterized initial startup state of the pad.
- // The default parameters if unspecified is for the pad to be
- // an input with no pull-up or pull-down, so that it is disconnected
- // from the outside world.
- parameter HOLD_INIT = 1'b0,
- parameter SLOW_INIT = 1'b0,
- parameter TRIP_INIT = 1'b0,
- parameter IB_INIT = 1'b0,
- parameter IENB_INIT = 1'b0,
- parameter OENB_INIT = `OENB_INIT,
- parameter DM_INIT = `DM_INIT,
- parameter AENA_INIT = 1'b0,
- parameter ASEL_INIT = 1'b0,
- parameter APOL_INIT = 1'b0
-) (
- `ifdef USE_POWER_PINS
- inout vccd,
- inout vssd,
- inout vccd1,
- inout vssd1,
- `endif
-
- // Management Soc-facing signals
- input resetn, // Global reset, locally propagated
- output resetn_out,
- input serial_clock, // Global clock, locally propatated
- output serial_clock_out,
-
- output mgmt_gpio_in, // Management from pad (input only)
- input mgmt_gpio_out, // Management to pad (output only)
- input mgmt_gpio_oeb, // Management to pad (output only)
-
- // Serial data chain for pad configuration
- input serial_data_in,
- output serial_data_out,
-
- // User-facing signals
- input user_gpio_out, // User space to pad
- input user_gpio_oeb, // Output enable (user)
- output user_gpio_in, // Pad to user space
-
- // Pad-facing signals (Pad GPIOv2)
- output pad_gpio_holdover,
- output pad_gpio_slow_sel,
- output pad_gpio_vtrip_sel,
- output pad_gpio_inenb,
- output pad_gpio_ib_mode_sel,
- output pad_gpio_ana_en,
- output pad_gpio_ana_sel,
- output pad_gpio_ana_pol,
- output [2:0] pad_gpio_dm,
- output pad_gpio_outenb,
- output pad_gpio_out,
- input pad_gpio_in,
-
- // to provide a way to automatically disable/enable output
- // from the outside with needing a conb cell
- output one,
- output zero
-);
-
- /* Parameters defining the bit offset of each function in the chain */
- localparam MGMT_EN = 0;
- localparam OEB = 1;
- localparam HLDH = 2;
- localparam INP_DIS = 3;
- localparam MOD_SEL = 4;
- localparam AN_EN = 5;
- localparam AN_SEL = 6;
- localparam AN_POL = 7;
- localparam SLOW = 8;
- localparam TRIP = 9;
- localparam DM = 10;
-
- /* Internally registered signals */
- reg mgmt_ena; // Enable management SoC to access pad
- reg gpio_holdover;
- reg gpio_slow_sel;
- reg gpio_vtrip_sel;
- reg gpio_inenb;
- reg gpio_ib_mode_sel;
- reg gpio_outenb;
- reg [2:0] gpio_dm;
- reg gpio_ana_en;
- reg gpio_ana_sel;
- reg gpio_ana_pol;
-
- /* Derived output values */
- wire pad_gpio_holdover;
- wire pad_gpio_slow_sel;
- wire pad_gpio_vtrip_sel;
- wire pad_gpio_inenb;
- wire pad_gpio_ib_mode_sel;
- wire pad_gpio_ana_en;
- wire pad_gpio_ana_sel;
- wire pad_gpio_ana_pol;
- wire [2:0] pad_gpio_dm;
- wire pad_gpio_outenb;
- wire pad_gpio_out;
- wire pad_gpio_in;
- wire one;
- wire zero;
-
- wire user_gpio_in;
- wire gpio_in_unbuf;
- wire gpio_logic1;
-
- /* Serial shift for the above (latched) values */
- reg [PAD_CTRL_BITS-1:0] shift_register;
-
- /* Utilize reset and clock to encode a load operation */
- wire load_data;
- wire int_reset;
-
- /* Create internal reset and load signals from input reset and clock */
- assign serial_data_out = shift_register[PAD_CTRL_BITS-1];
- assign int_reset = (~resetn) & (~serial_clock);
- assign load_data = (~resetn) & serial_clock;
-
- /* Propagate the clock and reset signals so that they aren't wired */
- /* all over the chip, but are just wired between the blocks. */
- assign serial_clock_out = serial_clock;
- assign resetn_out = resetn;
-
- always @(posedge serial_clock or posedge int_reset) begin
- if (int_reset == 1'b1) begin
- /* Clear shift register */
- shift_register <= 'd0;
- end else begin
- /* Shift data in */
- shift_register <= {shift_register[PAD_CTRL_BITS-2:0], serial_data_in};
- end
- end
-
- always @(posedge load_data or posedge int_reset) begin
- if (int_reset == 1'b1) begin
- /* Initial state on reset: Pad set to management input */
- mgmt_ena <= 1'b1; // Management SoC has control over all I/O
- gpio_holdover <= HOLD_INIT; // All signals latched in hold mode
- gpio_slow_sel <= SLOW_INIT; // Fast slew rate
- gpio_vtrip_sel <= TRIP_INIT; // CMOS mode
- gpio_ib_mode_sel <= IB_INIT; // CMOS mode
- gpio_inenb <= IENB_INIT; // Input enabled
- gpio_outenb <= OENB_INIT; // (unused placeholder)
- gpio_dm <= DM_INIT; // Configured as input only
- gpio_ana_en <= AENA_INIT; // Digital enabled
- gpio_ana_sel <= ASEL_INIT; // Don't-care when gpio_ana_en = 0
- gpio_ana_pol <= APOL_INIT; // Don't-care when gpio_ana_en = 0
- end else begin
- /* Load data */
- mgmt_ena <= shift_register[MGMT_EN];
- gpio_outenb <= shift_register[OEB];
- gpio_holdover <= shift_register[HLDH];
- gpio_inenb <= shift_register[INP_DIS];
- gpio_ib_mode_sel <= shift_register[MOD_SEL];
- gpio_ana_en <= shift_register[AN_EN];
- gpio_ana_sel <= shift_register[AN_SEL];
- gpio_ana_pol <= shift_register[AN_POL];
- gpio_slow_sel <= shift_register[SLOW];
- gpio_vtrip_sel <= shift_register[TRIP];
- gpio_dm <= shift_register[DM+2:DM];
-
- end
- end
-
- /* These pad configuration signals are static and do not change */
- /* after setup. */
-
- assign pad_gpio_holdover = gpio_holdover;
- assign pad_gpio_slow_sel = gpio_slow_sel;
- assign pad_gpio_vtrip_sel = gpio_vtrip_sel;
- assign pad_gpio_ib_mode_sel = gpio_ib_mode_sel;
- assign pad_gpio_ana_en = gpio_ana_en;
- assign pad_gpio_ana_sel = gpio_ana_sel;
- assign pad_gpio_ana_pol = gpio_ana_pol;
- assign pad_gpio_dm = gpio_dm;
- assign pad_gpio_inenb = gpio_inenb;
-
- /* Implement pad control behavior depending on state of mgmt_ena */
-
-// assign gpio_in_unbuf = (mgmt_ena) ? 1'b0 : pad_gpio_in;
-// assign mgmt_gpio_in = (mgmt_ena) ? ((gpio_inenb == 1'b0) ?
-// pad_gpio_in : 1'bz) : 1'b0;
-
- assign gpio_in_unbuf = pad_gpio_in;
- // This causes conflict if output and input drivers are both enabled. . .
- // assign mgmt_gpio_in = (gpio_inenb == 1'b0) ? pad_gpio_in : 1'bz;
- assign mgmt_gpio_in = (gpio_inenb == 1'b0 && gpio_outenb == 1'b1)? pad_gpio_in : 1'bz;
-
- assign pad_gpio_outenb = (mgmt_ena) ? ((mgmt_gpio_oeb == 1'b1) ? gpio_outenb :
- 1'b0) : user_gpio_oeb;
- assign pad_gpio_out = (mgmt_ena) ?
- ((mgmt_gpio_oeb == 1'b1) ?
- ((gpio_dm[2:1] == 2'b01) ? ~gpio_dm[0] : mgmt_gpio_out) :
- mgmt_gpio_out) :
- user_gpio_out;
-
- /* Buffer user_gpio_in with an enable that is set by the user domain vccd */
-
- gpio_logic_high gpio_logic_high (
-`ifdef USE_POWER_PINS
- .vccd1(vccd1),
- .vssd1(vssd1),
-`endif
- .gpio_logic1(gpio_logic1)
- );
-
- sky130_fd_sc_hd__einvp_8 gpio_in_buf (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Z(user_gpio_in),
- .A(~gpio_in_unbuf),
- .TE(gpio_logic1)
- );
-
- sky130_fd_sc_hd__conb_1 const_source (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .HI(one),
- .LO(zero)
- );
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/gpio_logic_high.v b/caravel/rtl/gpio_logic_high.v
deleted file mode 100644
index 2e4158e..0000000
--- a/caravel/rtl/gpio_logic_high.v
+++ /dev/null
@@ -1,21 +0,0 @@
-module gpio_logic_high(
- `ifdef USE_POWER_PINS
- inout vccd1,
- inout vssd1,
- `endif
-
- output wire gpio_logic1
-);
-
- sky130_fd_sc_hd__conb_1 gpio_logic_high (
-`ifdef USE_POWER_PINS
- .VPWR(vccd1),
- .VGND(vssd1),
- .VPB(vccd1),
- .VNB(vssd1),
-`endif
- .HI(gpio_logic1),
- .LO()
- );
-
-endmodule
diff --git a/caravel/rtl/gpio_wb.v b/caravel/rtl/gpio_wb.v
deleted file mode 100644
index 9941fc9..0000000
--- a/caravel/rtl/gpio_wb.v
+++ /dev/null
@@ -1,156 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-module gpio_wb # (
- parameter BASE_ADR = 32'h 2100_0000,
- parameter GPIO_DATA = 8'h 00,
- parameter GPIO_ENA = 8'h 04,
- parameter GPIO_PU = 8'h 08,
- parameter GPIO_PD = 8'h 0c
-) (
- input wb_clk_i,
- input wb_rst_i,
-
- input [31:0] wb_dat_i,
- input [31:0] wb_adr_i,
- input [3:0] wb_sel_i,
- input wb_cyc_i,
- input wb_stb_i,
- input wb_we_i,
-
- output [31:0] wb_dat_o,
- output wb_ack_o,
-
- input gpio_in_pad,
- output gpio,
- output gpio_oeb,
- output gpio_pu,
- output gpio_pd
-);
-
- wire resetn;
- wire valid;
- wire ready;
- wire [3:0] iomem_we;
-
- assign resetn = ~wb_rst_i;
- assign valid = wb_stb_i && wb_cyc_i;
-
- assign iomem_we = wb_sel_i & {4{wb_we_i}};
- assign wb_ack_o = ready;
-
- gpio #(
- .BASE_ADR(BASE_ADR),
- .GPIO_DATA(GPIO_DATA),
- .GPIO_ENA(GPIO_ENA),
- .GPIO_PD(GPIO_PD),
- .GPIO_PU(GPIO_PU)
- ) gpio_ctrl (
- .clk(wb_clk_i),
- .resetn(resetn),
-
- .gpio_in_pad(gpio_in_pad),
-
- .iomem_addr(wb_adr_i),
- .iomem_valid(valid),
- .iomem_wstrb(iomem_we[0]),
- .iomem_wdata(wb_dat_i),
- .iomem_rdata(wb_dat_o),
- .iomem_ready(ready),
-
- .gpio(gpio),
- .gpio_oeb(gpio_oeb),
- .gpio_pu(gpio_pu),
- .gpio_pd(gpio_pd)
- );
-
-endmodule
-
-module gpio #(
- parameter BASE_ADR = 32'h 2100_0000,
- parameter GPIO_DATA = 8'h 00,
- parameter GPIO_ENA = 8'h 04,
- parameter GPIO_PU = 8'h 08,
- parameter GPIO_PD = 8'h 0c
-) (
- input clk,
- input resetn,
-
- input gpio_in_pad,
-
- input [31:0] iomem_addr,
- input iomem_valid,
- input iomem_wstrb,
- input [31:0] iomem_wdata,
- output reg [31:0] iomem_rdata,
- output reg iomem_ready,
-
- output gpio,
- output gpio_oeb,
- output gpio_pu,
- output gpio_pd
-);
-
- reg gpio; // GPIO output data
- reg gpio_pu; // GPIO pull-up enable
- reg gpio_pd; // GPIO pull-down enable
- reg gpio_oeb; // GPIO output enable (sense negative)
-
- wire gpio_sel;
- wire gpio_oeb_sel;
- wire gpio_pu_sel;
- wire gpio_pd_sel;
-
- assign gpio_sel = (iomem_addr[7:0] == GPIO_DATA);
- assign gpio_oeb_sel = (iomem_addr[7:0] == GPIO_ENA);
- assign gpio_pu_sel = (iomem_addr[7:0] == GPIO_PU);
- assign gpio_pd_sel = (iomem_addr[7:0] == GPIO_PD);
-
- always @(posedge clk) begin
- if (!resetn) begin
- gpio <= 0;
- gpio_oeb <= 16'hffff;
- gpio_pu <= 0;
- gpio_pd <= 0;
- end else begin
- iomem_ready <= 0;
- if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
- iomem_ready <= 1'b 1;
-
- if (gpio_sel) begin
- iomem_rdata <= {30'd0, gpio, gpio_in_pad};
- if (iomem_wstrb) gpio <= iomem_wdata[0];
-
- end else if (gpio_oeb_sel) begin
- iomem_rdata <= {31'd0, gpio_oeb};
- if (iomem_wstrb) gpio_oeb <= iomem_wdata[0];
-
- end else if (gpio_pu_sel) begin
- iomem_rdata <= {31'd0, gpio_pu};
- if (iomem_wstrb) gpio_pu <= iomem_wdata[0];
-
- end else if (gpio_pd_sel) begin
- iomem_rdata <= {31'd0, gpio_pd};
- if (iomem_wstrb) gpio_pd <= iomem_wdata[0];
-
- end
-
- end
- end
- end
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/housekeeping_spi.v b/caravel/rtl/housekeeping_spi.v
deleted file mode 100644
index 7ed3b2f..0000000
--- a/caravel/rtl/housekeeping_spi.v
+++ /dev/null
@@ -1,500 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-//-------------------------------------
-// SPI controller for Caravel (PicoSoC)
-//-------------------------------------
-// Written by Tim Edwards
-// efabless, inc. September 27, 2020
-//-------------------------------------
-
-//-----------------------------------------------------------
-// This is a standalone slave SPI for the caravel chip that is
-// intended to be independent of the picosoc and independent
-// of all IP blocks except the power-on-reset. This SPI has
-// register outputs controlling the functions that critically
-// affect operation of the picosoc and so cannot be accessed
-// from the picosoc itself. This includes the PLL enables
-// and trim, and the crystal oscillator enable. It also has
-// a general reset for the picosoc, an IRQ input, a bypass for
-// the entire crystal oscillator and PLL chain, the
-// manufacturer and product IDs and product revision number.
-// To be independent of the 1.8V regulator, the slave SPI is
-// synthesized with the 3V digital library and runs off of
-// the 3V supply.
-//
-// This module is designed to be decoupled from the chip
-// padframe and redirected to the wishbone bus under
-// register control from the management SoC, such that the
-// contents can be accessed from the management core via the
-// SPI master.
-//
-//-----------------------------------------------------------
-
-//------------------------------------------------------------
-// Caravel defined registers:
-// Register 0: SPI status and control (unused & reserved)
-// Register 1 and 2: Manufacturer ID (0x0456) (readonly)
-// Register 3: Product ID (= 16) (readonly)
-// Register 4-7: Mask revision (readonly) --- Externally programmed
-// with via programming. Via programmed with a script to match
-// each customer ID.
-//
-// Register 8: PLL enables (2 bits)
-// Register 9: PLL bypass (1 bit)
-// Register 10: IRQ (1 bit)
-// Register 11: reset (1 bit)
-// Register 12: trap (1 bit) (readonly)
-// Register 13-16: PLL trim (26 bits)
-// Register 17: PLL output divider (3 bits)
-// Register 18: PLL feedback divider (5 bits)
-//------------------------------------------------------------
-
-module housekeeping_spi(
-`ifdef USE_POWER_PINS
- vdd, vss,
-`endif
- RSTB, SCK, SDI, CSB, SDO, sdo_enb,
- pll_ena, pll_dco_ena, pll_div, pll_sel,
- pll90_sel, pll_trim, pll_bypass, irq, reset,
- trap, mask_rev_in,
- pass_thru_mgmt_reset, pass_thru_user_reset,
- pass_thru_mgmt_sck, pass_thru_mgmt_csb,
- pass_thru_mgmt_sdi, pass_thru_mgmt_sdo,
- pass_thru_user_sck, pass_thru_user_csb,
- pass_thru_user_sdi, pass_thru_user_sdo
-);
-
-`ifdef USE_POWER_PINS
- inout vdd; // 3.3V supply
- inout vss; // common ground
-`endif
-
- input RSTB; // from padframe
-
- input SCK; // from padframe
- input SDI; // from padframe
- input CSB; // from padframe
- output SDO; // to padframe
- output sdo_enb; // to padframe
-
- output pll_ena;
- output pll_dco_ena;
- output [4:0] pll_div;
- output [2:0] pll_sel;
- output [2:0] pll90_sel;
- output [25:0] pll_trim;
- output pll_bypass;
- output irq;
- output reset;
- input trap;
- input [31:0] mask_rev_in; // metal programmed; 3.3V domain
-
- // Pass-through programming mode for management area SPI flash
- output pass_thru_mgmt_reset;
- output pass_thru_user_reset;
- output pass_thru_mgmt_sck;
- output pass_thru_mgmt_csb;
- output pass_thru_mgmt_sdi;
- input pass_thru_mgmt_sdo;
-
- // Pass-through programming mode for user area SPI flash
- output pass_thru_user_sck;
- output pass_thru_user_csb;
- output pass_thru_user_sdi;
- input pass_thru_user_sdo;
-
- reg [25:0] pll_trim;
- reg [4:0] pll_div;
- reg [2:0] pll_sel;
- reg [2:0] pll90_sel;
- reg pll_dco_ena;
- reg pll_ena;
- reg pll_bypass;
- reg reset_reg;
- reg irq;
-
- wire [7:0] odata;
- wire [7:0] idata;
- wire [7:0] iaddr;
-
- wire trap;
- wire rdstb;
- wire wrstb;
- wire pass_thru_mgmt; // Mode detected by spi_slave
- wire pass_thru_mgmt_delay;
- wire pass_thru_user; // Mode detected by spi_slave
- wire pass_thru_user_delay;
- wire loc_sdo;
-
- // Pass-through mode handling. Signals may only be applied when the
- // core processor is in reset.
-
- assign pass_thru_mgmt_csb = ~pass_thru_mgmt_delay;
- assign pass_thru_mgmt_sck = (pass_thru_mgmt ? SCK : 1'b0);
- assign pass_thru_mgmt_sdi = (pass_thru_mgmt_delay ? SDI : 1'b0);
-
- assign pass_thru_user_csb = ~pass_thru_user_delay;
- assign pass_thru_user_sck = (pass_thru_user ? SCK : 1'b0);
- assign pass_thru_user_sdi = (pass_thru_user_delay ? SDI : 1'b0);
-
- assign SDO = pass_thru_mgmt ? pass_thru_mgmt_sdo :
- pass_thru_user ? pass_thru_user_sdo : loc_sdo;
- assign reset = pass_thru_mgmt_reset ? 1'b1 : reset_reg;
-
- // Instantiate the SPI slave module
-
- housekeeping_spi_slave U1 (
- .reset(~RSTB),
- .SCK(SCK),
- .SDI(SDI),
- .CSB(CSB),
- .SDO(loc_sdo),
- .sdoenb(sdo_enb),
- .idata(odata),
- .odata(idata),
- .oaddr(iaddr),
- .rdstb(rdstb),
- .wrstb(wrstb),
- .pass_thru_mgmt(pass_thru_mgmt),
- .pass_thru_mgmt_delay(pass_thru_mgmt_delay),
- .pass_thru_user(pass_thru_user),
- .pass_thru_user_delay(pass_thru_user_delay),
- .pass_thru_mgmt_reset(pass_thru_mgmt_reset),
- .pass_thru_user_reset(pass_thru_user_reset)
- );
-
- wire [11:0] mfgr_id;
- wire [7:0] prod_id;
- wire [31:0] mask_rev;
-
- assign mfgr_id = 12'h456; // Hard-coded
- assign prod_id = 8'h10; // Hard-coded
- assign mask_rev = mask_rev_in; // Copy in to out.
-
- // Send register contents to odata on SPI read command
- // All values are 1-4 bits and no shadow registers are required.
-
- assign odata =
- (iaddr == 8'h00) ? 8'h00 : // SPI status (fixed)
- (iaddr == 8'h01) ? {4'h0, mfgr_id[11:8]} : // Manufacturer ID (fixed)
- (iaddr == 8'h02) ? mfgr_id[7:0] : // Manufacturer ID (fixed)
- (iaddr == 8'h03) ? prod_id : // Product ID (fixed)
- (iaddr == 8'h04) ? mask_rev[31:24] : // Mask rev (metal programmed)
- (iaddr == 8'h05) ? mask_rev[23:16] : // Mask rev (metal programmed)
- (iaddr == 8'h06) ? mask_rev[15:8] : // Mask rev (metal programmed)
- (iaddr == 8'h07) ? mask_rev[7:0] : // Mask rev (metal programmed)
-
- (iaddr == 8'h08) ? {6'b000000, pll_dco_ena, pll_ena} :
- (iaddr == 8'h09) ? {7'b0000000, pll_bypass} :
- (iaddr == 8'h0a) ? {7'b0000000, irq} :
- (iaddr == 8'h0b) ? {7'b0000000, reset} :
- (iaddr == 8'h0c) ? {7'b0000000, trap} :
- (iaddr == 8'h0d) ? pll_trim[7:0] :
- (iaddr == 8'h0e) ? pll_trim[15:8] :
- (iaddr == 8'h0f) ? pll_trim[23:16] :
- (iaddr == 8'h10) ? {6'b000000, pll_trim[25:24]} :
- (iaddr == 8'h11) ? {2'b00, pll90_sel, pll_sel} :
- (iaddr == 8'h12) ? {3'b000, pll_div} :
- 8'h00; // Default
-
- // Register mapping and I/O to slave module
-
- always @(posedge SCK or negedge RSTB) begin
- if (RSTB == 1'b0) begin
- // Set trim for PLL at (almost) slowest rate (~90MHz). However,
- // pll_trim[12] must be set to zero for proper startup.
- pll_trim <= 26'b11111111111110111111111111;
- pll_sel <= 3'b010; // Default output divider divide-by-2
- pll90_sel <= 3'b010; // Default secondary output divider divide-by-2
- pll_div <= 5'b00100; // Default feedback divider divide-by-8
- pll_dco_ena <= 1'b1; // Default free-running PLL
- pll_ena <= 1'b0; // Default PLL turned off
- pll_bypass <= 1'b1; // Default bypass mode (don't use PLL)
- irq <= 1'b0;
- reset_reg <= 1'b0;
- end else if (wrstb == 1'b1) begin
- case (iaddr)
- 8'h08: begin
- pll_ena <= idata[0];
- pll_dco_ena <= idata[1];
- end
- 8'h09: begin
- pll_bypass <= idata[0];
- end
- 8'h0a: begin
- irq <= idata[0];
- end
- 8'h0b: begin
- reset_reg <= idata[0];
- end
- // Register 0xc is read-only
- 8'h0d: begin
- pll_trim[7:0] <= idata;
- end
- 8'h0e: begin
- pll_trim[15:8] <= idata;
- end
- 8'h0f: begin
- pll_trim[23:16] <= idata;
- end
- 8'h10: begin
- pll_trim[25:24] <= idata[1:0];
- end
- 8'h11: begin
- pll_sel <= idata[2:0];
- pll90_sel <= idata[5:3];
- end
- 8'h12: begin
- pll_div <= idata[4:0];
- end
- endcase // (iaddr)
- end
- end
-endmodule // housekeeping_spi
-
-//------------------------------------------------------
-// housekeeping_spi_slave.v
-//------------------------------------------------------
-// General purpose SPI slave module for the Caravel chip
-//------------------------------------------------------
-// Written by Tim Edwards
-// efabless, inc., September 28, 2020
-//------------------------------------------------
-// This file is distributed free and open source
-//------------------------------------------------
-
-// SCK --- Clock input
-// SDI --- Data input
-// SDO --- Data output
-// CSB --- Chip select (sense negative)
-// idata --- Data from chip to transmit out, in 8 bits
-// odata --- Input data to chip, in 8 bits
-// addr --- Decoded address to upstream circuits
-// rdstb --- Read strobe, tells upstream circuit to supply next byte to idata
-// wrstb --- Write strobe, tells upstream circuit to latch odata.
-
-// Data format (general purpose):
-// 8 bit format
-// 1st byte: Command word (see below)
-// 2nd byte: Address word (register 0 to 255)
-// 3rd byte: Data word (value 0 to 255)
-
-// Command format:
-// 00000000 No operation
-// 10000000 Write until CSB raised
-// 01000000 Read until CSB raised
-// 11000000 Simultaneous read/write until CSB raised
-// 11000100 Pass-through read/write to management area flash SPI until CSB raised
-// 11000010 Pass-through read/write to user area flash SPI until CSB raised
-// wrnnn000 Read/write as above, for nnn = 1 to 7 bytes, then terminate
-
-// Lower three bits are reserved for future use.
-// All serial bytes are read and written msb first.
-
-// Fixed control and status registers
-
-// Address 0 is reserved and contains flags for SPI mode. This is
-// currently undefined and is always value 0.
-// Address 1 is reserved and contains manufacturer ID low 8 bits.
-// Address 2 is reserved and contains manufacturer ID high 4 bits.
-// Address 3 is reserved and contains product ID (8 bits).
-// Addresses 4 to 7 are reserved and contain the mask ID (32 bits).
-// Addresses 8 to 255 are available for general purpose use.
-
-`define COMMAND 3'b000
-`define ADDRESS 3'b001
-`define DATA 3'b010
-`define USERPASS 3'b100
-`define MGMTPASS 3'b101
-
-module housekeeping_spi_slave(reset, SCK, SDI, CSB, SDO,
- sdoenb, idata, odata, oaddr, rdstb, wrstb,
- pass_thru_mgmt, pass_thru_mgmt_delay,
- pass_thru_user, pass_thru_user_delay,
- pass_thru_mgmt_reset, pass_thru_user_reset);
-
- input reset;
- input SCK;
- input SDI;
- input CSB;
- output SDO;
- output sdoenb;
- input [7:0] idata;
- output [7:0] odata;
- output [7:0] oaddr;
- output rdstb;
- output wrstb;
- output pass_thru_mgmt;
- output pass_thru_mgmt_delay;
- output pass_thru_user;
- output pass_thru_user_delay;
- output pass_thru_mgmt_reset;
- output pass_thru_user_reset;
-
- reg [7:0] addr;
- reg wrstb;
- reg rdstb;
- reg sdoenb;
- reg [2:0] state;
- reg [2:0] count;
- reg writemode;
- reg readmode;
- reg [2:0] fixed;
- wire [7:0] odata;
- reg [6:0] predata;
- wire [7:0] oaddr;
- reg [7:0] ldata;
- reg pass_thru_mgmt;
- reg pass_thru_mgmt_delay;
- reg pre_pass_thru_mgmt;
- reg pass_thru_user;
- reg pass_thru_user_delay;
- reg pre_pass_thru_user;
- wire csb_reset;
-
- assign odata = {predata, SDI};
- assign oaddr = (state == `ADDRESS) ? {addr[6:0], SDI} : addr;
- assign SDO = ldata[7];
- assign csb_reset = CSB | reset;
- assign pass_thru_mgmt_reset = pass_thru_mgmt_delay | pre_pass_thru_mgmt;
- assign pass_thru_user_reset = pass_thru_user_delay | pre_pass_thru_user;
-
- // Readback data is captured on the falling edge of SCK so that
- // it is guaranteed valid at the next rising edge.
- always @(negedge SCK or posedge csb_reset) begin
- if (csb_reset == 1'b1) begin
- wrstb <= 1'b0;
- ldata <= 8'b00000000;
- sdoenb <= 1'b1;
- end else begin
-
- // After CSB low, 1st SCK starts command
-
- if (state == `DATA) begin
- if (readmode == 1'b1) begin
- sdoenb <= 1'b0;
- if (count == 3'b000) begin
- ldata <= idata;
- end else begin
- ldata <= {ldata[6:0], 1'b0}; // Shift out
- end
- end else begin
- sdoenb <= 1'b1;
- end
-
- // Apply write strobe on SCK negative edge on the next-to-last
- // data bit so that it updates data on the rising edge of SCK
- // on the last data bit.
-
- if (count == 3'b111) begin
- if (writemode == 1'b1) begin
- wrstb <= 1'b1;
- end
- end else begin
- wrstb <= 1'b0;
- end
- end else if (state == `MGMTPASS || state == `USERPASS) begin
- wrstb <= 1'b0;
- sdoenb <= 1'b0;
- end else begin
- wrstb <= 1'b0;
- sdoenb <= 1'b1;
- end // ! state `DATA
- end // ! csb_reset
- end // always @ ~SCK
-
- always @(posedge SCK or posedge csb_reset) begin
- if (csb_reset == 1'b1) begin
- // Default state on reset
- addr <= 8'h00;
- rdstb <= 1'b0;
- predata <= 7'b0000000;
- state <= `COMMAND;
- count <= 3'b000;
- readmode <= 1'b0;
- writemode <= 1'b0;
- fixed <= 3'b000;
- pass_thru_mgmt <= 1'b0;
- pass_thru_mgmt_delay <= 1'b0;
- pre_pass_thru_mgmt <= 1'b0;
- pass_thru_user = 1'b0;
- pass_thru_user_delay <= 1'b0;
- pre_pass_thru_user <= 1'b0;
- end else begin
- // After csb_reset low, 1st SCK starts command
- if (state == `COMMAND) begin
- rdstb <= 1'b0;
- count <= count + 1;
- if (count == 3'b000) begin
- writemode <= SDI;
- end else if (count == 3'b001) begin
- readmode <= SDI;
- end else if (count < 3'b101) begin
- fixed <= {fixed[1:0], SDI};
- end else if (count == 3'b101) begin
- pre_pass_thru_mgmt <= SDI;
- end else if (count == 3'b110) begin
- pre_pass_thru_user <= SDI;
- pass_thru_mgmt_delay <= pre_pass_thru_mgmt;
- end else if (count == 3'b111) begin
- pass_thru_user_delay <= pre_pass_thru_user;
- if (pre_pass_thru_mgmt == 1'b1) begin
- state <= `MGMTPASS;
- pre_pass_thru_mgmt <= 1'b0;
- end else if (pre_pass_thru_user == 1'b1) begin
- state <= `USERPASS;
- pre_pass_thru_user <= 1'b0;
- end else begin
- state <= `ADDRESS;
- end
- end
- end else if (state == `ADDRESS) begin
- count <= count + 1;
- addr <= {addr[6:0], SDI};
- if (count == 3'b111) begin
- if (readmode == 1'b1) begin
- rdstb <= 1'b1;
- end
- state <= `DATA;
- end else begin
- rdstb <= 1'b0;
- end
- end else if (state == `DATA) begin
- predata <= {predata[6:0], SDI};
- count <= count + 1;
- if (count == 3'b111) begin
- if (fixed == 3'b001) begin
- state <= `COMMAND;
- end else if (fixed != 3'b000) begin
- fixed <= fixed - 1;
- addr <= addr + 1; // Auto increment address (fixed)
- end else begin
- addr <= addr + 1; // Auto increment address (streaming)
- end
- end else begin
- rdstb <= 1'b0;
- end
- end else if (state == `MGMTPASS) begin
- pass_thru_mgmt <= 1'b1;
- end else if (state == `USERPASS) begin
- pass_thru_user <= 1'b1;
- end // ! state `DATA | `MGMTPASS | `USERPASS
- end // ! csb_reset
- end // always @ SCK
-
-endmodule // housekeeping_spi_slave
-`default_nettype wire
diff --git a/caravel/rtl/la_wb.v b/caravel/rtl/la_wb.v
deleted file mode 100644
index fbbc77c..0000000
--- a/caravel/rtl/la_wb.v
+++ /dev/null
@@ -1,305 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-module la_wb # (
- parameter BASE_ADR = 32'h 2200_0000,
- parameter LA_DATA_0 = 8'h00,
- parameter LA_DATA_1 = 8'h04,
- parameter LA_DATA_2 = 8'h08,
- parameter LA_DATA_3 = 8'h0c,
- parameter LA_OENB_0 = 8'h10,
- parameter LA_OENB_1 = 8'h14,
- parameter LA_OENB_2 = 8'h18,
- parameter LA_OENB_3 = 8'h1c,
- parameter LA_IENA_0 = 8'h20,
- parameter LA_IENA_1 = 8'h24,
- parameter LA_IENA_2 = 8'h28,
- parameter LA_IENA_3 = 8'h2c,
- parameter LA_SAMPLE = 8'h30
-) (
- input wb_clk_i,
- input wb_rst_i,
-
- input [31:0] wb_dat_i,
- input [31:0] wb_adr_i,
- input [3:0] wb_sel_i,
- input wb_cyc_i,
- input wb_stb_i,
- input wb_we_i,
-
- output [31:0] wb_dat_o,
- output wb_ack_o,
-
- input [127:0] la_data_in, // From MPRJ
- output [127:0] la_data,
- output [127:0] la_oenb,
- output [127:0] la_iena
-);
-
- wire resetn;
- wire valid;
- wire ready;
- wire [3:0] iomem_we;
-
- assign resetn = ~wb_rst_i;
- assign valid = wb_stb_i && wb_cyc_i;
-
- assign iomem_we = wb_sel_i & {4{wb_we_i}};
- assign wb_ack_o = ready;
-
- la #(
- .BASE_ADR(BASE_ADR),
- .LA_DATA_0(LA_DATA_0),
- .LA_DATA_1(LA_DATA_1),
- .LA_DATA_2(LA_DATA_2),
- .LA_DATA_3(LA_DATA_3),
- .LA_OENB_0(LA_OENB_0),
- .LA_OENB_1(LA_OENB_1),
- .LA_OENB_2(LA_OENB_2),
- .LA_OENB_3(LA_OENB_3),
- .LA_IENA_0(LA_IENA_0),
- .LA_IENA_1(LA_IENA_1),
- .LA_IENA_2(LA_IENA_2),
- .LA_IENA_3(LA_IENA_3),
- .LA_SAMPLE(LA_SAMPLE)
- ) la_ctrl (
- .clk(wb_clk_i),
- .resetn(resetn),
- .iomem_addr(wb_adr_i),
- .iomem_valid(valid),
- .iomem_wstrb(iomem_we),
- .iomem_wdata(wb_dat_i),
- .iomem_rdata(wb_dat_o),
- .iomem_ready(ready),
- .la_data_in(la_data_in),
- .la_data(la_data),
- .la_oenb(la_oenb),
- .la_iena(la_iena)
- );
-
-endmodule
-
-module la #(
- parameter BASE_ADR = 32'h 2200_0000,
- parameter LA_DATA_0 = 8'h00,
- parameter LA_DATA_1 = 8'h04,
- parameter LA_DATA_2 = 8'h08,
- parameter LA_DATA_3 = 8'h0c,
- parameter LA_OENB_0 = 8'h10,
- parameter LA_OENB_1 = 8'h14,
- parameter LA_OENB_2 = 8'h18,
- parameter LA_OENB_3 = 8'h1c,
- parameter LA_IENA_0 = 8'h20,
- parameter LA_IENA_1 = 8'h24,
- parameter LA_IENA_2 = 8'h28,
- parameter LA_IENA_3 = 8'h2c,
- parameter LA_SAMPLE = 8'h30
-) (
- input clk,
- input resetn,
-
- input [31:0] iomem_addr,
- input iomem_valid,
- input [3:0] iomem_wstrb,
- input [31:0] iomem_wdata,
-
- output reg [31:0] iomem_rdata,
- output reg iomem_ready,
-
- input [127:0] la_data_in, // From MPRJ
- output [127:0] la_data, // To MPRJ
- output [127:0] la_oenb,
- output [127:0] la_iena
-);
-
- reg [31:0] la_data_0;
- reg [31:0] la_data_1;
- reg [31:0] la_data_2;
- reg [31:0] la_data_3;
-
- reg [31:0] la_oenb_0;
- reg [31:0] la_oenb_1;
- reg [31:0] la_oenb_2;
- reg [31:0] la_oenb_3;
-
- reg [31:0] la_iena_0;
- reg [31:0] la_iena_1;
- reg [31:0] la_iena_2;
- reg [31:0] la_iena_3;
-
- wire [3:0] la_data_sel;
- wire [3:0] la_oenb_sel;
- wire [3:0] la_iena_sel;
- wire la_sample_sel;
-
- wire [31:0] la_sample_mask_0;
- wire [31:0] la_sample_mask_1;
- wire [31:0] la_sample_mask_2;
- wire [31:0] la_sample_mask_3;
-
- assign la_data = {la_data_3, la_data_2, la_data_1, la_data_0};
- assign la_oenb = {la_oenb_3, la_oenb_2, la_oenb_1, la_oenb_0};
- assign la_iena = {la_iena_3, la_iena_2, la_iena_1, la_iena_0};
-
- assign la_data_sel = {
- (iomem_addr[7:0] == LA_DATA_3),
- (iomem_addr[7:0] == LA_DATA_2),
- (iomem_addr[7:0] == LA_DATA_1),
- (iomem_addr[7:0] == LA_DATA_0)
- };
-
- assign la_oenb_sel = {
- (iomem_addr[7:0] == LA_OENB_3),
- (iomem_addr[7:0] == LA_OENB_2),
- (iomem_addr[7:0] == LA_OENB_1),
- (iomem_addr[7:0] == LA_OENB_0)
- };
-
- assign la_iena_sel = {
- (iomem_addr[7:0] == LA_IENA_3),
- (iomem_addr[7:0] == LA_IENA_2),
- (iomem_addr[7:0] == LA_IENA_1),
- (iomem_addr[7:0] == LA_IENA_0)
- };
-
- assign la_sample_sel = (iomem_addr[7:0] == LA_SAMPLE);
- assign la_sample_mask_3 = (la_oenb_3 & la_iena_3);
- assign la_sample_mask_2 = (la_oenb_2 & la_iena_2);
- assign la_sample_mask_1 = (la_oenb_1 & la_iena_1);
- assign la_sample_mask_0 = (la_oenb_0 & la_iena_0);
-
- always @(posedge clk) begin
- if (!resetn) begin
- la_data_0 <= 0;
- la_data_1 <= 0;
- la_data_2 <= 0;
- la_data_3 <= 0;
- la_oenb_0 <= 32'hFFFF_FFFF; // default is tri-state buff disabled
- la_oenb_1 <= 32'hFFFF_FFFF;
- la_oenb_2 <= 32'hFFFF_FFFF;
- la_oenb_3 <= 32'hFFFF_FFFF;
- la_iena_0 <= 32'h0000_0000; // default is grounded input
- la_iena_1 <= 32'h0000_0000;
- la_iena_2 <= 32'h0000_0000;
- la_iena_3 <= 32'h0000_0000;
- end else begin
- iomem_ready <= 0;
- if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
- iomem_ready <= 1'b 1;
-
- /* NOTE: Data in and out are independent channels */
-
- if (la_data_sel[0]) begin
- iomem_rdata <= la_data_in[31:0];
-
- if (iomem_wstrb[0]) la_data_0[ 7: 0] <= iomem_wdata[ 7: 0];
- if (iomem_wstrb[1]) la_data_0[15: 8] <= iomem_wdata[15: 8];
- if (iomem_wstrb[2]) la_data_0[23:16] <= iomem_wdata[23:16];
- if (iomem_wstrb[3]) la_data_0[31:24] <= iomem_wdata[31:24];
-
- end else if (la_data_sel[1]) begin
- iomem_rdata <= la_data_in[63:32];
-
- if (iomem_wstrb[0]) la_data_1[ 7: 0] <= iomem_wdata[ 7: 0];
- if (iomem_wstrb[1]) la_data_1[15: 8] <= iomem_wdata[15: 8];
- if (iomem_wstrb[2]) la_data_1[23:16] <= iomem_wdata[23:16];
- if (iomem_wstrb[3]) la_data_1[31:24] <= iomem_wdata[31:24];
-
- end else if (la_data_sel[2]) begin
- iomem_rdata <= la_data_in[95:64];
-
- if (iomem_wstrb[0]) la_data_2[ 7: 0] <= iomem_wdata[ 7: 0];
- if (iomem_wstrb[1]) la_data_2[15: 8] <= iomem_wdata[15: 8];
- if (iomem_wstrb[2]) la_data_2[23:16] <= iomem_wdata[23:16];
- if (iomem_wstrb[3]) la_data_2[31:24] <= iomem_wdata[31:24];
-
- end else if (la_data_sel[3]) begin
- iomem_rdata <= la_data_in[127:96];
-
- if (iomem_wstrb[0]) la_data_3[ 7: 0] <= iomem_wdata[ 7: 0];
- if (iomem_wstrb[1]) la_data_3[15: 8] <= iomem_wdata[15: 8];
- if (iomem_wstrb[2]) la_data_3[23:16] <= iomem_wdata[23:16];
- if (iomem_wstrb[3]) la_data_3[31:24] <= iomem_wdata[31:24];
- end else if (la_oenb_sel[0]) begin
- iomem_rdata <= la_oenb_0;
-
- if (iomem_wstrb[0]) la_oenb_0[ 7: 0] <= iomem_wdata[ 7: 0];
- if (iomem_wstrb[1]) la_oenb_0[15: 8] <= iomem_wdata[15: 8];
- if (iomem_wstrb[2]) la_oenb_0[23:16] <= iomem_wdata[23:16];
- if (iomem_wstrb[3]) la_oenb_0[31:24] <= iomem_wdata[31:24];
- end else if (la_oenb_sel[1]) begin
- iomem_rdata <= la_oenb_1;
-
- if (iomem_wstrb[0]) la_oenb_1[ 7: 0] <= iomem_wdata[ 7: 0];
- if (iomem_wstrb[1]) la_oenb_1[15: 8] <= iomem_wdata[15: 8];
- if (iomem_wstrb[2]) la_oenb_1[23:16] <= iomem_wdata[23:16];
- if (iomem_wstrb[3]) la_oenb_1[31:24] <= iomem_wdata[31:24];
- end else if (la_oenb_sel[2]) begin
- iomem_rdata <= la_oenb_2;
-
- if (iomem_wstrb[0]) la_oenb_2[ 7: 0] <= iomem_wdata[ 7: 0];
- if (iomem_wstrb[1]) la_oenb_2[15: 8] <= iomem_wdata[15: 8];
- if (iomem_wstrb[2]) la_oenb_2[23:16] <= iomem_wdata[23:16];
- if (iomem_wstrb[3]) la_oenb_2[31:24] <= iomem_wdata[31:24];
- end else if (la_oenb_sel[3]) begin
- iomem_rdata <= la_oenb_3;
-
- if (iomem_wstrb[0]) la_oenb_3[ 7: 0] <= iomem_wdata[ 7: 0];
- if (iomem_wstrb[1]) la_oenb_3[15: 8] <= iomem_wdata[15: 8];
- if (iomem_wstrb[2]) la_oenb_3[23:16] <= iomem_wdata[23:16];
- if (iomem_wstrb[3]) la_oenb_3[31:24] <= iomem_wdata[31:24];
- end else if (la_iena_sel[0]) begin
- iomem_rdata <= la_iena_0;
-
- if (iomem_wstrb[0]) la_iena_0[ 7: 0] <= iomem_wdata[ 7: 0];
- if (iomem_wstrb[1]) la_iena_0[15: 8] <= iomem_wdata[15: 8];
- if (iomem_wstrb[2]) la_iena_0[23:16] <= iomem_wdata[23:16];
- if (iomem_wstrb[3]) la_iena_0[31:24] <= iomem_wdata[31:24];
- end else if (la_iena_sel[1]) begin
- iomem_rdata <= la_iena_1;
-
- if (iomem_wstrb[0]) la_iena_1[ 7: 0] <= iomem_wdata[ 7: 0];
- if (iomem_wstrb[1]) la_iena_1[15: 8] <= iomem_wdata[15: 8];
- if (iomem_wstrb[2]) la_iena_1[23:16] <= iomem_wdata[23:16];
- if (iomem_wstrb[3]) la_iena_1[31:24] <= iomem_wdata[31:24];
- end else if (la_iena_sel[2]) begin
- iomem_rdata <= la_iena_2;
-
- if (iomem_wstrb[0]) la_iena_2[ 7: 0] <= iomem_wdata[ 7: 0];
- if (iomem_wstrb[1]) la_iena_2[15: 8] <= iomem_wdata[15: 8];
- if (iomem_wstrb[2]) la_iena_2[23:16] <= iomem_wdata[23:16];
- if (iomem_wstrb[3]) la_iena_2[31:24] <= iomem_wdata[31:24];
- end else if (la_iena_sel[3]) begin
- iomem_rdata <= la_iena_3;
-
- if (iomem_wstrb[0]) la_iena_3[ 7: 0] <= iomem_wdata[ 7: 0];
- if (iomem_wstrb[1]) la_iena_3[15: 8] <= iomem_wdata[15: 8];
- if (iomem_wstrb[2]) la_iena_3[23:16] <= iomem_wdata[23:16];
- if (iomem_wstrb[3]) la_iena_3[31:24] <= iomem_wdata[31:24];
- end else if (la_sample_sel) begin
- /* Simultaneous data capture: Sample all inputs */
- /* for which input is enabled and output is disabled. */
- la_data_0 <= la_data_in[31:0] & la_sample_mask_0;
- la_data_1 <= la_data_in[63:32] & la_sample_mask_1;
- la_data_2 <= la_data_in[95:64] & la_sample_mask_2;
- la_data_3 <= la_data_in[127:96] & la_sample_mask_3;
- end
- end
- end
- end
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/mem_wb.v b/caravel/rtl/mem_wb.v
deleted file mode 100644
index 276cc36..0000000
--- a/caravel/rtl/mem_wb.v
+++ /dev/null
@@ -1,141 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-module mem_wb (
-`ifdef USE_POWER_PINS
- input VPWR,
- input VGND,
-`endif
- input wb_clk_i,
- input wb_rst_i,
-
- input [31:0] wb_adr_i,
- input [31:0] wb_dat_i,
- input [3:0] wb_sel_i,
- input wb_we_i,
- input wb_cyc_i,
- input wb_stb_i,
-
- output wb_ack_o,
- output [31:0] wb_dat_o
-
-);
-
- localparam ADR_WIDTH = $clog2(`MEM_WORDS);
-
- wire valid;
- wire ram_wen;
- wire [3:0] wen; // write enable
-
- assign valid = wb_cyc_i & wb_stb_i;
- assign ram_wen = wb_we_i && valid;
-
- assign wen = wb_sel_i & {4{ram_wen}} ;
-
- /*
- Ack Generation
- - write transaction: asserted upon receiving adr_i & dat_i
- - read transaction : asserted one clock cycle after receiving the adr_i & dat_i
- */
-
- reg wb_ack_read;
- reg wb_ack_o;
-
- always @(posedge wb_clk_i) begin
- if (wb_rst_i == 1'b 1) begin
- wb_ack_read <= 1'b0;
- wb_ack_o <= 1'b0;
- end else begin
- // wb_ack_read <= {2{valid}} & {1'b1, wb_ack_read[1]};
- wb_ack_o <= wb_we_i? (valid & !wb_ack_o): wb_ack_read;
- wb_ack_read <= (valid & !wb_ack_o) & !wb_ack_read;
- end
- end
-
- soc_mem
-`ifndef USE_OPENRAM
- #(
- .WORDS(`MEM_WORDS),
- .ADR_WIDTH(ADR_WIDTH)
- )
-`endif
- mem (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .clk(wb_clk_i),
- .ena(valid),
- .wen(wen),
- .addr(wb_adr_i[ADR_WIDTH+1:2]),
- .wdata(wb_dat_i),
- .rdata(wb_dat_o)
- );
-
-endmodule
-
-module soc_mem
-`ifndef USE_OPENRAM
-#(
- parameter integer WORDS = 256,
- parameter ADR_WIDTH = 8
-)
-`endif
- (
-`ifdef USE_POWER_PINS
- input VPWR,
- input VGND,
-`endif
- input clk,
- input ena,
- input [3:0] wen,
- input [ADR_WIDTH-1:0] addr,
- input [31:0] wdata,
- output[31:0] rdata
-);
-
-`ifndef USE_OPENRAM
- DFFRAM #(.WSIZE(`DFFRAM_WSIZE), .USE_LATCH(`DFFRAM_USE_LATCH)) SRAM (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .CLK(clk),
- .WE(wen),
- .EN(ena),
- .Di(wdata),
- .Do(rdata),
- // 8-bit address if using the default custom DFF RAM
- .A(addr)
- );
-`else
-
- /* Using Port 0 Only - Size: 1KB, 256x32 bits */
- //sram_1rw1r_32_256_8_scn4m_subm
- sram_1rw1r_32_256_8_sky130 SRAM(
- .clk0(clk),
- .csb0(~ena),
- .web0(~|wen),
- .wmask0(wen),
- .addr0(addr[7:0]),
- .din0(wdata),
- .dout0(rdata)
- );
-
-`endif
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/mgmt_core.v b/caravel/rtl/mgmt_core.v
deleted file mode 100644
index 31ca5ad..0000000
--- a/caravel/rtl/mgmt_core.v
+++ /dev/null
@@ -1,373 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-module mgmt_core (
-`ifdef USE_POWER_PINS
- inout VPWR,
- inout VGND,
-`endif
- // GPIO (dedicated pad)
- output gpio_out_pad, // Connect to out on gpio pad
- input gpio_in_pad, // Connect to in on gpio pad
- output gpio_mode0_pad, // Connect to dm[0] on gpio pad
- output gpio_mode1_pad, // Connect to dm[2] on gpio pad
- output gpio_outenb_pad, // Connect to oe_n on gpio pad
- output gpio_inenb_pad, // Connect to inp_dis on gpio pad
- // Flash memory control (SPI master)
- output flash_csb,
- output flash_clk,
- output flash_csb_oeb,
- output flash_clk_oeb,
- output flash_io0_oeb,
- output flash_io1_oeb,
- output flash_io2_oeb, // through GPIO 36
- output flash_io3_oeb, // through GPIO 37
- output flash_csb_ieb,
- output flash_clk_ieb,
- output flash_io0_ieb,
- output flash_io1_ieb,
- output flash_io0_do,
- output flash_io1_do,
- input flash_io0_di,
- input flash_io1_di,
- // Master reset
- input resetb,
- input porb,
- // Clocking
- input clock,
- // LA signals
- input [127:0] la_input, // From User Project to cpu
- output [127:0] la_output, // From CPU to User Project
- output [127:0] la_oenb, // LA output enable
- output [127:0] la_iena, // LA input enable
- // Housekeeping SPI
- output sdo_out,
- output sdo_outenb,
- // JTAG
- output jtag_out,
- output jtag_outenb,
- // User Project Control Signals
- input [`MPRJ_IO_PADS-1:0] mgmt_in_data,
- output [`MPRJ_IO_PADS-1:0] mgmt_out_data,
- output [`MPRJ_PWR_PADS-1:0] pwr_ctrl_out,
- input mprj_vcc_pwrgood,
- input mprj2_vcc_pwrgood,
- input mprj_vdd_pwrgood,
- input mprj2_vdd_pwrgood,
- output mprj_io_loader_resetn,
- output mprj_io_loader_clock,
- output mprj_io_loader_data_1,
- output mprj_io_loader_data_2,
- // WB MI A (User project)
- input mprj_ack_i,
- input [31:0] mprj_dat_i,
- output mprj_cyc_o,
- output mprj_stb_o,
- output mprj_we_o,
- output [3:0] mprj_sel_o,
- output [31:0] mprj_adr_o,
- output [31:0] mprj_dat_o,
-
- output core_clk,
- output user_clk,
- output core_rstn,
- input [2:0] user_irq,
- output [2:0] user_irq_ena,
-
- // Metal programmed user ID / mask revision vector
- input [31:0] mask_rev,
-
- // MGMT area R/W interface for mgmt RAM
- output [`RAM_BLOCKS-1:0] mgmt_ena,
- output [(`RAM_BLOCKS*4)-1:0] mgmt_wen_mask,
- output [`RAM_BLOCKS-1:0] mgmt_wen,
- output [7:0] mgmt_addr,
- output [31:0] mgmt_wdata,
- input [(`RAM_BLOCKS*32)-1:0] mgmt_rdata,
-
- // MGMT area RO interface for user RAM
- output mgmt_ena_ro,
- output [7:0] mgmt_addr_ro,
- input [31:0] mgmt_rdata_ro
-);
- wire ext_clk_sel;
- wire pll_clk, pll_clk90;
- wire ext_reset;
- wire hk_connect;
- wire trap;
- wire irq_spi;
-
- // JTAG (to be implemented)
- wire jtag_out;
- wire jtag_out_pre = 1'b0;
- wire jtag_outenb = 1'b1;
- wire jtag_oenb_state;
-
- // SDO
- wire sdo_out;
- wire sdo_out_pre;
- wire sdo_oenb_state;
-
- // Housekeeping SPI vectors
- wire [4:0] spi_pll_div;
- wire [2:0] spi_pll_sel;
- wire [2:0] spi_pll90_sel;
- wire [25:0] spi_pll_trim;
-
- // All but the first two and last two IOs share the in and out data line
- // and so the output data line must be high-impedence when the input is
- // enabled.
-
- wire [`MPRJ_IO_PADS-1:0] mgmt_oeb_data;
- wire [`MPRJ_IO_PADS-1:0] mgmt_out_predata;
-
- wire mgmt_mux_csb, mgmt_mux_sck, mgmt_mux_sdi;
- wire pass_thru_user_csb, pass_thru_user_sck, pass_thru_user_sdi;
- wire pass_thru_mgmt_sdo, pass_thru_mgmt_csb;
- wire pass_thru_mgmt_sck, pass_thru_mgmt_sdi;
- wire pass_thru_mgmt, pass_thru_user;
- wire spi_pll_ena, spi_pll_dco_ena;
-
- // During external reset, data lines 8 to 10 are used by the user flash
- // pass-through mode.
-
- assign mgmt_mux_csb = (pass_thru_user == 1'b1) ?
- pass_thru_user_csb : mgmt_out_predata[8];
- assign mgmt_mux_sck = (pass_thru_user == 1'b1) ?
- pass_thru_user_sck : mgmt_out_predata[9];
- assign mgmt_mux_sdi = (pass_thru_user == 1'b1) ?
- pass_thru_user_sdi : mgmt_out_predata[10];
-
- genvar i;
-
- generate
- for (i = 0; i < 2; i = i + 1) begin
- assign mgmt_out_data[i] = mgmt_out_predata[i];
- end
- for (i = 2; i < 8; i = i + 1) begin
- assign mgmt_out_data[i] = (mgmt_oeb_data[i]) ? 1'bz : mgmt_out_predata[i];
- end
- assign mgmt_out_data[8] = (mgmt_oeb_data[8]) ? 1'bz : mgmt_mux_csb;
- assign mgmt_out_data[9] = (mgmt_oeb_data[9]) ? 1'bz : mgmt_mux_sck;
- assign mgmt_out_data[10] = (mgmt_oeb_data[10]) ? 1'bz : mgmt_mux_sdi;
- for (i = 11; i < `MPRJ_IO_PADS-2; i = i + 1) begin
- assign mgmt_out_data[i] = (mgmt_oeb_data[i]) ? 1'bz : mgmt_out_predata[i];
- end
- for (i = `MPRJ_IO_PADS-2; i < `MPRJ_IO_PADS; i = i + 1) begin
- assign mgmt_out_data[i] = mgmt_out_predata[i];
- end
- endgenerate
-
- // Override default function for SDO and JTAG outputs if purposely
- // set for override by the management SoC.
- assign sdo_out = (sdo_oenb_state == 1'b0) ? mgmt_out_predata[1] : sdo_out_pre;
- assign jtag_out = (jtag_oenb_state == 1'b0) ? mgmt_out_predata[0] : jtag_out_pre;
-
- caravel_clocking clocking(
- `ifdef USE_POWER_PINS
- .vdd1v8(VPWR),
- .vss(VGND),
- `endif
- .ext_clk_sel(ext_clk_sel),
- .ext_clk(clock),
- .pll_clk(pll_clk),
- .pll_clk90(pll_clk90),
- .resetb(resetb),
- .sel(spi_pll_sel),
- .sel2(spi_pll90_sel),
- .ext_reset(ext_reset), // From housekeeping SPI
- .core_clk(core_clk),
- .user_clk(user_clk),
- .resetb_sync(core_rstn)
- );
-
- // These wires are defined in the SoC but are not being used because
- // the SoC flash is reduced to a 2-pin I/O
- wire flash_io2_oeb, flash_io3_oeb;
- wire flash_io2_ieb, flash_io3_ieb;
- wire flash_io2_di, flash_io3_di;
-
- // The following functions are connected to specific user project
- // area pins, when under control of the management area (during
- // startup, and when not otherwise programmed for the user project).
-
- // JTAG = jtag_out (inout)
- // SDO = sdo_out (output) (shared with SPI master)
- // SDI = mgmt_in_data[2] (input) (shared with SPI master)
- // CSB = mgmt_in_data[3] (input) (shared with SPI master)
- // SCK = mgmt_in_data[4] (input) (shared with SPI master)
- // ser_rx = mgmt_in_data[5] (input)
- // ser_tx = mgmt_out_data[6] (output)
- // irq = mgmt_in_data[7] (input)
- // flash_csb = mgmt_out_data[8] (output) (user area flash)
- // flash_sck = mgmt_out_data[9] (output) (user area flash)
- // flash_io0 = mgmt_in/out_data[10] (input) (user area flash)
- // flash_io1 = mgmt_in/out_data[11] (output) (user area flash)
- // irq2_pin = mgmt_in_data[12] (input)
- // trap_mon = mgmt_in_data[13] (output)
- // clk1_mon = mgmt_in_data[14] (output)
- // clk2_mon = mgmt_in_data[15] (output)
-
-
- // OEB lines for [0] and [1] are the only ones connected directly to
- // the pad. All others have OEB controlled by the configuration bit
- // in the control block.
-
- mgmt_soc soc (
- `ifdef USE_POWER_PINS
- .vdd1v8(VPWR),
- .vss(VGND),
- `endif
- .clk(core_clk),
- .resetn(core_rstn),
- .trap(trap),
- // GPIO
- .gpio_out_pad(gpio_out_pad),
- .gpio_in_pad(gpio_in_pad),
- .gpio_mode0_pad(gpio_mode0_pad),
- .gpio_mode1_pad(gpio_mode1_pad),
- .gpio_outenb_pad(gpio_outenb_pad),
- .gpio_inenb_pad(gpio_inenb_pad),
- .irq_spi(irq_spi),
- // Flash
- .flash_csb(flash_csb),
- .flash_clk(flash_clk),
- .flash_csb_oeb(flash_csb_oeb),
- .flash_clk_oeb(flash_clk_oeb),
- .flash_io0_oeb(flash_io0_oeb),
- .flash_io1_oeb(flash_io1_oeb),
- .flash_io2_oeb(flash_io2_oeb),
- .flash_io3_oeb(flash_io3_oeb),
- .flash_csb_ieb(flash_csb_ieb),
- .flash_clk_ieb(flash_clk_ieb),
- .flash_io0_ieb(flash_io0_ieb),
- .flash_io1_ieb(flash_io1_ieb),
- .flash_io2_ieb(flash_io2_ieb),
- .flash_io3_ieb(flash_io3_ieb),
- .flash_io0_do(flash_io0_do),
- .flash_io1_do(flash_io1_do),
- .flash_io0_di(flash_io0_di),
- .flash_io1_di(flash_io1_di),
- .flash_io2_di(flash_io2_di),
- .flash_io3_di(flash_io3_di),
- // SPI pass-through to/from SPI flash controller
- .pass_thru_mgmt(pass_thru_mgmt),
- .pass_thru_mgmt_csb(pass_thru_mgmt_csb),
- .pass_thru_mgmt_sck(pass_thru_mgmt_sck),
- .pass_thru_mgmt_sdi(pass_thru_mgmt_sdi),
- .pass_thru_mgmt_sdo(pass_thru_mgmt_sdo),
- // SDO and JTAG state for output override
- .sdo_oenb_state(sdo_oenb_state),
- .jtag_oenb_state(jtag_oenb_state),
- // SPI master->slave direct connection
- .hk_connect(hk_connect),
- // Secondary clock (for monitoring)
- .user_clk(user_clk),
- // Logic Analyzer
- .la_input(la_input),
- .la_output(la_output),
- .la_oenb(la_oenb),
- .la_iena(la_iena),
- // User Project I/O Configuration
- .mprj_vcc_pwrgood(mprj_vcc_pwrgood),
- .mprj2_vcc_pwrgood(mprj2_vcc_pwrgood),
- .mprj_vdd_pwrgood(mprj_vdd_pwrgood),
- .mprj2_vdd_pwrgood(mprj2_vdd_pwrgood),
- .mprj_io_loader_resetn(mprj_io_loader_resetn),
- .mprj_io_loader_clock(mprj_io_loader_clock),
- .mprj_io_loader_data_1(mprj_io_loader_data_1),
- .mprj_io_loader_data_2(mprj_io_loader_data_2),
- // User project IRQ
- .user_irq(user_irq),
- .user_irq_ena(user_irq_ena),
- // I/O data
- .mgmt_in_data(mgmt_in_data),
- .mgmt_out_data(mgmt_out_predata),
- .mgmt_oeb_data(mgmt_oeb_data),
- .pwr_ctrl_out(pwr_ctrl_out),
- // User Project Slave ports (WB MI A)
- .mprj_cyc_o(mprj_cyc_o),
- .mprj_stb_o(mprj_stb_o),
- .mprj_we_o(mprj_we_o),
- .mprj_sel_o(mprj_sel_o),
- .mprj_adr_o(mprj_adr_o),
- .mprj_dat_o(mprj_dat_o),
- .mprj_ack_i(mprj_ack_i),
- .mprj_dat_i(mprj_dat_i),
- // MGMT area R/W interface for mgmt RAM
- .mgmt_ena(mgmt_ena),
- .mgmt_wen_mask(mgmt_wen_mask),
- .mgmt_wen(mgmt_wen),
- .mgmt_addr(mgmt_addr),
- .mgmt_wdata(mgmt_wdata),
- .mgmt_rdata(mgmt_rdata),
- // MGMT area RO interface for user RAM
- .mgmt_ena_ro(mgmt_ena_ro),
- .mgmt_addr_ro(mgmt_addr_ro),
- .mgmt_rdata_ro(mgmt_rdata_ro)
- );
-
- digital_pll pll (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- `endif
- .resetb(resetb),
- .enable(spi_pll_ena),
- .osc(clock),
- .clockp({pll_clk, pll_clk90}),
- .div(spi_pll_div),
- .dco(spi_pll_dco_ena),
- .ext_trim(spi_pll_trim)
- );
-
- // Housekeeping SPI (SPI slave module)
- housekeeping_spi housekeeping (
- `ifdef USE_POWER_PINS
- .vdd(VPWR),
- .vss(VGND),
- `endif
- .RSTB(porb),
- .SCK((hk_connect) ? mgmt_out_predata[4] : mgmt_in_data[4]),
- .SDI((hk_connect) ? mgmt_out_predata[2] : mgmt_in_data[2]),
- .CSB((hk_connect) ? mgmt_out_predata[3] : mgmt_in_data[3]),
- .SDO(sdo_out_pre),
- .sdo_enb(sdo_outenb),
- .pll_dco_ena(spi_pll_dco_ena),
- .pll_sel(spi_pll_sel),
- .pll90_sel(spi_pll90_sel),
- .pll_div(spi_pll_div),
- .pll_ena(spi_pll_ena),
- .pll_trim(spi_pll_trim),
- .pll_bypass(ext_clk_sel),
- .irq(irq_spi),
- .reset(ext_reset),
- .trap(trap),
- .mask_rev_in(mask_rev),
- .pass_thru_mgmt_reset(pass_thru_mgmt),
- .pass_thru_user_reset(pass_thru_user),
- .pass_thru_mgmt_sck(pass_thru_mgmt_sck),
- .pass_thru_mgmt_csb(pass_thru_mgmt_csb),
- .pass_thru_mgmt_sdi(pass_thru_mgmt_sdi),
- .pass_thru_mgmt_sdo(pass_thru_mgmt_sdo),
- .pass_thru_user_sck(pass_thru_user_sck),
- .pass_thru_user_csb(pass_thru_user_csb),
- .pass_thru_user_sdi(pass_thru_user_sdi),
- .pass_thru_user_sdo(mgmt_in_data[11])
- );
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/mgmt_protect.v b/caravel/rtl/mgmt_protect.v
deleted file mode 100644
index e29122d..0000000
--- a/caravel/rtl/mgmt_protect.v
+++ /dev/null
@@ -1,422 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-/*----------------------------------------------------------------------*/
-/* Buffers protecting the management region from the user region. */
-/* This mainly consists of tristate buffers that are enabled by a */
-/* "logic 1" output connected to the user's VCCD domain. This ensures */
-/* that the buffer is disabled and the output high-impedence when the */
-/* user 1.8V supply is absent. */
-/*----------------------------------------------------------------------*/
-/* Because there is no tristate buffer with a non-inverted enable, a */
-/* tristate inverter with non-inverted enable is used in series with */
-/* another (normal) inverter. */
-/*----------------------------------------------------------------------*/
-/* For the sake of placement/routing, one conb (logic 1) cell is used */
-/* for every buffer. */
-/*----------------------------------------------------------------------*/
-
-module mgmt_protect (
-`ifdef USE_POWER_PINS
- inout vccd,
- inout vssd,
- inout vccd1,
- inout vssd1,
- inout vccd2,
- inout vssd2,
- inout vdda1,
- inout vssa1,
- inout vdda2,
- inout vssa2,
-`endif
-
- input caravel_clk,
- input caravel_clk2,
- input caravel_rstn,
- input mprj_cyc_o_core,
- input mprj_stb_o_core,
- input mprj_we_o_core,
- input [3:0] mprj_sel_o_core,
- input [31:0] mprj_adr_o_core,
- input [31:0] mprj_dat_o_core,
- input [2:0] user_irq_core,
-
- // All signal in/out directions are the reverse of the signal
- // names at the buffer intrface.
-
- output [127:0] la_data_in_mprj,
- input [127:0] la_data_out_mprj,
- input [127:0] la_oenb_mprj,
- input [127:0] la_iena_mprj,
-
- input [127:0] la_data_out_core,
- output [127:0] la_data_in_core,
- output [127:0] la_oenb_core,
-
- input [2:0] user_irq_ena,
-
- output user_clock,
- output user_clock2,
- output user_reset,
- output mprj_cyc_o_user,
- output mprj_stb_o_user,
- output mprj_we_o_user,
- output [3:0] mprj_sel_o_user,
- output [31:0] mprj_adr_o_user,
- output [31:0] mprj_dat_o_user,
- output [2:0] user_irq,
- output user1_vcc_powergood,
- output user2_vcc_powergood,
- output user1_vdd_powergood,
- output user2_vdd_powergood
-);
-
- wire [461:0] mprj_logic1;
- wire mprj2_logic1;
-
- wire mprj_vdd_logic1_h;
- wire mprj2_vdd_logic1_h;
- wire mprj_vdd_logic1;
- wire mprj2_vdd_logic1;
-
- wire user1_vcc_powergood;
- wire user2_vcc_powergood;
- wire user1_vdd_powergood;
- wire user2_vdd_powergood;
-
- wire [127:0] la_data_in_mprj_bar;
- wire [2:0] user_irq_bar;
-
- wire [127:0] la_data_in_enable;
- wire [127:0] la_data_out_enable;
- wire [2:0] user_irq_enable;
-
- mprj_logic_high mprj_logic_high_inst (
-`ifdef USE_POWER_PINS
- .vccd1(vccd1),
- .vssd1(vssd1),
-`endif
- .HI(mprj_logic1)
- );
-
- mprj2_logic_high mprj2_logic_high_inst (
-`ifdef USE_POWER_PINS
- .vccd2(vccd2),
- .vssd2(vssd2),
-`endif
- .HI(mprj2_logic1)
- );
-
- // Logic high in the VDDA (3.3V) domains
-
- mgmt_protect_hv powergood_check (
-`ifdef USE_POWER_PINS
- .vccd(vccd),
- .vssd(vssd),
- .vdda1(vdda1),
- .vssa1(vssa1),
- .vdda2(vdda2),
- .vssa2(vssa2),
-`endif
- .mprj_vdd_logic1(mprj_vdd_logic1),
- .mprj2_vdd_logic1(mprj2_vdd_logic1)
- );
-
- // Buffering from the user side to the management side.
- // NOTE: This is intended to be better protected, by a full
- // chain of an lv-to-hv buffer followed by an hv-to-lv buffer.
- // This serves as a placeholder until that configuration is
- // checked and characterized. The function below forces the
- // data input to the management core to be a solid logic 0 when
- // the user project is powered down.
-
- sky130_fd_sc_hd__and2_1 user_to_mprj_in_ena_buf [127:0] (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .X(la_data_in_enable),
- .A(la_iena_mprj),
- .B(mprj_logic1[457:330])
- );
-
- sky130_fd_sc_hd__nand2_4 user_to_mprj_in_gates [127:0] (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Y(la_data_in_mprj_bar),
- .A(la_data_out_core),
- .B(la_data_in_enable)
- );
-
- sky130_fd_sc_hd__inv_8 user_to_mprj_in_buffers [127:0] (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Y(la_data_in_mprj),
- .A(la_data_in_mprj_bar)
- );
-
- // Protection, similar to the above, for the three user IRQ lines
-
- sky130_fd_sc_hd__and2_1 user_irq_ena_buf [2:0] (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .X(user_irq_enable),
- .A(user_irq_ena),
- .B(mprj_logic1[460:458])
- );
-
- sky130_fd_sc_hd__nand2_4 user_irq_gates [2:0] (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Y(user_irq_bar),
- .A(user_irq_core),
- .B(user_irq_enable)
- );
-
- sky130_fd_sc_hd__inv_8 user_irq_buffers [2:0] (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Y(user_irq),
- .A(user_irq_bar)
- );
-
- // The remaining circuitry guards against the management
- // SoC dumping current into the user project area when
- // the user project area is powered down.
-
- sky130_fd_sc_hd__einvp_8 mprj_rstn_buf (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Z(user_reset),
- .A(caravel_rstn),
- .TE(mprj_logic1[0])
- );
-
- sky130_fd_sc_hd__einvp_8 mprj_clk_buf (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Z(user_clock),
- .A(~caravel_clk),
- .TE(mprj_logic1[1])
- );
-
- sky130_fd_sc_hd__einvp_8 mprj_clk2_buf (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Z(user_clock2),
- .A(~caravel_clk2),
- .TE(mprj_logic1[2])
- );
-
- sky130_fd_sc_hd__einvp_8 mprj_cyc_buf (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Z(mprj_cyc_o_user),
- .A(~mprj_cyc_o_core),
- .TE(mprj_logic1[3])
- );
-
- sky130_fd_sc_hd__einvp_8 mprj_stb_buf (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Z(mprj_stb_o_user),
- .A(~mprj_stb_o_core),
- .TE(mprj_logic1[4])
- );
-
- sky130_fd_sc_hd__einvp_8 mprj_we_buf (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Z(mprj_we_o_user),
- .A(~mprj_we_o_core),
- .TE(mprj_logic1[5])
- );
-
- sky130_fd_sc_hd__einvp_8 mprj_sel_buf [3:0] (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Z(mprj_sel_o_user),
- .A(~mprj_sel_o_core),
- .TE(mprj_logic1[9:6])
- );
-
- sky130_fd_sc_hd__einvp_8 mprj_adr_buf [31:0] (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Z(mprj_adr_o_user),
- .A(~mprj_adr_o_core),
- .TE(mprj_logic1[41:10])
- );
-
- sky130_fd_sc_hd__einvp_8 mprj_dat_buf [31:0] (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Z(mprj_dat_o_user),
- .A(~mprj_dat_o_core),
- .TE(mprj_logic1[73:42])
- );
-
- /* Create signal to tristate the outputs to the user project */
-
- sky130_fd_sc_hd__and2b_1 la_buf_enable [127:0] (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .X(la_data_out_enable),
- .A_N(la_oenb_mprj),
- .B(mprj_logic1[201:74])
- );
-
- /* Project data out from the managment side to the user project */
- /* area when the user project is powered down. */
-
- sky130_fd_sc_hd__einvp_8 la_buf [127:0] (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Z(la_data_in_core),
- .A(~la_data_out_mprj),
- .TE(la_data_out_enable)
- );
-
- /* Project data out enable (bar) from the managment side to the */
- /* user project area when the user project is powered down. */
-
- sky130_fd_sc_hd__einvp_8 user_to_mprj_oen_buffers [127:0] (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .Z(la_oenb_core),
- .A(~la_oenb_mprj),
- .TE(mprj_logic1[329:202])
- );
-
- /* The conb cell output is a resistive connection directly to */
- /* the power supply, so when returning the user1_powergood */
- /* signal, make sure that it is buffered properly. */
-
- sky130_fd_sc_hd__buf_8 mprj_pwrgood (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .A(mprj_logic1[461]),
- .X(user1_vcc_powergood)
- );
-
- sky130_fd_sc_hd__buf_8 mprj2_pwrgood (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .A(mprj2_logic1),
- .X(user2_vcc_powergood)
- );
-
- sky130_fd_sc_hd__buf_8 mprj_vdd_pwrgood (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .A(mprj_vdd_logic1),
- .X(user1_vdd_powergood)
- );
-
- sky130_fd_sc_hd__buf_8 mprj2_vdd_pwrgood (
-`ifdef USE_POWER_PINS
- .VPWR(vccd),
- .VGND(vssd),
- .VPB(vccd),
- .VNB(vssd),
-`endif
- .A(mprj2_vdd_logic1),
- .X(user2_vdd_powergood)
- );
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/mgmt_protect_hv.v b/caravel/rtl/mgmt_protect_hv.v
deleted file mode 100644
index 23d9cf6..0000000
--- a/caravel/rtl/mgmt_protect_hv.v
+++ /dev/null
@@ -1,103 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-/*----------------------------------------------------------------------*/
-/* mgmt_protect_hv: */
-/* */
-/* High voltage (3.3V) part of the mgmt_protect module. Split out into */
-/* a separate module and file so that the synthesis tools can handle it */
-/* separately from the rest, since it uses a different standard cell */
-/* library. See the file mgmt_protect.v for a full description of the */
-/* whole management protection method. */
-/*----------------------------------------------------------------------*/
-
-module mgmt_protect_hv (
-`ifdef USE_POWER_PINS
- inout vccd,
- inout vssd,
- inout vdda1,
- inout vssa1,
- inout vdda2,
- inout vssa2,
-`endif
-
- output mprj_vdd_logic1,
- output mprj2_vdd_logic1
-
-);
-
- wire mprj_vdd_logic1_h;
- wire mprj2_vdd_logic1_h;
-
-`ifdef USE_POWER_PINS
- // This is to emulate the substrate shorting grounds together for LVS
- // purposes
- assign vssa2 = vssa1;
- assign vssa1 = vssd;
-`endif
-
- // Logic high in the VDDA (3.3V) domains
-
- sky130_fd_sc_hvl__conb_1 mprj_logic_high_hvl (
-`ifdef USE_POWER_PINS
- .VPWR(vdda1),
- .VGND(vssa1),
- .VPB(vdda1),
- .VNB(vssa1),
-`endif
- .HI(mprj_vdd_logic1_h),
- .LO()
- );
-
- sky130_fd_sc_hvl__conb_1 mprj2_logic_high_hvl (
-`ifdef USE_POWER_PINS
- .VPWR(vdda2),
- .VGND(vssa2),
- .VPB(vdda2),
- .VNB(vssa2),
-`endif
- .HI(mprj2_vdd_logic1_h),
- .LO()
- );
-
- // Level shift the logic high signals into the 1.8V domain
-
- sky130_fd_sc_hvl__lsbufhv2lv_1 mprj_logic_high_lv (
-`ifdef USE_POWER_PINS
- .VPWR(vdda1),
- .VGND(vssd),
- .LVPWR(vccd),
- .VPB(vdda1),
- .VNB(vssd),
-`endif
- .X(mprj_vdd_logic1),
- .A(mprj_vdd_logic1_h)
- );
-
- sky130_fd_sc_hvl__lsbufhv2lv_1 mprj2_logic_high_lv (
-`ifdef USE_POWER_PINS
- .VPWR(vdda2),
- .VGND(vssd),
- .LVPWR(vccd),
- .VPB(vdda2),
- .VNB(vssd),
-`endif
- .X(mprj2_vdd_logic1),
- .A(mprj2_vdd_logic1_h)
- );
-endmodule
-
-`default_nettype wire
diff --git a/caravel/rtl/mgmt_soc.v b/caravel/rtl/mgmt_soc.v
deleted file mode 100644
index 2a597e0..0000000
--- a/caravel/rtl/mgmt_soc.v
+++ /dev/null
@@ -1,905 +0,0 @@
-`default_nettype none
-/*
- * SPDX-FileCopyrightText: 2015 Clifford Wolf
- * PicoSoC - A simple example SoC using PicoRV32
- *
- * Copyright (C) 2017 Clifford Wolf <clifford@clifford.at>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Revision 1, July 2019: Added signals to drive flash_clk and flash_csb
- * output enable (inverted), tied to reset so that the flash is completely
- * isolated from the processor when the processor is in reset.
- *
- * Also: Made ram_wenb a 4-bit bus so that the memory access can be made
- * byte-wide for byte-wide instructions.
- *
- * SPDX-License-Identifier: ISC
- */
-
-`ifdef PICORV32_V
-`error "mgmt_soc.v must be read before picorv32.v!"
-`endif
-
-`define PICORV32_REGS mgmt_soc_regs
-
-`include "picorv32.v"
-`include "spimemio.v"
-`include "simpleuart.v"
-`include "simple_spi_master.v"
-`include "counter_timer_high.v"
-`include "counter_timer_low.v"
-`include "wb_intercon.v"
-`include "mem_wb.v"
-`include "gpio_wb.v"
-`include "sysctrl.v"
-`include "la_wb.v"
-`include "mprj_ctrl.v"
-`include "convert_gpio_sigs.v"
-
-module mgmt_soc (
-`ifdef USE_POWER_PINS
- inout vdd1v8, /* 1.8V domain */
- inout vss,
-`endif
- input clk,
- input resetn,
-
- // Trap state from CPU
- output trap,
-
- // GPIO (one pin)
- output gpio_out_pad, // Connect to out on gpio pad
- input gpio_in_pad, // Connect to in on gpio pad
- output gpio_mode0_pad, // Connect to dm[0] on gpio pad
- output gpio_mode1_pad, // Connect to dm[2] on gpio pad
- output gpio_outenb_pad, // Connect to oe_n on gpio pad
- output gpio_inenb_pad, // Connect to inp_dis on gpio pad
-
- // LA signals
- input [127:0] la_input, // From User Project to cpu
- output [127:0] la_output, // From CPU to User Project
- output [127:0] la_oenb, // LA output enable (active low)
- output [127:0] la_iena, // LA input enable (active high)
-
- // User Project I/O Configuration (serial load)
- input mprj_vcc_pwrgood,
- input mprj2_vcc_pwrgood,
- input mprj_vdd_pwrgood,
- input mprj2_vdd_pwrgood,
- output mprj_io_loader_resetn,
- output mprj_io_loader_clock,
- output mprj_io_loader_data_1,
- output mprj_io_loader_data_2,
-
- // User Project pad data (when management SoC controls the pad)
- input [`MPRJ_IO_PADS-1:0] mgmt_in_data,
- output [`MPRJ_IO_PADS-1:0] mgmt_out_data,
- output [`MPRJ_IO_PADS-1:0] mgmt_oeb_data,
- output [`MPRJ_PWR_PADS-1:0] pwr_ctrl_out,
-
- // IRQ
- input irq_spi, // IRQ from standalone SPI
- input [2:0] user_irq, // IRQ from user project
- output [2:0] user_irq_ena, // enable IRQ from user project
-
- // Flash memory control (SPI master)
- output flash_csb,
- output flash_clk,
-
- output flash_csb_oeb,
- output flash_clk_oeb,
-
- output flash_io0_oeb,
- output flash_io1_oeb,
- output flash_io2_oeb,
- output flash_io3_oeb,
-
- output flash_csb_ieb,
- output flash_clk_ieb,
-
- output flash_io0_ieb,
- output flash_io1_ieb,
- output flash_io2_ieb,
- output flash_io3_ieb,
-
- output flash_io0_do,
- output flash_io1_do,
-
- input flash_io0_di,
- input flash_io1_di,
- input flash_io2_di,
- input flash_io3_di,
-
- // SPI pass-thru mode
- input pass_thru_mgmt,
- input pass_thru_mgmt_csb,
- input pass_thru_mgmt_sck,
- input pass_thru_mgmt_sdi,
- output pass_thru_mgmt_sdo,
-
- // State of JTAG and SDO pins (override for management output use)
- output sdo_oenb_state,
- output jtag_oenb_state,
- // State of flash_io2 and flash_io3 pins (override for management output use)
- output flash_io2_oenb_state,
- output flash_io3_oenb_state,
- // SPI master->slave direct link
- output hk_connect,
- // User clock monitoring
- input user_clk,
-
- // WB MI A (User project)
- input mprj_ack_i,
- input [31:0] mprj_dat_i,
- output mprj_cyc_o,
- output mprj_stb_o,
- output mprj_we_o,
- output [3:0] mprj_sel_o,
- output [31:0] mprj_adr_o,
- output [31:0] mprj_dat_o,
-
- // MGMT area R/W interface for mgmt RAM
- output [`RAM_BLOCKS-1:0] mgmt_ena,
- output [(`RAM_BLOCKS*4)-1:0] mgmt_wen_mask,
- output [`RAM_BLOCKS-1:0] mgmt_wen,
- output [7:0] mgmt_addr,
- output [31:0] mgmt_wdata,
- input [(`RAM_BLOCKS*32)-1:0] mgmt_rdata,
-
- // MGMT area RO interface for user RAM
- output mgmt_ena_ro,
- output [7:0] mgmt_addr_ro,
- input [31:0] mgmt_rdata_ro
-);
- /* Memory reverted back to 256 words while memory has to be synthesized */
- parameter [31:0] STACKADDR = (4*(`MEM_WORDS)); // end of memory
- parameter [31:0] PROGADDR_RESET = 32'h 1000_0000;
- parameter [31:0] PROGADDR_IRQ = 32'h 0000_0000;
-
- // Slaves Base Addresses
- parameter RAM_BASE_ADR = 32'h 0000_0000;
- parameter STORAGE_RW_ADR = 32'h 0100_0000;
- parameter STORAGE_RO_ADR = 32'h 0200_0000;
- parameter FLASH_BASE_ADR = 32'h 1000_0000;
- parameter UART_BASE_ADR = 32'h 2000_0000;
- parameter GPIO_BASE_ADR = 32'h 2100_0000;
- parameter COUNTER_TIMER0_BASE_ADR = 32'h 2200_0000;
- parameter COUNTER_TIMER1_BASE_ADR = 32'h 2300_0000;
- parameter SPI_MASTER_BASE_ADR = 32'h 2400_0000;
- parameter LA_BASE_ADR = 32'h 2500_0000;
- parameter MPRJ_CTRL_ADR = 32'h 2600_0000;
- parameter FLASH_CTRL_CFG = 32'h 2D00_0000;
- parameter SYS_BASE_ADR = 32'h 2F00_0000;
- parameter MPRJ_BASE_ADR = 32'h 3000_0000; // WB MI A
-
- // UART
- parameter UART_CLK_DIV = 8'h00;
- parameter UART_DATA = 8'h04;
-
- // SPI Master
- parameter SPI_MASTER_CONFIG = 8'h00;
- parameter SPI_MASTER_DATA = 8'h04;
-
- // Counter-timer 0
- parameter COUNTER_TIMER0_CONFIG = 8'h00;
- parameter COUNTER_TIMER0_VALUE = 8'h04;
- parameter COUNTER_TIMER0_DATA = 8'h08;
-
- // Counter-timer 1
- parameter COUNTER_TIMER1_CONFIG = 8'h00;
- parameter COUNTER_TIMER1_VALUE = 8'h04;
- parameter COUNTER_TIMER1_DATA = 8'h08;
-
- // SOC GPIO
- parameter GPIO_DATA = 8'h00;
- parameter GPIO_ENA = 8'h04;
- parameter GPIO_PU = 8'h08;
- parameter GPIO_PD = 8'h0c;
-
- // LA
- parameter LA_DATA_0 = 8'h00;
- parameter LA_DATA_1 = 8'h04;
- parameter LA_DATA_2 = 8'h08;
- parameter LA_DATA_3 = 8'h0c;
- parameter LA_OENB_0 = 8'h10;
- parameter LA_OENB_1 = 8'h14;
- parameter LA_OENB_2 = 8'h18;
- parameter LA_OENB_3 = 8'h1c;
- parameter LA_IENA_0 = 8'h20;
- parameter LA_IENA_1 = 8'h24;
- parameter LA_IENA_2 = 8'h28;
- parameter LA_IENA_3 = 8'h2c;
- parameter LA_SAMPLE = 8'h30;
-
- // System Control Registers
- parameter PWRGOOD = 8'h00;
- parameter CLK_OUT = 8'h04;
- parameter TRAP_OUT = 8'h08;
- parameter IRQ_SRC = 8'h0c;
-
- // Storage area RAM blocks
- parameter [(`RAM_BLOCKS*24)-1:0] RW_BLOCKS_ADR = {
- {24'h 10_0000},
- {24'h 00_0000}
- };
-
- parameter [23:0] RO_BLOCKS_ADR = {
- {24'h 00_0000}
- };
-
- // Wishbone Interconnect
- localparam ADR_WIDTH = 32;
- localparam DAT_WIDTH = 32;
- localparam NUM_SLAVES = 14;
-
- parameter [NUM_SLAVES*ADR_WIDTH-1: 0] ADR_MASK = {
- {8'hFF, {ADR_WIDTH-8{1'b0}}},
- {8'hFF, {ADR_WIDTH-8{1'b0}}},
- {8'hFF, {ADR_WIDTH-8{1'b0}}},
- {8'hFF, {ADR_WIDTH-8{1'b0}}},
- {8'hFF, {ADR_WIDTH-8{1'b0}}},
- {8'hFF, {ADR_WIDTH-8{1'b0}}},
- {8'hFF, {ADR_WIDTH-8{1'b0}}},
- {8'hFF, {ADR_WIDTH-8{1'b0}}},
- {8'hFF, {ADR_WIDTH-8{1'b0}}},
- {8'hFF, {ADR_WIDTH-8{1'b0}}},
- {8'hFF, {ADR_WIDTH-8{1'b0}}},
- {8'hFF, {ADR_WIDTH-8{1'b0}}},
- {8'hFF, {ADR_WIDTH-8{1'b0}}},
- {8'hFF, {ADR_WIDTH-8{1'b0}}}
- };
-
- parameter [NUM_SLAVES*ADR_WIDTH-1: 0] SLAVE_ADR = {
- {SYS_BASE_ADR},
- {FLASH_CTRL_CFG},
- {MPRJ_BASE_ADR},
- {MPRJ_CTRL_ADR},
- {LA_BASE_ADR},
- {SPI_MASTER_BASE_ADR},
- {COUNTER_TIMER1_BASE_ADR},
- {COUNTER_TIMER0_BASE_ADR},
- {GPIO_BASE_ADR},
- {UART_BASE_ADR},
- {FLASH_BASE_ADR},
- {STORAGE_RO_ADR},
- {STORAGE_RW_ADR},
- {RAM_BASE_ADR}
- };
-
- // The following functions are connected to specific user project
- // area pins, when under control of the management area (during
- // startup, and when not otherwise programmed for the user project).
-
- // JTAG = jtag_out (inout)
- // SDO = sdo_out (output) (shared with SPI master)
- // SDI = mgmt_in_data[2] (input) (shared with SPI master)
- // CSB = mgmt_in_data[3] (input) (shared with SPI master)
- // SCK = mgmt_in_data[4] (input) (shared with SPI master)
- // ser_rx = mgmt_in_data[5] (input)
- // ser_tx = mgmt_out_data[6] (output)
- // irq_pin = mgmt_in_data[7] (input)
- // flash_csb = mgmt_out_data[8] (output) (user area flash)
- // flash_sck = mgmt_out_data[9] (output) (user area flash)
- // flash_io0 = mgmt_in/out_data[10] (input) (user area flash)
- // flash_io1 = mgmt_in/out_data[11] (output) (user area flash)
- // irq2_pin = mgmt_in_data[12] (input)
- // trap_mon = mgmt_in_data[13] (output)
- // clk1_mon = mgmt_in_data[14] (output)
- // clk2_mon = mgmt_in_data[15] (output)
- // flash_io2 = mgmt_in_data[36] (inout) (management area flash)
- // flash_io3 = mgmt_in_data[37] (inout) (management area flash)
-
- // OEB lines for [0] and [1] are the only ones connected directly to
- // the pad. All others have OEB controlled by the configuration bit
- // in the control block.
-
- // memory-mapped I/O control registers
- wire gpio_pullup; // Intermediate GPIO pullup
- wire gpio_pulldown; // Intermediate GPIO pulldown
- wire gpio_outenb; // Intermediate GPIO out enable (bar)
- wire gpio_out; // Intermediate GPIO output
-
- wire trap_output_dest; // Trap signal output destination
- wire clk1_output_dest; // Core clock1 signal output destination
- wire clk2_output_dest; // Core clock2 signal output destination
- wire irq_7_inputsrc; // IRQ 7 source
- wire irq_8_inputsrc; // IRQ 8 source
-
- // Convert GPIO signals to sky130_fd_io pad signals
- convert_gpio_sigs convert_gpio_bit (
- .gpio_out(gpio_out),
- .gpio_outenb(gpio_outenb),
- .gpio_pu(gpio_pullup),
- .gpio_pd(gpio_pulldown),
- .gpio_out_pad(gpio_out_pad),
- .gpio_outenb_pad(gpio_outenb_pad),
- .gpio_inenb_pad(gpio_inenb_pad),
- .gpio_mode1_pad(gpio_mode1_pad),
- .gpio_mode0_pad(gpio_mode0_pad)
- );
-
- reg [31:0] irq;
- wire irq_7;
- wire irq_8;
- wire irq_stall;
- wire irq_uart;
- wire irq_spi_master;
- wire irq_counter_timer0;
- wire irq_counter_timer1;
- wire ser_tx;
-
- wire wb_clk_i;
- wire wb_rst_i;
-
- assign irq_stall = 0;
- assign irq_7 = (irq_7_inputsrc == 1'b1) ? mgmt_in_data[7] : 1'b0;
- assign irq_8 = (irq_8_inputsrc == 1'b1) ? mgmt_in_data[12] : 1'b0;
-
- always @* begin
- irq = 0;
- irq[3] = irq_stall;
- irq[4] = irq_uart;
- irq[6] = irq_spi;
- irq[7] = irq_7;
- irq[8] = irq_8;
- irq[9] = irq_spi_master;
- irq[10] = irq_counter_timer0;
- irq[11] = irq_counter_timer1;
- irq[14:12] = user_irq;
- end
-
- // Assumption : no syscon module and wb_clk is the clock coming from the
- // caravel_clocking module
-
- assign wb_clk_i = clk;
- assign wb_rst_i = ~resetn; // Redundant
-
- // Wishbone Master
- wire [31:0] cpu_adr_o;
- wire [31:0] cpu_dat_i;
- wire [3:0] cpu_sel_o;
- wire cpu_we_o;
- wire cpu_cyc_o;
- wire cpu_stb_o;
- wire [31:0] cpu_dat_o;
- wire cpu_ack_i;
- wire mem_instr;
-
- picorv32_wb #(
- .STACKADDR(STACKADDR),
- .PROGADDR_RESET(PROGADDR_RESET),
- .PROGADDR_IRQ(PROGADDR_IRQ),
- .BARREL_SHIFTER(1),
- .COMPRESSED_ISA(1),
- .ENABLE_MUL(1),
- .ENABLE_DIV(1),
- .ENABLE_IRQ(1),
- .ENABLE_IRQ_QREGS(0)
- ) cpu (
- .wb_clk_i (wb_clk_i),
- .wb_rst_i (wb_rst_i),
- .trap (trap),
- .irq (irq),
- .mem_instr(mem_instr),
- .wbm_adr_o(cpu_adr_o),
- .wbm_dat_i(cpu_dat_i),
- .wbm_stb_o(cpu_stb_o),
- .wbm_ack_i(cpu_ack_i),
- .wbm_cyc_o(cpu_cyc_o),
- .wbm_dat_o(cpu_dat_o),
- .wbm_we_o(cpu_we_o),
- .wbm_sel_o(cpu_sel_o)
- );
-
- // Wishbone Slave SPIMEMIO
- wire spimemio_flash_stb_i;
- wire spimemio_flash_ack_o;
- wire [31:0] spimemio_flash_dat_o;
-
- wire spimemio_cfg_stb_i;
- wire spimemio_cfg_ack_o;
- wire [31:0] spimemio_cfg_dat_o;
- wire spimemio_quad_mode;
-
- wire flash_io2_do;
- wire flash_io3_do;
-
- spimemio_wb spimemio (
- .wb_clk_i(wb_clk_i),
- .wb_rst_i(wb_rst_i),
-
- .wb_adr_i(cpu_adr_o),
- .wb_dat_i(cpu_dat_o),
- .wb_sel_i(cpu_sel_o),
- .wb_we_i(cpu_we_o),
- .wb_cyc_i(cpu_cyc_o),
-
- // FLash Slave
- .wb_flash_stb_i(spimemio_flash_stb_i),
- .wb_flash_ack_o(spimemio_flash_ack_o),
- .wb_flash_dat_o(spimemio_flash_dat_o),
-
- // Config Register Slave
- .wb_cfg_stb_i(spimemio_cfg_stb_i),
- .wb_cfg_ack_o(spimemio_cfg_ack_o),
- .wb_cfg_dat_o(spimemio_cfg_dat_o),
-
- .quad_mode(spimemio_quad_mode),
- .pass_thru(pass_thru_mgmt),
- .pass_thru_csb(pass_thru_mgmt_csb),
- .pass_thru_sck(pass_thru_mgmt_sck),
- .pass_thru_sdi(pass_thru_mgmt_sdi),
- .pass_thru_sdo(pass_thru_mgmt_sdo),
-
- .flash_csb (flash_csb),
- .flash_clk (flash_clk),
-
- .flash_csb_oeb (flash_csb_oeb),
- .flash_clk_oeb (flash_clk_oeb),
-
- .flash_io0_oeb (flash_io0_oeb),
- .flash_io1_oeb (flash_io1_oeb),
- .flash_io2_oeb (flash_io2_oeb), // through GPIO 36
- .flash_io3_oeb (flash_io3_oeb), // through GPIO 37
-
- .flash_csb_ieb (flash_csb_ieb),
- .flash_clk_ieb (flash_clk_ieb),
-
- .flash_io0_ieb (flash_io0_ieb),
- .flash_io1_ieb (flash_io1_ieb),
- .flash_io2_ieb (), // unused
- .flash_io3_ieb (), // unused
-
- .flash_io0_do (flash_io0_do),
- .flash_io1_do (flash_io1_do),
- .flash_io2_do (flash_io2_do), // through GPIO 36
- .flash_io3_do (flash_io3_do), // through GPIO 37
-
- .flash_io0_di (flash_io0_di),
- .flash_io1_di (flash_io1_di),
- .flash_io2_di (mgmt_in_data[(`MPRJ_IO_PADS)-2]),
- .flash_io3_di (mgmt_in_data[(`MPRJ_IO_PADS)-1])
- );
-
- // Wishbone Slave uart
- wire uart_stb_i;
- wire uart_ack_o;
- wire [31:0] uart_dat_o;
- wire uart_enabled;
-
- simpleuart_wb #(
- .BASE_ADR(UART_BASE_ADR),
- .CLK_DIV(UART_CLK_DIV),
- .DATA(UART_DATA)
- ) simpleuart (
- // Wishbone Interface
- .wb_clk_i(wb_clk_i),
- .wb_rst_i(wb_rst_i),
-
- .wb_adr_i(cpu_adr_o),
- .wb_dat_i(cpu_dat_o),
- .wb_sel_i(cpu_sel_o),
- .wb_we_i(cpu_we_o),
- .wb_cyc_i(cpu_cyc_o),
-
- .wb_stb_i(uart_stb_i),
- .wb_ack_o(uart_ack_o),
- .wb_dat_o(uart_dat_o),
-
- .uart_enabled(uart_enabled),
- .ser_tx(ser_tx),
- .ser_rx(mgmt_in_data[5])
- );
-
- // Wishbone SPI master
- wire spi_master_stb_i;
- wire spi_master_ack_o;
- wire [31:0] spi_master_dat_o;
- wire spi_enabled;
- wire spi_csb, spi_sck, spi_sdo;
-
- simple_spi_master_wb #(
- .BASE_ADR(SPI_MASTER_BASE_ADR),
- .CONFIG(SPI_MASTER_CONFIG),
- .DATA(SPI_MASTER_DATA)
- ) simple_spi_master_inst (
- // Wishbone Interface
- .wb_clk_i(wb_clk_i),
- .wb_rst_i(wb_rst_i),
-
- .wb_adr_i(cpu_adr_o),
- .wb_dat_i(cpu_dat_o),
- .wb_sel_i(cpu_sel_o),
- .wb_we_i(cpu_we_o),
- .wb_cyc_i(cpu_cyc_o),
-
- .wb_stb_i(spi_master_stb_i),
- .wb_ack_o(spi_master_ack_o),
- .wb_dat_o(spi_master_dat_o),
-
- .hk_connect(hk_connect),
- .spi_enabled(spi_enabled),
- .csb(spi_csb),
- .sck(spi_sck),
- .sdo(spi_sdo),
- .sdi(mgmt_in_data[1]),
- .sdoenb(),
- .irq(irq_spi_master)
- );
-
- wire counter_timer_strobe, counter_timer_offset;
- wire counter_timer0_enable, counter_timer1_enable;
- wire counter_timer0_stop, counter_timer1_stop;
-
- // Wishbone Counter-timer 0
- wire counter_timer0_stb_i;
- wire counter_timer0_ack_o;
- wire [31:0] counter_timer0_dat_o;
-
- counter_timer_low_wb #(
- .BASE_ADR(COUNTER_TIMER0_BASE_ADR),
- .CONFIG(COUNTER_TIMER0_CONFIG),
- .VALUE(COUNTER_TIMER0_VALUE),
- .DATA(COUNTER_TIMER0_DATA)
- ) counter_timer_0 (
- // Wishbone Interface
- .wb_clk_i(wb_clk_i),
- .wb_rst_i(wb_rst_i),
-
- .wb_adr_i(cpu_adr_o),
- .wb_dat_i(cpu_dat_o),
- .wb_sel_i(cpu_sel_o),
- .wb_we_i(cpu_we_o),
- .wb_cyc_i(cpu_cyc_o),
-
- .wb_stb_i(counter_timer0_stb_i),
- .wb_ack_o(counter_timer0_ack_o),
- .wb_dat_o(counter_timer0_dat_o),
-
- .enable_in(counter_timer1_enable),
- .stop_in(counter_timer1_stop),
- .strobe(counter_timer_strobe),
- .is_offset(counter_timer_offset),
- .enable_out(counter_timer0_enable),
- .stop_out(counter_timer0_stop),
- .irq(irq_counter_timer0)
- );
-
- // Wishbone Counter-timer 1
- wire counter_timer1_stb_i;
- wire counter_timer1_ack_o;
- wire [31:0] counter_timer1_dat_o;
-
- counter_timer_high_wb #(
- .BASE_ADR(COUNTER_TIMER1_BASE_ADR),
- .CONFIG(COUNTER_TIMER1_CONFIG),
- .VALUE(COUNTER_TIMER1_VALUE),
- .DATA(COUNTER_TIMER1_DATA)
- ) counter_timer_1 (
- // Wishbone Interface
- .wb_clk_i(wb_clk_i),
- .wb_rst_i(wb_rst_i),
-
- .wb_adr_i(cpu_adr_o),
- .wb_dat_i(cpu_dat_o),
- .wb_sel_i(cpu_sel_o),
- .wb_we_i(cpu_we_o),
- .wb_cyc_i(cpu_cyc_o),
-
- .wb_stb_i(counter_timer1_stb_i),
- .wb_ack_o(counter_timer1_ack_o),
- .wb_dat_o(counter_timer1_dat_o),
-
- .enable_in(counter_timer0_enable),
- .strobe(counter_timer_strobe),
- .stop_in(counter_timer0_stop),
- .is_offset(counter_timer_offset),
- .enable_out(counter_timer1_enable),
- .stop_out(counter_timer1_stop),
- .irq(irq_counter_timer1)
- );
-
- // Wishbone Slave GPIO Registers
- wire gpio_stb_i;
- wire gpio_ack_o;
- wire [31:0] gpio_dat_o;
-
- gpio_wb #(
- .BASE_ADR(GPIO_BASE_ADR),
- .GPIO_DATA(GPIO_DATA),
- .GPIO_ENA(GPIO_ENA),
- .GPIO_PD(GPIO_PD),
- .GPIO_PU(GPIO_PU)
- ) gpio_wb (
- .wb_clk_i(wb_clk_i),
- .wb_rst_i(wb_rst_i),
- .wb_adr_i(cpu_adr_o),
- .wb_dat_i(cpu_dat_o),
- .wb_sel_i(cpu_sel_o),
- .wb_we_i(cpu_we_o),
- .wb_cyc_i(cpu_cyc_o),
- .wb_stb_i(gpio_stb_i),
- .wb_ack_o(gpio_ack_o),
- .wb_dat_o(gpio_dat_o),
- .gpio_in_pad(gpio_in_pad),
- .gpio(gpio_out),
- .gpio_oeb(gpio_outenb),
- .gpio_pu(gpio_pullup),
- .gpio_pd(gpio_pulldown)
- );
-
- // Wishbone Slave System Control Register
- wire sys_stb_i;
- wire sys_ack_o;
- wire [31:0] sys_dat_o;
-
- sysctrl_wb #(
- .BASE_ADR(SYS_BASE_ADR),
- .PWRGOOD(PWRGOOD),
- .CLK_OUT(CLK_OUT),
- .TRAP_OUT(TRAP_OUT),
- .IRQ_SRC(IRQ_SRC)
- ) sysctrl (
- .wb_clk_i(wb_clk_i),
- .wb_rst_i(wb_rst_i),
-
- .wb_adr_i(cpu_adr_o),
- .wb_dat_i(cpu_dat_o),
- .wb_sel_i(cpu_sel_o),
- .wb_we_i(cpu_we_o),
- .wb_cyc_i(cpu_cyc_o),
-
- .wb_stb_i(sys_stb_i),
- .wb_ack_o(sys_ack_o),
- .wb_dat_o(sys_dat_o),
-
- .usr1_vcc_pwrgood(mprj_vcc_pwrgood),
- .usr2_vcc_pwrgood(mprj2_vcc_pwrgood),
- .usr1_vdd_pwrgood(mprj_vdd_pwrgood),
- .usr2_vdd_pwrgood(mprj2_vdd_pwrgood),
- .trap_output_dest(trap_output_dest),
- .clk1_output_dest(clk1_output_dest),
- .clk2_output_dest(clk2_output_dest),
- .irq_7_inputsrc(irq_7_inputsrc),
- .irq_8_inputsrc(irq_8_inputsrc)
- );
-
- // Logic Analyzer
- wire la_stb_i;
- wire la_ack_o;
- wire [31:0] la_dat_o;
-
- la_wb #(
- .BASE_ADR(LA_BASE_ADR),
- .LA_DATA_0(LA_DATA_0),
- .LA_DATA_1(LA_DATA_1),
- .LA_DATA_3(LA_DATA_3),
- .LA_OENB_0(LA_OENB_0),
- .LA_OENB_1(LA_OENB_1),
- .LA_OENB_2(LA_OENB_2),
- .LA_OENB_3(LA_OENB_3),
- .LA_IENA_0(LA_IENA_0),
- .LA_IENA_1(LA_IENA_1),
- .LA_IENA_2(LA_IENA_2),
- .LA_IENA_3(LA_IENA_3),
- .LA_SAMPLE(LA_SAMPLE)
- ) la (
- .wb_clk_i(wb_clk_i),
- .wb_rst_i(wb_rst_i),
-
- .wb_adr_i(cpu_adr_o),
- .wb_dat_i(cpu_dat_o),
- .wb_sel_i(cpu_sel_o),
- .wb_we_i(cpu_we_o),
- .wb_cyc_i(cpu_cyc_o),
-
- .wb_stb_i(la_stb_i),
- .wb_ack_o(la_ack_o),
- .wb_dat_o(la_dat_o),
-
- .la_data(la_output),
- .la_data_in(la_input),
- .la_oenb(la_oenb),
- .la_iena(la_iena)
- );
-
- // User project WB MI A port
- assign mprj_cyc_o = cpu_cyc_o;
- assign mprj_we_o = cpu_we_o;
- assign mprj_sel_o = cpu_sel_o;
- assign mprj_adr_o = cpu_adr_o;
- assign mprj_dat_o = cpu_dat_o;
-
- // WB Slave User Project Control
- wire mprj_ctrl_stb_i;
- wire mprj_ctrl_ack_o;
- wire [31:0] mprj_ctrl_dat_o;
- wire [`MPRJ_IO_PADS-1:0] mgmt_out_pre;
-
- // Bits assigned to specific functions as outputs prevent the mprj
- // GPIO-as-output from applying data when that function is active
-
- assign mgmt_out_data[`MPRJ_IO_PADS-3:16] = mgmt_out_pre[`MPRJ_IO_PADS-3:16];
-
- // spimemio module controls last two data out lines when in quad mode.
- // These go to GPIO 36 and 37. The input and OEB lines are routed
- // individually and have their own independent signal names.
-
- assign mgmt_out_data[`MPRJ_IO_PADS-1] = (spimemio_quad_mode) ?
- flash_io3_do : mgmt_out_pre[`MPRJ_IO_PADS-1];
- assign mgmt_out_data[`MPRJ_IO_PADS-2] = (spimemio_quad_mode) ?
- flash_io2_do : mgmt_out_pre[`MPRJ_IO_PADS-2];
-
- // Routing of output monitors (PLL, trap, clk1, clk2)
- assign mgmt_out_data[15] = clk2_output_dest ? user_clk : mgmt_out_pre[15];
- assign mgmt_out_data[14] = clk1_output_dest ? clk : mgmt_out_pre[14];
- assign mgmt_out_data[13] = trap_output_dest ? trap : mgmt_out_pre[13];
-
- assign mgmt_out_data[12:7] = mgmt_out_pre[12:7];
- assign mgmt_out_data[6] = uart_enabled ? ser_tx : mgmt_out_pre[6];
-
- assign mgmt_out_data[0] = mgmt_out_pre[0];
- assign mgmt_out_data[1] = mgmt_out_pre[1];
- assign mgmt_out_data[5] = mgmt_out_pre[5];
-
- assign mgmt_out_data[2] = spi_enabled ? spi_sdo : mgmt_out_pre[2];
- assign mgmt_out_data[3] = spi_enabled ? spi_csb : mgmt_out_pre[3];
- assign mgmt_out_data[4] = spi_enabled ? spi_sck : mgmt_out_pre[4];
-
- mprj_ctrl_wb #(
- .BASE_ADR(MPRJ_CTRL_ADR)
- ) mprj_ctrl (
- .wb_clk_i(wb_clk_i),
- .wb_rst_i(wb_rst_i),
-
- .wb_adr_i(cpu_adr_o),
- .wb_dat_i(cpu_dat_o),
- .wb_sel_i(cpu_sel_o),
- .wb_we_i(cpu_we_o),
- .wb_cyc_i(cpu_cyc_o),
- .wb_stb_i(mprj_ctrl_stb_i),
- .wb_ack_o(mprj_ctrl_ack_o),
- .wb_dat_o(mprj_ctrl_dat_o),
-
- .serial_clock(mprj_io_loader_clock),
- .serial_resetn(mprj_io_loader_resetn),
- .serial_data_out_1(mprj_io_loader_data_1),
- .serial_data_out_2(mprj_io_loader_data_2),
- .sdo_oenb_state(sdo_oenb_state),
- .jtag_oenb_state(jtag_oenb_state),
- .flash_io2_oenb_state(flash_io2_oenb_state),
- .flash_io3_oenb_state(flash_io3_oenb_state),
- .mgmt_gpio_out(mgmt_out_pre),
- .mgmt_gpio_oeb(mgmt_oeb_data),
- .mgmt_gpio_in(mgmt_in_data),
- .pwr_ctrl_out(pwr_ctrl_out),
- .user_irq_ena(user_irq_ena)
- );
-
- // Wishbone Slave RAM
- wire mem_stb_i;
- wire mem_ack_o;
- wire [31:0] mem_dat_o;
-
- mem_wb soc_mem (
- `ifdef USE_POWER_PINS
- .VPWR(vdd1v8),
- .VGND(vss),
- `endif
- .wb_clk_i(wb_clk_i),
- .wb_rst_i(wb_rst_i),
-
- .wb_adr_i(cpu_adr_o),
- .wb_dat_i(cpu_dat_o),
- .wb_sel_i(cpu_sel_o),
- .wb_we_i(cpu_we_o),
- .wb_cyc_i(cpu_cyc_o),
-
- .wb_stb_i(mem_stb_i),
- .wb_ack_o(mem_ack_o),
- .wb_dat_o(mem_dat_o)
- );
-
- wire stg_rw_stb_i;
- wire stg_ro_stb_i;
- wire stg_rw_ack_o;
- wire stg_ro_ack_o;
- wire [31:0] stg_rw_dat_o;
- wire [31:0] stg_ro_dat_o;
-
- // Storage area wishbone brige
- storage_bridge_wb #(
- .RW_BLOCKS_ADR(RW_BLOCKS_ADR),
- .RO_BLOCKS_ADR(RO_BLOCKS_ADR)
- ) wb_bridge (
- .wb_clk_i(wb_clk_i),
- .wb_rst_i(wb_rst_i),
- .wb_adr_i(cpu_adr_o),
- .wb_dat_i(cpu_dat_o),
- .wb_sel_i(cpu_sel_o),
- .wb_we_i(cpu_we_o),
- .wb_cyc_i(cpu_cyc_o),
- .wb_stb_i({stg_ro_stb_i, stg_rw_stb_i}),
- .wb_ack_o({stg_ro_ack_o, stg_rw_ack_o}),
- .wb_rw_dat_o(stg_rw_dat_o),
- // MGMT_AREA RO WB Interface
- .wb_ro_dat_o(stg_ro_dat_o),
- // MGMT Area native memory interface
- .mgmt_ena(mgmt_ena),
- .mgmt_wen_mask(mgmt_wen_mask),
- .mgmt_wen(mgmt_wen),
- .mgmt_addr(mgmt_addr),
- .mgmt_wdata(mgmt_wdata),
- .mgmt_rdata(mgmt_rdata),
- // MGMT_AREA RO interface
- .mgmt_ena_ro(mgmt_ena_ro),
- .mgmt_addr_ro(mgmt_addr_ro),
- .mgmt_rdata_ro(mgmt_rdata_ro)
- );
-
- // Wishbone intercon logic
- wb_intercon #(
- .AW(ADR_WIDTH),
- .DW(DAT_WIDTH),
- .NS(NUM_SLAVES),
- .ADR_MASK(ADR_MASK),
- .SLAVE_ADR(SLAVE_ADR)
- ) intercon (
- // Master Interface
- .wbm_adr_i(cpu_adr_o),
- .wbm_stb_i(cpu_stb_o),
- .wbm_dat_o(cpu_dat_i),
- .wbm_ack_o(cpu_ack_i),
-
- // Slaves Interface
- .wbs_stb_o({ sys_stb_i, spimemio_cfg_stb_i,
- mprj_stb_o, mprj_ctrl_stb_i, la_stb_i,
- spi_master_stb_i, counter_timer1_stb_i, counter_timer0_stb_i,
- gpio_stb_i, uart_stb_i,
- spimemio_flash_stb_i, stg_ro_stb_i, stg_rw_stb_i, mem_stb_i }),
- .wbs_dat_i({ sys_dat_o, spimemio_cfg_dat_o,
- mprj_dat_i, mprj_ctrl_dat_o, la_dat_o,
- spi_master_dat_o, counter_timer1_dat_o, counter_timer0_dat_o,
- gpio_dat_o, uart_dat_o,
- spimemio_flash_dat_o, stg_ro_dat_o ,stg_rw_dat_o, mem_dat_o }),
- .wbs_ack_i({ sys_ack_o, spimemio_cfg_ack_o,
- mprj_ack_i, mprj_ctrl_ack_o, la_ack_o,
- spi_master_ack_o, counter_timer1_ack_o, counter_timer0_ack_o,
- gpio_ack_o, uart_ack_o,
- spimemio_flash_ack_o, stg_ro_ack_o, stg_rw_ack_o, mem_ack_o })
- );
-
-endmodule
-
-// Implementation note:
-// Replace the following two modules with wrappers for your SRAM cells.
-
-module mgmt_soc_regs (
- input clk, wen,
- input [5:0] waddr,
- input [5:0] raddr1,
- input [5:0] raddr2,
- input [31:0] wdata,
- output [31:0] rdata1,
- output [31:0] rdata2
-);
- reg [31:0] regs [0:31];
-
- always @(posedge clk)
- if (wen) regs[waddr[4:0]] <= wdata;
-
- assign rdata1 = regs[raddr1[4:0]];
- assign rdata2 = regs[raddr2[4:0]];
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/mprj2_logic_high.v b/caravel/rtl/mprj2_logic_high.v
deleted file mode 100644
index e63b1a4..0000000
--- a/caravel/rtl/mprj2_logic_high.v
+++ /dev/null
@@ -1,33 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-module mprj2_logic_high (
-`ifdef USE_POWER_PINS
- inout vccd2,
- inout vssd2,
-`endif
- output HI
-);
-sky130_fd_sc_hd__conb_1 inst (
-`ifdef USE_POWER_PINS
- .VPWR(vccd2),
- .VGND(vssd2),
- .VPB(vccd2),
- .VNB(vssd2),
-`endif
- .HI(HI),
- .LO()
- );
-endmodule
diff --git a/caravel/rtl/mprj_ctrl.v b/caravel/rtl/mprj_ctrl.v
deleted file mode 100644
index f6dbfd3..0000000
--- a/caravel/rtl/mprj_ctrl.v
+++ /dev/null
@@ -1,437 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-module mprj_ctrl_wb #(
- parameter BASE_ADR = 32'h 2300_0000,
- parameter XFER = 8'h 00,
- parameter PWRDATA = 8'h 04,
- parameter IRQDATA = 8'h 08,
- parameter IODATA = 8'h 0c, // One word per 32 IOs
- parameter IOCONFIG = 8'h 24
-)(
- input wb_clk_i,
- input wb_rst_i,
-
- input [31:0] wb_dat_i,
- input [31:0] wb_adr_i,
- input [3:0] wb_sel_i,
- input wb_cyc_i,
- input wb_stb_i,
- input wb_we_i,
-
- output [31:0] wb_dat_o,
- output wb_ack_o,
-
- // Output is to serial loader
- output serial_clock,
- output serial_resetn,
- output serial_data_out_1,
- output serial_data_out_2,
-
- // Pass state of OEB bit on SDO and JTAG back to the core
- // so that the function can be overridden for management output
- output sdo_oenb_state,
- output jtag_oenb_state,
- output flash_io2_oenb_state,
- output flash_io3_oenb_state,
-
- // Read/write data to each GPIO pad from management SoC
- input [`MPRJ_IO_PADS-1:0] mgmt_gpio_in,
- output [`MPRJ_IO_PADS-1:0] mgmt_gpio_out,
- output [`MPRJ_IO_PADS-1:0] mgmt_gpio_oeb,
-
- // Write data to power controls
- output [`MPRJ_PWR_PADS-1:0] pwr_ctrl_out,
-
- // Enable user project IRQ signals to management SoC
- output [2:0] user_irq_ena
-);
- wire resetn;
- wire valid;
- wire ready;
- wire [3:0] iomem_we;
-
- assign resetn = ~wb_rst_i;
- assign valid = wb_stb_i && wb_cyc_i;
-
- assign iomem_we = wb_sel_i & {4{wb_we_i}};
- assign wb_ack_o = ready;
-
- mprj_ctrl #(
- .BASE_ADR(BASE_ADR),
- .XFER(XFER),
- .PWRDATA(PWRDATA),
- .IRQDATA(IRQDATA),
- .IODATA(IODATA),
- .IOCONFIG(IOCONFIG)
- ) mprj_ctrl (
- .clk(wb_clk_i),
- .resetn(resetn),
- .iomem_addr(wb_adr_i),
- .iomem_valid(valid),
- .iomem_wstrb(iomem_we[1:0]),
- .iomem_wdata(wb_dat_i),
- .iomem_rdata(wb_dat_o),
- .iomem_ready(ready),
-
- .serial_clock(serial_clock),
- .serial_resetn(serial_resetn),
- .serial_data_out_1(serial_data_out_1),
- .serial_data_out_2(serial_data_out_2),
- .sdo_oenb_state(sdo_oenb_state),
- .jtag_oenb_state(jtag_oenb_state),
- .flash_io2_oenb_state(flash_io2_oenb_state),
- .flash_io3_oenb_state(flash_io3_oenb_state),
- // .mgmt_gpio_io(mgmt_gpio_io)
- .mgmt_gpio_in(mgmt_gpio_in),
- .mgmt_gpio_out(mgmt_gpio_out),
- .mgmt_gpio_oeb(mgmt_gpio_oeb),
-
- // Write data to power controls
- .pwr_ctrl_out(pwr_ctrl_out),
- // Enable user project IRQ signals to management SoC
- .user_irq_ena(user_irq_ena)
- );
-
-endmodule
-
-module mprj_ctrl #(
- parameter BASE_ADR = 32'h 2300_0000,
- parameter XFER = 8'h 00,
- parameter PWRDATA = 8'h 04,
- parameter IRQDATA = 8'h 08,
- parameter IODATA = 8'h 0c,
- parameter IOCONFIG = 8'h 24,
- parameter IO_CTRL_BITS = 13
-)(
- input clk,
- input resetn,
-
- input [31:0] iomem_addr,
- input iomem_valid,
- input [1:0] iomem_wstrb,
- input [31:0] iomem_wdata,
- output reg [31:0] iomem_rdata,
- output reg iomem_ready,
-
- output serial_clock,
- output serial_resetn,
- output serial_data_out_1,
- output serial_data_out_2,
- output sdo_oenb_state,
- output jtag_oenb_state,
- output flash_io2_oenb_state,
- output flash_io3_oenb_state,
- input [`MPRJ_IO_PADS-1:0] mgmt_gpio_in,
- output [`MPRJ_IO_PADS-1:0] mgmt_gpio_out,
- output [`MPRJ_IO_PADS-1:0] mgmt_gpio_oeb,
- output [`MPRJ_PWR_PADS-1:0] pwr_ctrl_out,
- output [2:0] user_irq_ena
-);
-
-`define IDLE 2'b00
-`define START 2'b01
-`define XBYTE 2'b10
-`define LOAD 2'b11
-
- localparam IO_WORDS = (`MPRJ_IO_PADS % 32 != 0) + (`MPRJ_IO_PADS / 32);
-
- localparam IO_BASE_ADR = (BASE_ADR | IOCONFIG);
-
- localparam OEB = 1; // Offset of output enable in shift register.
- localparam INP_DIS = 3; // Offset of input disable in shift register.
-
- reg [IO_CTRL_BITS-1:0] io_ctrl[`MPRJ_IO_PADS-1:0]; // I/O control, 1 word per gpio pad
- reg [`MPRJ_IO_PADS-1:0] mgmt_gpio_out; // I/O write data, 1 bit per gpio pad
- reg [`MPRJ_PWR_PADS-1:0] pwr_ctrl_out; // Power write data, 1 bit per power pad
- reg [2:0] user_irq_ena; // Enable user to raise IRQs
- reg xfer_ctrl; // Transfer control (1 bit)
-
- wire [IO_WORDS-1:0] io_data_sel; // wishbone selects
- wire pwr_data_sel;
- wire irq_data_sel;
- wire xfer_sel;
- wire busy;
- wire selected;
- wire [`MPRJ_IO_PADS-1:0] io_ctrl_sel;
- reg [31:0] iomem_rdata_pre;
-
- wire [`MPRJ_IO_PADS-1:0] mgmt_gpio_in;
-
- wire sdo_oenb_state, jtag_oenb_state;
- wire flash_io2_oenb_state, flash_io3_oenb_state;
-
- // JTAG and housekeeping SDO are normally controlled by their respective
- // modules with OEB set to the default 1 value. If configured for an
- // additional output by setting the OEB bit low, then pass this information
- // back to the core so that the default signals can be overridden.
-
- assign jtag_oenb_state = io_ctrl[0][OEB];
- assign sdo_oenb_state = io_ctrl[1][OEB];
-
- // Likewise for the flash_io2 and flash_io3, although they are configured
- // as input by default.
- assign flash_io2_oenb_state = io_ctrl[(`MPRJ_IO_PADS)-2][OEB];
- assign flash_io3_oenb_state = io_ctrl[(`MPRJ_IO_PADS)-1][OEB];
-
- `define wtop (((i+1)*32 > `MPRJ_IO_PADS) ? `MPRJ_IO_PADS-1 : (i+1)*32-1)
- `define wbot (i*32)
- `define rtop (`wtop - `wbot)
-
- genvar i;
-
- // Assign selection bits per address
-
- assign xfer_sel = (iomem_addr[7:0] == XFER);
- assign pwr_data_sel = (iomem_addr[7:0] == PWRDATA);
- assign irq_data_sel = (iomem_addr[7:0] == IRQDATA);
-
- generate
- for (i=0; i<IO_WORDS; i=i+1) begin
- assign io_data_sel[i] = (iomem_addr[7:0] == (IODATA + i*4));
- end
-
- for (i=0; i<`MPRJ_IO_PADS; i=i+1) begin
- assign io_ctrl_sel[i] = (iomem_addr[7:0] == (IO_BASE_ADR[7:0] + i*4));
- assign mgmt_gpio_oeb[i] = ~io_ctrl[i][INP_DIS];
- end
- endgenerate
-
-
- // Set selection and iomem_rdata_pre
-
- assign selected = xfer_sel || pwr_data_sel || irq_data_sel || (|io_data_sel) || (|io_ctrl_sel);
-
- wire [31:0] io_data_arr[0:IO_WORDS-1];
- wire [31:0] io_ctrl_arr[0:`MPRJ_IO_PADS-1];
- generate
- for (i=0; i<IO_WORDS; i=i+1) begin
- assign io_data_arr[i] = {{(31-`rtop){1'b0}}, mgmt_gpio_in[`wtop:`wbot]};
-
- end
- for (i=0; i<`MPRJ_IO_PADS; i=i+1) begin
- assign io_ctrl_arr[i] = {{(32-IO_CTRL_BITS){1'b0}}, io_ctrl[i]};
- end
- endgenerate
-
-
- integer j;
- always @ * begin
- iomem_rdata_pre = 'b0;
- if (xfer_sel) begin
- iomem_rdata_pre = {31'b0, busy};
- end else if (pwr_data_sel) begin
- iomem_rdata_pre = {{(32-`MPRJ_PWR_PADS){1'b0}}, pwr_ctrl_out};
- end else if (irq_data_sel) begin
- iomem_rdata_pre = {29'b0, user_irq_ena};
- end else if (|io_data_sel) begin
- for (j=0; j<IO_WORDS; j=j+1) begin
- if (io_data_sel[j]) begin
- iomem_rdata_pre = io_data_arr[j];
- end
- end
- end else begin
- for (j=0; j<`MPRJ_IO_PADS; j=j+1) begin
- if (io_ctrl_sel[j]) begin
- iomem_rdata_pre = io_ctrl_arr[j];
- end
- end
- end
- end
-
- // General I/O transfer
-
- always @(posedge clk) begin
- if (!resetn) begin
- iomem_rdata <= 0;
- iomem_ready <= 0;
- end else begin
- iomem_ready <= 0;
- if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
- iomem_ready <= 1'b 1;
-
- if (selected) begin
- iomem_rdata <= iomem_rdata_pre;
- end
- end
- end
- end
-
- // I/O write of xfer bit. Also handles iomem_ready signal and power data.
-
- always @(posedge clk) begin
- if (!resetn) begin
- xfer_ctrl <= 0;
- pwr_ctrl_out <= 0;
- user_irq_ena <= 0;
- end else begin
- if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
- if (xfer_sel) begin
- if (iomem_wstrb[0]) xfer_ctrl <= iomem_wdata[0];
- end else if (pwr_data_sel) begin
- if (iomem_wstrb[0]) pwr_ctrl_out <= iomem_wdata[`MPRJ_PWR_PADS-1:0];
- end else if (irq_data_sel) begin
- if (iomem_wstrb[0]) user_irq_ena <= iomem_wdata[2:0];
- end
- end else begin
- xfer_ctrl <= 1'b0; // Immediately self-resetting
- end
- end
- end
-
- // I/O transfer of gpio data to/from user project region under management
- // SoC control
-
- generate
- for (i=0; i<IO_WORDS; i=i+1) begin
- always @(posedge clk) begin
- if (!resetn) begin
- mgmt_gpio_out[`wtop:`wbot] <= 'd0;
- end else begin
- if (iomem_valid && !iomem_ready && iomem_addr[31:8] ==
- BASE_ADR[31:8]) begin
- if (io_data_sel[i]) begin
- if (iomem_wstrb[0]) begin
- mgmt_gpio_out[`wtop:`wbot] <= iomem_wdata[`rtop:0];
- end
- end
- end
- end
- end
- end
-
- for (i=0; i<`MPRJ_IO_PADS; i=i+1) begin
- always @(posedge clk) begin
- if (!resetn) begin
- // NOTE: This initialization must match the defaults passed
- // to the control blocks. Specifically, 0x1803 is for a
- // bidirectional pad, and 0x0403 is for a simple input pad
- if ((i < 2) || (i >= `MPRJ_IO_PADS - 2)) begin
- io_ctrl[i] <= 'h1803;
- end else begin
- io_ctrl[i] <= 'h0403;
- end
- end else begin
- if (iomem_valid && !iomem_ready &&
- iomem_addr[31:8] == BASE_ADR[31:8]) begin
- if (io_ctrl_sel[i]) begin
- // NOTE: Byte-wide write to io_ctrl is prohibited
- if (iomem_wstrb[0])
- io_ctrl[i] <= iomem_wdata[IO_CTRL_BITS-1:0];
- end
- end
- end
- end
- end
- endgenerate
-
- reg [3:0] xfer_count;
- reg [4:0] pad_count_1;
- reg [5:0] pad_count_2;
- reg [1:0] xfer_state;
- reg serial_clock;
- reg serial_resetn;
-
- reg [IO_CTRL_BITS-1:0] serial_data_staging_1;
- reg [IO_CTRL_BITS-1:0] serial_data_staging_2;
-
- wire serial_data_out_1;
- wire serial_data_out_2;
-
- assign serial_data_out_1 = serial_data_staging_1[IO_CTRL_BITS-1];
- assign serial_data_out_2 = serial_data_staging_2[IO_CTRL_BITS-1];
- assign busy = (xfer_state != `IDLE);
-
- always @(posedge clk or negedge resetn) begin
- if (resetn == 1'b0) begin
-
- xfer_state <= `IDLE;
- xfer_count <= 4'd0;
- /* NOTE: This assumes that MPRJ_IO_PADS_1 and MPRJ_IO_PADS_2 are
- * equal, because they get clocked the same number of cycles by
- * the same clock signal. pad_count_2 gates the count for both.
- */
- pad_count_1 <= `MPRJ_IO_PADS_1 - 1;
- pad_count_2 <= `MPRJ_IO_PADS_1;
- serial_resetn <= 1'b0;
- serial_clock <= 1'b0;
- serial_data_staging_1 <= 0;
- serial_data_staging_2 <= 0;
-
- end else begin
-
- if (xfer_state == `IDLE) begin
- pad_count_1 <= `MPRJ_IO_PADS_1 - 1;
- pad_count_2 <= `MPRJ_IO_PADS_1;
- serial_resetn <= 1'b1;
- serial_clock <= 1'b0;
- if (xfer_ctrl == 1'b1) begin
- xfer_state <= `START;
- end
- end else if (xfer_state == `START) begin
- serial_resetn <= 1'b1;
- serial_clock <= 1'b0;
- xfer_count <= 6'd0;
- pad_count_1 <= pad_count_1 - 1;
- pad_count_2 <= pad_count_2 + 1;
- xfer_state <= `XBYTE;
- serial_data_staging_1 <= io_ctrl[pad_count_1];
- serial_data_staging_2 <= io_ctrl[pad_count_2];
- end else if (xfer_state == `XBYTE) begin
- serial_resetn <= 1'b1;
- serial_clock <= ~serial_clock;
- if (serial_clock == 1'b0) begin
- if (xfer_count == IO_CTRL_BITS - 1) begin
- if (pad_count_2 == `MPRJ_IO_PADS) begin
- xfer_state <= `LOAD;
- end else begin
- xfer_state <= `START;
- end
- end else begin
- xfer_count <= xfer_count + 1;
- end
- end else begin
- serial_data_staging_1 <= {serial_data_staging_1[IO_CTRL_BITS-2:0], 1'b0};
- serial_data_staging_2 <= {serial_data_staging_2[IO_CTRL_BITS-2:0], 1'b0};
- end
- end else if (xfer_state == `LOAD) begin
- xfer_count <= xfer_count + 1;
-
- /* Load sequence: Raise clock for final data shift in;
- * Pulse reset low while clock is high
- * Set clock back to zero.
- * Return to idle mode.
- */
- if (xfer_count == 4'd0) begin
- serial_clock <= 1'b1;
- serial_resetn <= 1'b1;
- end else if (xfer_count == 4'd1) begin
- serial_clock <= 1'b1;
- serial_resetn <= 1'b0;
- end else if (xfer_count == 4'd2) begin
- serial_clock <= 1'b1;
- serial_resetn <= 1'b1;
- end else if (xfer_count == 4'd3) begin
- serial_resetn <= 1'b1;
- serial_clock <= 1'b0;
- xfer_state <= `IDLE;
- end
- end
- end
- end
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/mprj_io.v b/caravel/rtl/mprj_io.v
deleted file mode 100644
index 3a94da0..0000000
--- a/caravel/rtl/mprj_io.v
+++ /dev/null
@@ -1,138 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-// `default_nettype none
-
-/* Define the array of GPIO pads. Note that the analog project support
- * version of caravel (caravan) defines fewer GPIO and replaces them
- * with analog in the chip_io_alt module. Because the pad signalling
- * remains the same, `MPRJ_IO_PADS does not change, so a local parameter
- * is made that can be made smaller than `MPRJ_IO_PADS to accommodate
- * the analog pads.
- */
-
-module mprj_io #(
- parameter AREA1PADS = `MPRJ_IO_PADS_1,
- parameter TOTAL_PADS = `MPRJ_IO_PADS
-) (
- inout vddio,
- inout vssio,
- inout vdda,
- inout vssa,
- inout vccd,
- inout vssd,
-
- inout vdda1,
- inout vdda2,
- inout vssa1,
- inout vssa2,
- inout vccd1,
- inout vccd2,
- inout vssd1,
- inout vssd2,
-
- input vddio_q,
- input vssio_q,
- input analog_a,
- input analog_b,
- input porb_h,
- inout [TOTAL_PADS-1:0] io,
- input [TOTAL_PADS-1:0] io_out,
- input [TOTAL_PADS-1:0] oeb,
- input [TOTAL_PADS-1:0] hldh_n,
- input [TOTAL_PADS-1:0] enh,
- input [TOTAL_PADS-1:0] inp_dis,
- input [TOTAL_PADS-1:0] ib_mode_sel,
- input [TOTAL_PADS-1:0] vtrip_sel,
- input [TOTAL_PADS-1:0] slow_sel,
- input [TOTAL_PADS-1:0] holdover,
- input [TOTAL_PADS-1:0] analog_en,
- input [TOTAL_PADS-1:0] analog_sel,
- input [TOTAL_PADS-1:0] analog_pol,
- input [TOTAL_PADS*3-1:0] dm,
- output [TOTAL_PADS-1:0] io_in,
- output [TOTAL_PADS-1:0] io_in_3v3,
- inout [TOTAL_PADS-10:0] analog_io,
- inout [TOTAL_PADS-10:0] analog_noesd_io
-);
-
- wire [TOTAL_PADS-1:0] loop1_io;
- wire [6:0] no_connect_1a, no_connect_1b;
- wire [1:0] no_connect_2a, no_connect_2b;
-
- sky130_ef_io__gpiov2_pad_wrapped area1_io_pad [AREA1PADS - 1:0] (
- `USER1_ABUTMENT_PINS
- `ifndef TOP_ROUTING
- ,.PAD(io[AREA1PADS - 1:0]),
- `endif
- .OUT(io_out[AREA1PADS - 1:0]),
- .OE_N(oeb[AREA1PADS - 1:0]),
- .HLD_H_N(hldh_n[AREA1PADS - 1:0]),
- .ENABLE_H(enh[AREA1PADS - 1:0]),
- .ENABLE_INP_H(loop1_io[AREA1PADS - 1:0]),
- .ENABLE_VDDA_H(porb_h),
- .ENABLE_VSWITCH_H(vssio),
- .ENABLE_VDDIO(vccd),
- .INP_DIS(inp_dis[AREA1PADS - 1:0]),
- .IB_MODE_SEL(ib_mode_sel[AREA1PADS - 1:0]),
- .VTRIP_SEL(vtrip_sel[AREA1PADS - 1:0]),
- .SLOW(slow_sel[AREA1PADS - 1:0]),
- .HLD_OVR(holdover[AREA1PADS - 1:0]),
- .ANALOG_EN(analog_en[AREA1PADS - 1:0]),
- .ANALOG_SEL(analog_sel[AREA1PADS - 1:0]),
- .ANALOG_POL(analog_pol[AREA1PADS - 1:0]),
- .DM(dm[AREA1PADS*3 - 1:0]),
- .PAD_A_NOESD_H({analog_noesd_io[AREA1PADS - 8:0], no_connect_1a}),
- .PAD_A_ESD_0_H({analog_io[AREA1PADS - 8:0], no_connect_1b}),
- .PAD_A_ESD_1_H(),
- .IN(io_in[AREA1PADS - 1:0]),
- .IN_H(io_in_3v3[AREA1PADS - 1:0]),
- .TIE_HI_ESD(),
- .TIE_LO_ESD(loop1_io[AREA1PADS - 1:0])
- );
-
- sky130_ef_io__gpiov2_pad_wrapped area2_io_pad [TOTAL_PADS - AREA1PADS - 1:0] (
- `USER2_ABUTMENT_PINS
- `ifndef TOP_ROUTING
- ,.PAD(io[TOTAL_PADS - 1:AREA1PADS]),
- `endif
- .OUT(io_out[TOTAL_PADS - 1:AREA1PADS]),
- .OE_N(oeb[TOTAL_PADS - 1:AREA1PADS]),
- .HLD_H_N(hldh_n[TOTAL_PADS - 1:AREA1PADS]),
- .ENABLE_H(enh[TOTAL_PADS - 1:AREA1PADS]),
- .ENABLE_INP_H(loop1_io[TOTAL_PADS - 1:AREA1PADS]),
- .ENABLE_VDDA_H(porb_h),
- .ENABLE_VSWITCH_H(vssio),
- .ENABLE_VDDIO(vccd),
- .INP_DIS(inp_dis[TOTAL_PADS - 1:AREA1PADS]),
- .IB_MODE_SEL(ib_mode_sel[TOTAL_PADS - 1:AREA1PADS]),
- .VTRIP_SEL(vtrip_sel[TOTAL_PADS - 1:AREA1PADS]),
- .SLOW(slow_sel[TOTAL_PADS - 1:AREA1PADS]),
- .HLD_OVR(holdover[TOTAL_PADS - 1:AREA1PADS]),
- .ANALOG_EN(analog_en[TOTAL_PADS - 1:AREA1PADS]),
- .ANALOG_SEL(analog_sel[TOTAL_PADS - 1:AREA1PADS]),
- .ANALOG_POL(analog_pol[TOTAL_PADS - 1:AREA1PADS]),
- .DM(dm[TOTAL_PADS*3 - 1:AREA1PADS*3]),
- .PAD_A_NOESD_H({no_connect_2a, analog_noesd_io[TOTAL_PADS - 10:AREA1PADS - 7]}),
- .PAD_A_ESD_0_H({no_connect_2b, analog_io[TOTAL_PADS - 10:AREA1PADS - 7]}),
- .PAD_A_ESD_1_H(),
- .IN(io_in[TOTAL_PADS - 1:AREA1PADS]),
- .IN_H(io_in_3v3[TOTAL_PADS - 1:AREA1PADS]),
- .TIE_HI_ESD(),
- .TIE_LO_ESD(loop1_io[TOTAL_PADS - 1:AREA1PADS])
- );
-
-endmodule
-// `default_nettype wire
diff --git a/caravel/rtl/mprj_logic_high.v b/caravel/rtl/mprj_logic_high.v
deleted file mode 100644
index 8801cc8..0000000
--- a/caravel/rtl/mprj_logic_high.v
+++ /dev/null
@@ -1,33 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-module mprj_logic_high (
-`ifdef USE_POWER_PINS
- inout vccd1,
- inout vssd1,
-`endif
- output [461:0] HI
-);
-sky130_fd_sc_hd__conb_1 insts [461:0] (
-`ifdef USE_POWER_PINS
- .VPWR(vccd1),
- .VGND(vssd1),
- .VPB(vccd1),
- .VNB(vssd1),
-`endif
- .HI(HI),
- .LO()
- );
-endmodule
diff --git a/caravel/rtl/pads.v b/caravel/rtl/pads.v
deleted file mode 100644
index f89ba90..0000000
--- a/caravel/rtl/pads.v
+++ /dev/null
@@ -1,172 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-// `default_nettype none
-`ifndef TOP_ROUTING
- `define USER1_ABUTMENT_PINS \
- .AMUXBUS_A(analog_a),\
- .AMUXBUS_B(analog_b),\
- .VSSA(vssa1),\
- .VDDA(vdda1),\
- .VSWITCH(vddio),\
- .VDDIO_Q(vddio_q),\
- .VCCHIB(vccd),\
- .VDDIO(vddio),\
- .VCCD(vccd1),\
- .VSSIO(vssio),\
- .VSSD(vssd1),\
- .VSSIO_Q(vssio_q)
-
- `define USER2_ABUTMENT_PINS \
- .AMUXBUS_A(analog_a),\
- .AMUXBUS_B(analog_b),\
- .VSSA(vssa2),\
- .VDDA(vdda2),\
- .VSWITCH(vddio),\
- .VDDIO_Q(vddio_q),\
- .VCCHIB(vccd),\
- .VDDIO(vddio),\
- .VCCD(vccd2),\
- .VSSIO(vssio),\
- .VSSD(vssd2),\
- .VSSIO_Q(vssio_q)
-
- `define MGMT_ABUTMENT_PINS \
- .AMUXBUS_A(analog_a),\
- .AMUXBUS_B(analog_b),\
- .VSSA(vssa),\
- .VDDA(vdda),\
- .VSWITCH(vddio),\
- .VDDIO_Q(vddio_q),\
- .VCCHIB(vccd),\
- .VDDIO(vddio),\
- .VCCD(vccd),\
- .VSSIO(vssio),\
- .VSSD(vssd),\
- .VSSIO_Q(vssio_q)
-`else
- `define USER1_ABUTMENT_PINS
- `define USER2_ABUTMENT_PINS
- `define MGMT_ABUTMENT_PINS
-`endif
-
-`define HVCLAMP_PINS(H,L) \
- .DRN_HVC(H), \
- .SRC_BDY_HVC(L)
-
-`define LVCLAMP_PINS(H1,L1,H2,L2,L3) \
- .BDY2_B2B(L3), \
- .DRN_LVC1(H1), \
- .DRN_LVC2(H2), \
- .SRC_BDY_LVC1(L1), \
- .SRC_BDY_LVC2(L2)
-
-`define INPUT_PAD(X,Y) \
- wire loop_``X; \
- sky130_ef_io__gpiov2_pad_wrapped X``_pad ( \
- `MGMT_ABUTMENT_PINS \
- `ifndef TOP_ROUTING \
- ,.PAD(X), \
- `endif \
- .OUT(vssd), \
- .OE_N(vccd), \
- .HLD_H_N(vddio), \
- .ENABLE_H(porb_h), \
- .ENABLE_INP_H(loop_``X), \
- .ENABLE_VDDA_H(porb_h), \
- .ENABLE_VSWITCH_H(vssa), \
- .ENABLE_VDDIO(vccd), \
- .INP_DIS(por), \
- .IB_MODE_SEL(vssd), \
- .VTRIP_SEL(vssd), \
- .SLOW(vssd), \
- .HLD_OVR(vssd), \
- .ANALOG_EN(vssd), \
- .ANALOG_SEL(vssd), \
- .ANALOG_POL(vssd), \
- .DM({vssd, vssd, vccd}), \
- .PAD_A_NOESD_H(), \
- .PAD_A_ESD_0_H(), \
- .PAD_A_ESD_1_H(), \
- .IN(Y), \
- .IN_H(), \
- .TIE_HI_ESD(), \
- .TIE_LO_ESD(loop_``X) )
-
-`define OUTPUT_PAD(X,Y,INPUT_DIS,OUT_EN_N) \
- wire loop_``X; \
- sky130_ef_io__gpiov2_pad_wrapped X``_pad ( \
- `MGMT_ABUTMENT_PINS \
- `ifndef TOP_ROUTING \
- ,.PAD(X), \
- `endif \
- .OUT(Y), \
- .OE_N(OUT_EN_N), \
- .HLD_H_N(vddio), \
- .ENABLE_H(porb_h), \
- .ENABLE_INP_H(loop_``X), \
- .ENABLE_VDDA_H(porb_h), \
- .ENABLE_VSWITCH_H(vssa), \
- .ENABLE_VDDIO(vccd), \
- .INP_DIS(INPUT_DIS), \
- .IB_MODE_SEL(vssd), \
- .VTRIP_SEL(vssd), \
- .SLOW(vssd), \
- .HLD_OVR(vssd), \
- .ANALOG_EN(vssd), \
- .ANALOG_SEL(vssd), \
- .ANALOG_POL(vssd), \
- .DM({vccd, vccd, vssd}), \
- .PAD_A_NOESD_H(), \
- .PAD_A_ESD_0_H(), \
- .PAD_A_ESD_1_H(), \
- .IN(), \
- .IN_H(), \
- .TIE_HI_ESD(), \
- .TIE_LO_ESD(loop_``X))
-
-`define INOUT_PAD(X,Y,Y_OUT,INPUT_DIS,OUT_EN_N,MODE) \
- wire loop_``X; \
- sky130_ef_io__gpiov2_pad_wrapped X``_pad ( \
- `MGMT_ABUTMENT_PINS \
- `ifndef TOP_ROUTING \
- ,.PAD(X), \
- `endif \
- .OUT(Y_OUT), \
- .OE_N(OUT_EN_N), \
- .HLD_H_N(vddio), \
- .ENABLE_H(porb_h), \
- .ENABLE_INP_H(loop_``X), \
- .ENABLE_VDDA_H(porb_h), \
- .ENABLE_VSWITCH_H(vssa), \
- .ENABLE_VDDIO(vccd), \
- .INP_DIS(INPUT_DIS), \
- .IB_MODE_SEL(vssd), \
- .VTRIP_SEL(vssd), \
- .SLOW(vssd), \
- .HLD_OVR(vssd), \
- .ANALOG_EN(vssd), \
- .ANALOG_SEL(vssd), \
- .ANALOG_POL(vssd), \
- .DM(MODE), \
- .PAD_A_NOESD_H(), \
- .PAD_A_ESD_0_H(), \
- .PAD_A_ESD_1_H(), \
- .IN(Y), \
- .IN_H(), \
- .TIE_HI_ESD(), \
- .TIE_LO_ESD(loop_``X) )
-
-// `default_nettype wire
diff --git a/caravel/rtl/picorv32.v b/caravel/rtl/picorv32.v
deleted file mode 100644
index 1316273..0000000
--- a/caravel/rtl/picorv32.v
+++ /dev/null
@@ -1,3048 +0,0 @@
-`default_nettype none
-/*
- * SPDX-FileCopyrightText: 2015 Clifford Wolf
- * PicoRV32 -- A Small RISC-V (RV32I) Processor Core
- *
- * Copyright (C) 2015 Clifford Wolf <clifford@clifford.at>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * SPDX-License-Identifier: ISC
- */
-
-/* verilator lint_off WIDTH */
-/* verilator lint_off PINMISSING */
-/* verilator lint_off CASEOVERLAP */
-/* verilator lint_off CASEINCOMPLETE */
-
-`timescale 1 ns / 1 ps
-// `define DEBUGNETS
-// `define DEBUGREGS
-// `define DEBUGASM
-// `define DEBUG
-
-`ifdef DEBUG
- `define debug(debug_command) debug_command
-`else
- `define debug(debug_command)
-`endif
-
-`ifdef FORMAL
- `define FORMAL_KEEP (* keep *)
- `define assert(assert_expr) assert(assert_expr)
-`else
- `ifdef DEBUGNETS
- `define FORMAL_KEEP (* keep *)
- `else
- `define FORMAL_KEEP
- `endif
- `define assert(assert_expr) empty_statement
-`endif
-
-// uncomment this for register file in extra module
-// `define PICORV32_REGS picorv32_regs
-
-// this macro can be used to check if the verilog files in your
-// design are read in the correct order.
-`define PICORV32_V
-
-
-/***************************************************************
- * picorv32
- ***************************************************************/
-
-module picorv32 #(
- parameter [ 0:0] ENABLE_COUNTERS = 1,
- parameter [ 0:0] ENABLE_COUNTERS64 = 1,
- parameter [ 0:0] ENABLE_REGS_16_31 = 1,
- parameter [ 0:0] ENABLE_REGS_DUALPORT = 1,
- parameter [ 0:0] LATCHED_MEM_RDATA = 0,
- parameter [ 0:0] TWO_STAGE_SHIFT = 1,
- parameter [ 0:0] BARREL_SHIFTER = 0,
- parameter [ 0:0] TWO_CYCLE_COMPARE = 0,
- parameter [ 0:0] TWO_CYCLE_ALU = 0,
- parameter [ 0:0] COMPRESSED_ISA = 0,
- parameter [ 0:0] CATCH_MISALIGN = 1,
- parameter [ 0:0] CATCH_ILLINSN = 1,
- parameter [ 0:0] ENABLE_PCPI = 0,
- parameter [ 0:0] ENABLE_MUL = 0,
- parameter [ 0:0] ENABLE_FAST_MUL = 0,
- parameter [ 0:0] ENABLE_DIV = 0,
- parameter [ 0:0] ENABLE_IRQ = 0,
- parameter [ 0:0] ENABLE_IRQ_QREGS = 1,
- parameter [ 0:0] ENABLE_IRQ_TIMER = 1,
- parameter [ 0:0] ENABLE_TRACE = 0,
- parameter [ 0:0] REGS_INIT_ZERO = 0,
- parameter [31:0] MASKED_IRQ = 32'h 0000_0000,
- parameter [31:0] LATCHED_IRQ = 32'h ffff_ffff,
- parameter [31:0] PROGADDR_RESET = 32'h 0000_0000,
- parameter [31:0] PROGADDR_IRQ = 32'h 0000_0010,
- parameter [31:0] STACKADDR = 32'h ffff_ffff
-) (
- input clk, resetn,
- output reg trap,
-
- output reg mem_valid,
- output reg mem_instr,
- input mem_ready,
-
- output reg [31:0] mem_addr,
- output reg [31:0] mem_wdata,
- output reg [ 3:0] mem_wstrb,
- input [31:0] mem_rdata,
-
- // Look-Ahead Interface
- output mem_la_read,
- output mem_la_write,
- output [31:0] mem_la_addr,
- output reg [31:0] mem_la_wdata,
- output reg [ 3:0] mem_la_wstrb,
-
- // Pico Co-Processor Interface (PCPI)
- output reg pcpi_valid,
- output reg [31:0] pcpi_insn,
- output [31:0] pcpi_rs1,
- output [31:0] pcpi_rs2,
- input pcpi_wr,
- input [31:0] pcpi_rd,
- input pcpi_wait,
- input pcpi_ready,
-
- // IRQ Interface
- input [31:0] irq,
- output reg [31:0] eoi,
-
-`ifdef RISCV_FORMAL
- output reg rvfi_valid,
- output reg [63:0] rvfi_order,
- output reg [31:0] rvfi_insn,
- output reg rvfi_trap,
- output reg rvfi_halt,
- output reg rvfi_intr,
- output reg [ 1:0] rvfi_mode,
- output reg [ 1:0] rvfi_ixl,
- output reg [ 4:0] rvfi_rs1_addr,
- output reg [ 4:0] rvfi_rs2_addr,
- output reg [31:0] rvfi_rs1_rdata,
- output reg [31:0] rvfi_rs2_rdata,
- output reg [ 4:0] rvfi_rd_addr,
- output reg [31:0] rvfi_rd_wdata,
- output reg [31:0] rvfi_pc_rdata,
- output reg [31:0] rvfi_pc_wdata,
- output reg [31:0] rvfi_mem_addr,
- output reg [ 3:0] rvfi_mem_rmask,
- output reg [ 3:0] rvfi_mem_wmask,
- output reg [31:0] rvfi_mem_rdata,
- output reg [31:0] rvfi_mem_wdata,
-
- output reg [63:0] rvfi_csr_mcycle_rmask,
- output reg [63:0] rvfi_csr_mcycle_wmask,
- output reg [63:0] rvfi_csr_mcycle_rdata,
- output reg [63:0] rvfi_csr_mcycle_wdata,
-
- output reg [63:0] rvfi_csr_minstret_rmask,
- output reg [63:0] rvfi_csr_minstret_wmask,
- output reg [63:0] rvfi_csr_minstret_rdata,
- output reg [63:0] rvfi_csr_minstret_wdata,
-`endif
-
- // Trace Interface
- output reg trace_valid,
- output reg [35:0] trace_data
-);
- localparam integer irq_timer = 0;
- localparam integer irq_ebreak = 1;
- localparam integer irq_buserror = 2;
-
- localparam integer irqregs_offset = ENABLE_REGS_16_31 ? 32 : 16;
- localparam integer regfile_size = (ENABLE_REGS_16_31 ? 32 : 16) + 4*ENABLE_IRQ*ENABLE_IRQ_QREGS;
- localparam integer regindex_bits = (ENABLE_REGS_16_31 ? 5 : 4) + ENABLE_IRQ*ENABLE_IRQ_QREGS;
-
- localparam WITH_PCPI = ENABLE_PCPI || ENABLE_MUL || ENABLE_FAST_MUL || ENABLE_DIV;
-
- localparam [35:0] TRACE_BRANCH = {4'b 0001, 32'b 0};
- localparam [35:0] TRACE_ADDR = {4'b 0010, 32'b 0};
- localparam [35:0] TRACE_IRQ = {4'b 1000, 32'b 0};
-
- reg [63:0] count_cycle, count_instr;
- reg [31:0] reg_pc, reg_next_pc, reg_op1, reg_op2, reg_out;
- reg [4:0] reg_sh;
-
- reg [31:0] next_insn_opcode;
- reg [31:0] dbg_insn_opcode;
- reg [31:0] dbg_insn_addr;
-
- wire dbg_mem_valid = mem_valid;
- wire dbg_mem_instr = mem_instr;
- wire dbg_mem_ready = mem_ready;
- wire [31:0] dbg_mem_addr = mem_addr;
- wire [31:0] dbg_mem_wdata = mem_wdata;
- wire [ 3:0] dbg_mem_wstrb = mem_wstrb;
- wire [31:0] dbg_mem_rdata = mem_rdata;
-
- assign pcpi_rs1 = reg_op1;
- assign pcpi_rs2 = reg_op2;
-
- wire [31:0] next_pc;
-
- reg irq_delay;
- reg irq_active;
- reg [31:0] irq_mask;
- reg [31:0] irq_pending;
- reg [31:0] timer;
-
-`ifndef PICORV32_REGS
- reg [31:0] cpuregs [0:regfile_size-1];
-
- integer i;
- initial begin
- if (REGS_INIT_ZERO) begin
- for (i = 0; i < regfile_size; i = i+1)
- cpuregs[i] = 0;
- end
- end
-`endif
-
- task empty_statement;
- // This task is used by the `assert directive in non-formal mode to
- // avoid empty statement (which are unsupported by plain Verilog syntax).
- begin end
- endtask
-
-`ifdef DEBUGREGS
- wire [31:0] dbg_reg_x0 = 0;
- wire [31:0] dbg_reg_x1 = cpuregs[1];
- wire [31:0] dbg_reg_x2 = cpuregs[2];
- wire [31:0] dbg_reg_x3 = cpuregs[3];
- wire [31:0] dbg_reg_x4 = cpuregs[4];
- wire [31:0] dbg_reg_x5 = cpuregs[5];
- wire [31:0] dbg_reg_x6 = cpuregs[6];
- wire [31:0] dbg_reg_x7 = cpuregs[7];
- wire [31:0] dbg_reg_x8 = cpuregs[8];
- wire [31:0] dbg_reg_x9 = cpuregs[9];
- wire [31:0] dbg_reg_x10 = cpuregs[10];
- wire [31:0] dbg_reg_x11 = cpuregs[11];
- wire [31:0] dbg_reg_x12 = cpuregs[12];
- wire [31:0] dbg_reg_x13 = cpuregs[13];
- wire [31:0] dbg_reg_x14 = cpuregs[14];
- wire [31:0] dbg_reg_x15 = cpuregs[15];
- wire [31:0] dbg_reg_x16 = cpuregs[16];
- wire [31:0] dbg_reg_x17 = cpuregs[17];
- wire [31:0] dbg_reg_x18 = cpuregs[18];
- wire [31:0] dbg_reg_x19 = cpuregs[19];
- wire [31:0] dbg_reg_x20 = cpuregs[20];
- wire [31:0] dbg_reg_x21 = cpuregs[21];
- wire [31:0] dbg_reg_x22 = cpuregs[22];
- wire [31:0] dbg_reg_x23 = cpuregs[23];
- wire [31:0] dbg_reg_x24 = cpuregs[24];
- wire [31:0] dbg_reg_x25 = cpuregs[25];
- wire [31:0] dbg_reg_x26 = cpuregs[26];
- wire [31:0] dbg_reg_x27 = cpuregs[27];
- wire [31:0] dbg_reg_x28 = cpuregs[28];
- wire [31:0] dbg_reg_x29 = cpuregs[29];
- wire [31:0] dbg_reg_x30 = cpuregs[30];
- wire [31:0] dbg_reg_x31 = cpuregs[31];
-`endif
-
- // Internal PCPI Cores
-
- wire pcpi_mul_wr;
- wire [31:0] pcpi_mul_rd;
- wire pcpi_mul_wait;
- wire pcpi_mul_ready;
-
- wire pcpi_div_wr;
- wire [31:0] pcpi_div_rd;
- wire pcpi_div_wait;
- wire pcpi_div_ready;
-
- reg pcpi_int_wr;
- reg [31:0] pcpi_int_rd;
- reg pcpi_int_wait;
- reg pcpi_int_ready;
-
- generate if (ENABLE_FAST_MUL) begin
- picorv32_pcpi_fast_mul pcpi_mul (
- .clk (clk ),
- .resetn (resetn ),
- .pcpi_valid(pcpi_valid ),
- .pcpi_insn (pcpi_insn ),
- .pcpi_rs1 (pcpi_rs1 ),
- .pcpi_rs2 (pcpi_rs2 ),
- .pcpi_wr (pcpi_mul_wr ),
- .pcpi_rd (pcpi_mul_rd ),
- .pcpi_wait (pcpi_mul_wait ),
- .pcpi_ready(pcpi_mul_ready )
- );
- end else if (ENABLE_MUL) begin
- picorv32_pcpi_mul pcpi_mul (
- .clk (clk ),
- .resetn (resetn ),
- .pcpi_valid(pcpi_valid ),
- .pcpi_insn (pcpi_insn ),
- .pcpi_rs1 (pcpi_rs1 ),
- .pcpi_rs2 (pcpi_rs2 ),
- .pcpi_wr (pcpi_mul_wr ),
- .pcpi_rd (pcpi_mul_rd ),
- .pcpi_wait (pcpi_mul_wait ),
- .pcpi_ready(pcpi_mul_ready )
- );
- end else begin
- assign pcpi_mul_wr = 0;
- assign pcpi_mul_rd = 32'bx;
- assign pcpi_mul_wait = 0;
- assign pcpi_mul_ready = 0;
- end endgenerate
-
- generate if (ENABLE_DIV) begin
- picorv32_pcpi_div pcpi_div (
- .clk (clk ),
- .resetn (resetn ),
- .pcpi_valid(pcpi_valid ),
- .pcpi_insn (pcpi_insn ),
- .pcpi_rs1 (pcpi_rs1 ),
- .pcpi_rs2 (pcpi_rs2 ),
- .pcpi_wr (pcpi_div_wr ),
- .pcpi_rd (pcpi_div_rd ),
- .pcpi_wait (pcpi_div_wait ),
- .pcpi_ready(pcpi_div_ready )
- );
- end else begin
- assign pcpi_div_wr = 0;
- assign pcpi_div_rd = 32'bx;
- assign pcpi_div_wait = 0;
- assign pcpi_div_ready = 0;
- end endgenerate
-
- always @* begin
- pcpi_int_wr = 0;
- pcpi_int_rd = 32'bx;
- pcpi_int_wait = |{ENABLE_PCPI && pcpi_wait, (ENABLE_MUL || ENABLE_FAST_MUL) && pcpi_mul_wait, ENABLE_DIV && pcpi_div_wait};
- pcpi_int_ready = |{ENABLE_PCPI && pcpi_ready, (ENABLE_MUL || ENABLE_FAST_MUL) && pcpi_mul_ready, ENABLE_DIV && pcpi_div_ready};
-
- (* parallel_case *)
- case (1'b1)
- ENABLE_PCPI && pcpi_ready: begin
- pcpi_int_wr = ENABLE_PCPI ? pcpi_wr : 0;
- pcpi_int_rd = ENABLE_PCPI ? pcpi_rd : 0;
- end
- (ENABLE_MUL || ENABLE_FAST_MUL) && pcpi_mul_ready: begin
- pcpi_int_wr = pcpi_mul_wr;
- pcpi_int_rd = pcpi_mul_rd;
- end
- ENABLE_DIV && pcpi_div_ready: begin
- pcpi_int_wr = pcpi_div_wr;
- pcpi_int_rd = pcpi_div_rd;
- end
- endcase
- end
-
-
- // Memory Interface
-
- reg [1:0] mem_state;
- reg [1:0] mem_wordsize;
- reg [31:0] mem_rdata_word;
- reg [31:0] mem_rdata_q;
- reg mem_do_prefetch;
- reg mem_do_rinst;
- reg mem_do_rdata;
- reg mem_do_wdata;
-
- wire mem_xfer;
- reg mem_la_secondword, mem_la_firstword_reg, last_mem_valid;
- wire mem_la_firstword = COMPRESSED_ISA && (mem_do_prefetch || mem_do_rinst) && next_pc[1] && !mem_la_secondword;
- wire mem_la_firstword_xfer = COMPRESSED_ISA && mem_xfer && (!last_mem_valid ? mem_la_firstword : mem_la_firstword_reg);
-
- reg prefetched_high_word;
- reg clear_prefetched_high_word;
- reg [15:0] mem_16bit_buffer;
-
- wire [31:0] mem_rdata_latched_noshuffle;
- wire [31:0] mem_rdata_latched;
-
- wire mem_la_use_prefetched_high_word = COMPRESSED_ISA && mem_la_firstword && prefetched_high_word && !clear_prefetched_high_word;
- assign mem_xfer = (mem_valid && mem_ready) || (mem_la_use_prefetched_high_word && mem_do_rinst);
-
- wire mem_busy = |{mem_do_prefetch, mem_do_rinst, mem_do_rdata, mem_do_wdata};
- wire mem_done = resetn && ((mem_xfer && |mem_state && (mem_do_rinst || mem_do_rdata || mem_do_wdata)) || (&mem_state && mem_do_rinst)) &&
- (!mem_la_firstword || (~&mem_rdata_latched[1:0] && mem_xfer));
-
- assign mem_la_write = resetn && !mem_state && mem_do_wdata;
- assign mem_la_read = resetn && ((!mem_la_use_prefetched_high_word && !mem_state && (mem_do_rinst || mem_do_prefetch || mem_do_rdata)) ||
- (COMPRESSED_ISA && mem_xfer && (!last_mem_valid ? mem_la_firstword : mem_la_firstword_reg) && !mem_la_secondword && &mem_rdata_latched[1:0]));
- assign mem_la_addr = (mem_do_prefetch || mem_do_rinst) ? {next_pc[31:2] + mem_la_firstword_xfer, 2'b00} : {reg_op1[31:2], 2'b00};
-
- assign mem_rdata_latched_noshuffle = (mem_xfer || LATCHED_MEM_RDATA) ? mem_rdata : mem_rdata_q;
-
- assign mem_rdata_latched = COMPRESSED_ISA && mem_la_use_prefetched_high_word ? {16'bx, mem_16bit_buffer} :
- COMPRESSED_ISA && mem_la_secondword ? {mem_rdata_latched_noshuffle[15:0], mem_16bit_buffer} :
- COMPRESSED_ISA && mem_la_firstword ? {16'bx, mem_rdata_latched_noshuffle[31:16]} : mem_rdata_latched_noshuffle;
-
- always @(posedge clk) begin
- if (!resetn) begin
- mem_la_firstword_reg <= 0;
- last_mem_valid <= 0;
- end else begin
- if (!last_mem_valid)
- mem_la_firstword_reg <= mem_la_firstword;
- last_mem_valid <= mem_valid && !mem_ready;
- end
- end
-
- always @* begin
- (* full_case *)
- case (mem_wordsize)
- 0: begin
- mem_la_wdata = reg_op2;
- mem_la_wstrb = 4'b1111;
- mem_rdata_word = mem_rdata;
- end
- 1: begin
- mem_la_wdata = {2{reg_op2[15:0]}};
- mem_la_wstrb = reg_op1[1] ? 4'b1100 : 4'b0011;
- case (reg_op1[1])
- 1'b0: mem_rdata_word = {16'b0, mem_rdata[15: 0]};
- 1'b1: mem_rdata_word = {16'b0, mem_rdata[31:16]};
- endcase
- end
- 2: begin
- mem_la_wdata = {4{reg_op2[7:0]}};
- mem_la_wstrb = 4'b0001 << reg_op1[1:0];
- case (reg_op1[1:0])
- 2'b00: mem_rdata_word = {24'b0, mem_rdata[ 7: 0]};
- 2'b01: mem_rdata_word = {24'b0, mem_rdata[15: 8]};
- 2'b10: mem_rdata_word = {24'b0, mem_rdata[23:16]};
- 2'b11: mem_rdata_word = {24'b0, mem_rdata[31:24]};
- endcase
- end
- endcase
- end
-
- always @(posedge clk) begin
- if (mem_xfer) begin
- mem_rdata_q <= COMPRESSED_ISA ? mem_rdata_latched : mem_rdata;
- next_insn_opcode <= COMPRESSED_ISA ? mem_rdata_latched : mem_rdata;
- end
-
- if (COMPRESSED_ISA && mem_done && (mem_do_prefetch || mem_do_rinst)) begin
- case (mem_rdata_latched[1:0])
- 2'b00: begin // Quadrant 0
- case (mem_rdata_latched[15:13])
- 3'b000: begin // C.ADDI4SPN
- mem_rdata_q[14:12] <= 3'b000;
- mem_rdata_q[31:20] <= {2'b0, mem_rdata_latched[10:7], mem_rdata_latched[12:11], mem_rdata_latched[5], mem_rdata_latched[6], 2'b00};
- end
- 3'b010: begin // C.LW
- mem_rdata_q[31:20] <= {5'b0, mem_rdata_latched[5], mem_rdata_latched[12:10], mem_rdata_latched[6], 2'b00};
- mem_rdata_q[14:12] <= 3'b 010;
- end
- 3'b 110: begin // C.SW
- {mem_rdata_q[31:25], mem_rdata_q[11:7]} <= {5'b0, mem_rdata_latched[5], mem_rdata_latched[12:10], mem_rdata_latched[6], 2'b00};
- mem_rdata_q[14:12] <= 3'b 010;
- end
- endcase
- end
- 2'b01: begin // Quadrant 1
- case (mem_rdata_latched[15:13])
- 3'b 000: begin // C.ADDI
- mem_rdata_q[14:12] <= 3'b000;
- mem_rdata_q[31:20] <= $signed({mem_rdata_latched[12], mem_rdata_latched[6:2]});
- end
- 3'b 010: begin // C.LI
- mem_rdata_q[14:12] <= 3'b000;
- mem_rdata_q[31:20] <= $signed({mem_rdata_latched[12], mem_rdata_latched[6:2]});
- end
- 3'b 011: begin
- if (mem_rdata_latched[11:7] == 2) begin // C.ADDI16SP
- mem_rdata_q[14:12] <= 3'b000;
- mem_rdata_q[31:20] <= $signed({mem_rdata_latched[12], mem_rdata_latched[4:3],
- mem_rdata_latched[5], mem_rdata_latched[2], mem_rdata_latched[6], 4'b 0000});
- end else begin // C.LUI
- mem_rdata_q[31:12] <= $signed({mem_rdata_latched[12], mem_rdata_latched[6:2]});
- end
- end
- 3'b100: begin
- if (mem_rdata_latched[11:10] == 2'b00) begin // C.SRLI
- mem_rdata_q[31:25] <= 7'b0000000;
- mem_rdata_q[14:12] <= 3'b 101;
- end
- if (mem_rdata_latched[11:10] == 2'b01) begin // C.SRAI
- mem_rdata_q[31:25] <= 7'b0100000;
- mem_rdata_q[14:12] <= 3'b 101;
- end
- if (mem_rdata_latched[11:10] == 2'b10) begin // C.ANDI
- mem_rdata_q[14:12] <= 3'b111;
- mem_rdata_q[31:20] <= $signed({mem_rdata_latched[12], mem_rdata_latched[6:2]});
- end
- if (mem_rdata_latched[12:10] == 3'b011) begin // C.SUB, C.XOR, C.OR, C.AND
- if (mem_rdata_latched[6:5] == 2'b00) mem_rdata_q[14:12] <= 3'b000;
- if (mem_rdata_latched[6:5] == 2'b01) mem_rdata_q[14:12] <= 3'b100;
- if (mem_rdata_latched[6:5] == 2'b10) mem_rdata_q[14:12] <= 3'b110;
- if (mem_rdata_latched[6:5] == 2'b11) mem_rdata_q[14:12] <= 3'b111;
- mem_rdata_q[31:25] <= mem_rdata_latched[6:5] == 2'b00 ? 7'b0100000 : 7'b0000000;
- end
- end
- 3'b 110: begin // C.BEQZ
- mem_rdata_q[14:12] <= 3'b000;
- { mem_rdata_q[31], mem_rdata_q[7], mem_rdata_q[30:25], mem_rdata_q[11:8] } <=
- $signed({mem_rdata_latched[12], mem_rdata_latched[6:5], mem_rdata_latched[2],
- mem_rdata_latched[11:10], mem_rdata_latched[4:3]});
- end
- 3'b 111: begin // C.BNEZ
- mem_rdata_q[14:12] <= 3'b001;
- { mem_rdata_q[31], mem_rdata_q[7], mem_rdata_q[30:25], mem_rdata_q[11:8] } <=
- $signed({mem_rdata_latched[12], mem_rdata_latched[6:5], mem_rdata_latched[2],
- mem_rdata_latched[11:10], mem_rdata_latched[4:3]});
- end
- endcase
- end
- 2'b10: begin // Quadrant 2
- case (mem_rdata_latched[15:13])
- 3'b000: begin // C.SLLI
- mem_rdata_q[31:25] <= 7'b0000000;
- mem_rdata_q[14:12] <= 3'b 001;
- end
- 3'b010: begin // C.LWSP
- mem_rdata_q[31:20] <= {4'b0, mem_rdata_latched[3:2], mem_rdata_latched[12], mem_rdata_latched[6:4], 2'b00};
- mem_rdata_q[14:12] <= 3'b 010;
- end
- 3'b100: begin
- if (mem_rdata_latched[12] == 0 && mem_rdata_latched[6:2] == 0) begin // C.JR
- mem_rdata_q[14:12] <= 3'b000;
- mem_rdata_q[31:20] <= 12'b0;
- end
- if (mem_rdata_latched[12] == 0 && mem_rdata_latched[6:2] != 0) begin // C.MV
- mem_rdata_q[14:12] <= 3'b000;
- mem_rdata_q[31:25] <= 7'b0000000;
- end
- if (mem_rdata_latched[12] != 0 && mem_rdata_latched[11:7] != 0 && mem_rdata_latched[6:2] == 0) begin // C.JALR
- mem_rdata_q[14:12] <= 3'b000;
- mem_rdata_q[31:20] <= 12'b0;
- end
- if (mem_rdata_latched[12] != 0 && mem_rdata_latched[6:2] != 0) begin // C.ADD
- mem_rdata_q[14:12] <= 3'b000;
- mem_rdata_q[31:25] <= 7'b0000000;
- end
- end
- 3'b110: begin // C.SWSP
- {mem_rdata_q[31:25], mem_rdata_q[11:7]} <= {4'b0, mem_rdata_latched[8:7], mem_rdata_latched[12:9], 2'b00};
- mem_rdata_q[14:12] <= 3'b 010;
- end
- endcase
- end
- endcase
- end
- end
-
- always @(posedge clk) begin
- if (resetn && !trap) begin
- if (mem_do_prefetch || mem_do_rinst || mem_do_rdata)
- `assert(!mem_do_wdata);
-
- if (mem_do_prefetch || mem_do_rinst)
- `assert(!mem_do_rdata);
-
- if (mem_do_rdata)
- `assert(!mem_do_prefetch && !mem_do_rinst);
-
- if (mem_do_wdata)
- `assert(!(mem_do_prefetch || mem_do_rinst || mem_do_rdata));
-
- if (mem_state == 2 || mem_state == 3)
- `assert(mem_valid || mem_do_prefetch);
- end
- end
-
- always @(posedge clk) begin
- if (!resetn || trap) begin
- if (!resetn)
- mem_state <= 0;
- if (!resetn || mem_ready)
- mem_valid <= 0;
- mem_la_secondword <= 0;
- prefetched_high_word <= 0;
- end else begin
- if (mem_la_read || mem_la_write) begin
- mem_addr <= mem_la_addr;
- mem_wstrb <= mem_la_wstrb & {4{mem_la_write}};
- end
- if (mem_la_write) begin
- mem_wdata <= mem_la_wdata;
- end
- case (mem_state)
- 0: begin
- if (mem_do_prefetch || mem_do_rinst || mem_do_rdata) begin
- mem_valid <= !mem_la_use_prefetched_high_word;
- mem_instr <= mem_do_prefetch || mem_do_rinst;
- mem_wstrb <= 0;
- mem_state <= 1;
- end
- if (mem_do_wdata) begin
- mem_valid <= 1;
- mem_instr <= 0;
- mem_state <= 2;
- end
- end
- 1: begin
- `assert(mem_wstrb == 0);
- `assert(mem_do_prefetch || mem_do_rinst || mem_do_rdata);
- `assert(mem_valid == !mem_la_use_prefetched_high_word);
- `assert(mem_instr == (mem_do_prefetch || mem_do_rinst));
- if (mem_xfer) begin
- if (COMPRESSED_ISA && mem_la_read) begin
- mem_valid <= 1;
- mem_la_secondword <= 1;
- if (!mem_la_use_prefetched_high_word)
- mem_16bit_buffer <= mem_rdata[31:16];
- end else begin
- mem_valid <= 0;
- mem_la_secondword <= 0;
- if (COMPRESSED_ISA && !mem_do_rdata) begin
- if (~&mem_rdata[1:0] || mem_la_secondword) begin
- mem_16bit_buffer <= mem_rdata[31:16];
- prefetched_high_word <= 1;
- end else begin
- prefetched_high_word <= 0;
- end
- end
- mem_state <= mem_do_rinst || mem_do_rdata ? 0 : 3;
- end
- end
- end
- 2: begin
- `assert(mem_wstrb != 0);
- `assert(mem_do_wdata);
- if (mem_xfer) begin
- mem_valid <= 0;
- mem_state <= 0;
- end
- end
- 3: begin
- `assert(mem_wstrb == 0);
- `assert(mem_do_prefetch);
- if (mem_do_rinst) begin
- mem_state <= 0;
- end
- end
- endcase
- end
-
- if (clear_prefetched_high_word)
- prefetched_high_word <= 0;
- end
-
-
- // Instruction Decoder
-
- reg instr_lui, instr_auipc, instr_jal, instr_jalr;
- reg instr_beq, instr_bne, instr_blt, instr_bge, instr_bltu, instr_bgeu;
- reg instr_lb, instr_lh, instr_lw, instr_lbu, instr_lhu, instr_sb, instr_sh, instr_sw;
- reg instr_addi, instr_slti, instr_sltiu, instr_xori, instr_ori, instr_andi, instr_slli, instr_srli, instr_srai;
- reg instr_add, instr_sub, instr_sll, instr_slt, instr_sltu, instr_xor, instr_srl, instr_sra, instr_or, instr_and;
- reg instr_rdcycle, instr_rdcycleh, instr_rdinstr, instr_rdinstrh, instr_ecall_ebreak;
- reg instr_getq, instr_setq, instr_retirq, instr_maskirq, instr_waitirq, instr_timer;
- wire instr_trap;
-
- reg [regindex_bits-1:0] decoded_rd, decoded_rs1, decoded_rs2;
- reg [31:0] decoded_imm, decoded_imm_j;
- reg decoder_trigger;
- reg decoder_trigger_q;
- reg decoder_pseudo_trigger;
- reg decoder_pseudo_trigger_q;
- reg compressed_instr;
-
- reg is_lui_auipc_jal;
- reg is_lb_lh_lw_lbu_lhu;
- reg is_slli_srli_srai;
- reg is_jalr_addi_slti_sltiu_xori_ori_andi;
- reg is_sb_sh_sw;
- reg is_sll_srl_sra;
- reg is_lui_auipc_jal_jalr_addi_add_sub;
- reg is_slti_blt_slt;
- reg is_sltiu_bltu_sltu;
- reg is_beq_bne_blt_bge_bltu_bgeu;
- reg is_lbu_lhu_lw;
- reg is_alu_reg_imm;
- reg is_alu_reg_reg;
- reg is_compare;
-
- assign instr_trap = (CATCH_ILLINSN || WITH_PCPI) && !{instr_lui, instr_auipc, instr_jal, instr_jalr,
- instr_beq, instr_bne, instr_blt, instr_bge, instr_bltu, instr_bgeu,
- instr_lb, instr_lh, instr_lw, instr_lbu, instr_lhu, instr_sb, instr_sh, instr_sw,
- instr_addi, instr_slti, instr_sltiu, instr_xori, instr_ori, instr_andi, instr_slli, instr_srli, instr_srai,
- instr_add, instr_sub, instr_sll, instr_slt, instr_sltu, instr_xor, instr_srl, instr_sra, instr_or, instr_and,
- instr_rdcycle, instr_rdcycleh, instr_rdinstr, instr_rdinstrh,
- instr_getq, instr_setq, instr_retirq, instr_maskirq, instr_waitirq, instr_timer};
-
- wire is_rdcycle_rdcycleh_rdinstr_rdinstrh;
- assign is_rdcycle_rdcycleh_rdinstr_rdinstrh = |{instr_rdcycle, instr_rdcycleh, instr_rdinstr, instr_rdinstrh};
-
- reg [63:0] new_ascii_instr;
- `FORMAL_KEEP reg [63:0] dbg_ascii_instr;
- `FORMAL_KEEP reg [31:0] dbg_insn_imm;
- `FORMAL_KEEP reg [4:0] dbg_insn_rs1;
- `FORMAL_KEEP reg [4:0] dbg_insn_rs2;
- `FORMAL_KEEP reg [4:0] dbg_insn_rd;
- `FORMAL_KEEP reg [31:0] dbg_rs1val;
- `FORMAL_KEEP reg [31:0] dbg_rs2val;
- `FORMAL_KEEP reg dbg_rs1val_valid;
- `FORMAL_KEEP reg dbg_rs2val_valid;
-
- always @* begin
- new_ascii_instr = "";
-
- if (instr_lui) new_ascii_instr = "lui";
- if (instr_auipc) new_ascii_instr = "auipc";
- if (instr_jal) new_ascii_instr = "jal";
- if (instr_jalr) new_ascii_instr = "jalr";
-
- if (instr_beq) new_ascii_instr = "beq";
- if (instr_bne) new_ascii_instr = "bne";
- if (instr_blt) new_ascii_instr = "blt";
- if (instr_bge) new_ascii_instr = "bge";
- if (instr_bltu) new_ascii_instr = "bltu";
- if (instr_bgeu) new_ascii_instr = "bgeu";
-
- if (instr_lb) new_ascii_instr = "lb";
- if (instr_lh) new_ascii_instr = "lh";
- if (instr_lw) new_ascii_instr = "lw";
- if (instr_lbu) new_ascii_instr = "lbu";
- if (instr_lhu) new_ascii_instr = "lhu";
- if (instr_sb) new_ascii_instr = "sb";
- if (instr_sh) new_ascii_instr = "sh";
- if (instr_sw) new_ascii_instr = "sw";
-
- if (instr_addi) new_ascii_instr = "addi";
- if (instr_slti) new_ascii_instr = "slti";
- if (instr_sltiu) new_ascii_instr = "sltiu";
- if (instr_xori) new_ascii_instr = "xori";
- if (instr_ori) new_ascii_instr = "ori";
- if (instr_andi) new_ascii_instr = "andi";
- if (instr_slli) new_ascii_instr = "slli";
- if (instr_srli) new_ascii_instr = "srli";
- if (instr_srai) new_ascii_instr = "srai";
-
- if (instr_add) new_ascii_instr = "add";
- if (instr_sub) new_ascii_instr = "sub";
- if (instr_sll) new_ascii_instr = "sll";
- if (instr_slt) new_ascii_instr = "slt";
- if (instr_sltu) new_ascii_instr = "sltu";
- if (instr_xor) new_ascii_instr = "xor";
- if (instr_srl) new_ascii_instr = "srl";
- if (instr_sra) new_ascii_instr = "sra";
- if (instr_or) new_ascii_instr = "or";
- if (instr_and) new_ascii_instr = "and";
-
- if (instr_rdcycle) new_ascii_instr = "rdcycle";
- if (instr_rdcycleh) new_ascii_instr = "rdcycleh";
- if (instr_rdinstr) new_ascii_instr = "rdinstr";
- if (instr_rdinstrh) new_ascii_instr = "rdinstrh";
-
- if (instr_getq) new_ascii_instr = "getq";
- if (instr_setq) new_ascii_instr = "setq";
- if (instr_retirq) new_ascii_instr = "retirq";
- if (instr_maskirq) new_ascii_instr = "maskirq";
- if (instr_waitirq) new_ascii_instr = "waitirq";
- if (instr_timer) new_ascii_instr = "timer";
- end
-
- reg [63:0] q_ascii_instr;
- reg [31:0] q_insn_imm;
- reg [31:0] q_insn_opcode;
- reg [4:0] q_insn_rs1;
- reg [4:0] q_insn_rs2;
- reg [4:0] q_insn_rd;
- reg dbg_next;
-
- wire launch_next_insn;
- reg dbg_valid_insn;
-
- reg [63:0] cached_ascii_instr;
- reg [31:0] cached_insn_imm;
- reg [31:0] cached_insn_opcode;
- reg [4:0] cached_insn_rs1;
- reg [4:0] cached_insn_rs2;
- reg [4:0] cached_insn_rd;
-
- always @(posedge clk) begin
- q_ascii_instr <= dbg_ascii_instr;
- q_insn_imm <= dbg_insn_imm;
- q_insn_opcode <= dbg_insn_opcode;
- q_insn_rs1 <= dbg_insn_rs1;
- q_insn_rs2 <= dbg_insn_rs2;
- q_insn_rd <= dbg_insn_rd;
- dbg_next <= launch_next_insn;
-
- if (!resetn || trap)
- dbg_valid_insn <= 0;
- else if (launch_next_insn)
- dbg_valid_insn <= 1;
-
- if (decoder_trigger_q) begin
- cached_ascii_instr <= new_ascii_instr;
- cached_insn_imm <= decoded_imm;
- if (&next_insn_opcode[1:0])
- cached_insn_opcode <= next_insn_opcode;
- else
- cached_insn_opcode <= {16'b0, next_insn_opcode[15:0]};
- cached_insn_rs1 <= decoded_rs1;
- cached_insn_rs2 <= decoded_rs2;
- cached_insn_rd <= decoded_rd;
- end
-
- if (launch_next_insn) begin
- dbg_insn_addr <= next_pc;
- end
- end
-
- always @* begin
- dbg_ascii_instr = q_ascii_instr;
- dbg_insn_imm = q_insn_imm;
- dbg_insn_opcode = q_insn_opcode;
- dbg_insn_rs1 = q_insn_rs1;
- dbg_insn_rs2 = q_insn_rs2;
- dbg_insn_rd = q_insn_rd;
-
- if (dbg_next) begin
- if (decoder_pseudo_trigger_q) begin
- dbg_ascii_instr = cached_ascii_instr;
- dbg_insn_imm = cached_insn_imm;
- dbg_insn_opcode = cached_insn_opcode;
- dbg_insn_rs1 = cached_insn_rs1;
- dbg_insn_rs2 = cached_insn_rs2;
- dbg_insn_rd = cached_insn_rd;
- end else begin
- dbg_ascii_instr = new_ascii_instr;
- if (&next_insn_opcode[1:0])
- dbg_insn_opcode = next_insn_opcode;
- else
- dbg_insn_opcode = {16'b0, next_insn_opcode[15:0]};
- dbg_insn_imm = decoded_imm;
- dbg_insn_rs1 = decoded_rs1;
- dbg_insn_rs2 = decoded_rs2;
- dbg_insn_rd = decoded_rd;
- end
- end
- end
-
-`ifdef DEBUGASM
- always @(posedge clk) begin
- if (dbg_next) begin
- $display("debugasm %x %x %s", dbg_insn_addr, dbg_insn_opcode, dbg_ascii_instr ? dbg_ascii_instr : "*");
- end
- end
-`endif
-
-`ifdef DEBUG
- always @(posedge clk) begin
- if (dbg_next) begin
- if (&dbg_insn_opcode[1:0])
- $display("DECODE: 0x%08x 0x%08x %-0s", dbg_insn_addr, dbg_insn_opcode, dbg_ascii_instr ? dbg_ascii_instr : "UNKNOWN");
- else
- $display("DECODE: 0x%08x 0x%04x %-0s", dbg_insn_addr, dbg_insn_opcode[15:0], dbg_ascii_instr ? dbg_ascii_instr : "UNKNOWN");
- end
- end
-`endif
-
- always @(posedge clk) begin
- is_lui_auipc_jal <= |{instr_lui, instr_auipc, instr_jal};
- is_lui_auipc_jal_jalr_addi_add_sub <= |{instr_lui, instr_auipc, instr_jal, instr_jalr, instr_addi, instr_add, instr_sub};
- is_slti_blt_slt <= |{instr_slti, instr_blt, instr_slt};
- is_sltiu_bltu_sltu <= |{instr_sltiu, instr_bltu, instr_sltu};
- is_lbu_lhu_lw <= |{instr_lbu, instr_lhu, instr_lw};
- is_compare <= |{is_beq_bne_blt_bge_bltu_bgeu, instr_slti, instr_slt, instr_sltiu, instr_sltu};
-
- if (mem_do_rinst && mem_done) begin
- instr_lui <= mem_rdata_latched[6:0] == 7'b0110111;
- instr_auipc <= mem_rdata_latched[6:0] == 7'b0010111;
- instr_jal <= mem_rdata_latched[6:0] == 7'b1101111;
- instr_jalr <= mem_rdata_latched[6:0] == 7'b1100111 && mem_rdata_latched[14:12] == 3'b000;
- instr_retirq <= mem_rdata_latched[6:0] == 7'b0001011 && mem_rdata_latched[31:25] == 7'b0000010 && ENABLE_IRQ;
- instr_waitirq <= mem_rdata_latched[6:0] == 7'b0001011 && mem_rdata_latched[31:25] == 7'b0000100 && ENABLE_IRQ;
-
- is_beq_bne_blt_bge_bltu_bgeu <= mem_rdata_latched[6:0] == 7'b1100011;
- is_lb_lh_lw_lbu_lhu <= mem_rdata_latched[6:0] == 7'b0000011;
- is_sb_sh_sw <= mem_rdata_latched[6:0] == 7'b0100011;
- is_alu_reg_imm <= mem_rdata_latched[6:0] == 7'b0010011;
- is_alu_reg_reg <= mem_rdata_latched[6:0] == 7'b0110011;
-
- { decoded_imm_j[31:20], decoded_imm_j[10:1], decoded_imm_j[11], decoded_imm_j[19:12], decoded_imm_j[0] } <= $signed({mem_rdata_latched[31:12], 1'b0});
-
- decoded_rd <= mem_rdata_latched[11:7];
- decoded_rs1 <= mem_rdata_latched[19:15];
- decoded_rs2 <= mem_rdata_latched[24:20];
-
- if (mem_rdata_latched[6:0] == 7'b0001011 && mem_rdata_latched[31:25] == 7'b0000000 && ENABLE_IRQ && ENABLE_IRQ_QREGS)
- decoded_rs1[regindex_bits-1] <= 1; // instr_getq
-
- if (mem_rdata_latched[6:0] == 7'b0001011 && mem_rdata_latched[31:25] == 7'b0000010 && ENABLE_IRQ)
- decoded_rs1 <= ENABLE_IRQ_QREGS ? irqregs_offset : 3; // instr_retirq
-
- compressed_instr <= 0;
- if (COMPRESSED_ISA && mem_rdata_latched[1:0] != 2'b11) begin
- compressed_instr <= 1;
- decoded_rd <= 0;
- decoded_rs1 <= 0;
- decoded_rs2 <= 0;
-
- { decoded_imm_j[31:11], decoded_imm_j[4], decoded_imm_j[9:8], decoded_imm_j[10], decoded_imm_j[6],
- decoded_imm_j[7], decoded_imm_j[3:1], decoded_imm_j[5], decoded_imm_j[0] } <= $signed({mem_rdata_latched[12:2], 1'b0});
-
- case (mem_rdata_latched[1:0])
- 2'b00: begin // Quadrant 0
- case (mem_rdata_latched[15:13])
- 3'b000: begin // C.ADDI4SPN
- is_alu_reg_imm <= |mem_rdata_latched[12:5];
- decoded_rs1 <= 2;
- decoded_rd <= 8 + mem_rdata_latched[4:2];
- end
- 3'b010: begin // C.LW
- is_lb_lh_lw_lbu_lhu <= 1;
- decoded_rs1 <= 8 + mem_rdata_latched[9:7];
- decoded_rd <= 8 + mem_rdata_latched[4:2];
- end
- 3'b110: begin // C.SW
- is_sb_sh_sw <= 1;
- decoded_rs1 <= 8 + mem_rdata_latched[9:7];
- decoded_rs2 <= 8 + mem_rdata_latched[4:2];
- end
- endcase
- end
- 2'b01: begin // Quadrant 1
- case (mem_rdata_latched[15:13])
- 3'b000: begin // C.NOP / C.ADDI
- is_alu_reg_imm <= 1;
- decoded_rd <= mem_rdata_latched[11:7];
- decoded_rs1 <= mem_rdata_latched[11:7];
- end
- 3'b001: begin // C.JAL
- instr_jal <= 1;
- decoded_rd <= 1;
- end
- 3'b 010: begin // C.LI
- is_alu_reg_imm <= 1;
- decoded_rd <= mem_rdata_latched[11:7];
- decoded_rs1 <= 0;
- end
- 3'b 011: begin
- if (mem_rdata_latched[12] || mem_rdata_latched[6:2]) begin
- if (mem_rdata_latched[11:7] == 2) begin // C.ADDI16SP
- is_alu_reg_imm <= 1;
- decoded_rd <= mem_rdata_latched[11:7];
- decoded_rs1 <= mem_rdata_latched[11:7];
- end else begin // C.LUI
- instr_lui <= 1;
- decoded_rd <= mem_rdata_latched[11:7];
- decoded_rs1 <= 0;
- end
- end
- end
- 3'b100: begin
- if (!mem_rdata_latched[11] && !mem_rdata_latched[12]) begin // C.SRLI, C.SRAI
- is_alu_reg_imm <= 1;
- decoded_rd <= 8 + mem_rdata_latched[9:7];
- decoded_rs1 <= 8 + mem_rdata_latched[9:7];
- decoded_rs2 <= {mem_rdata_latched[12], mem_rdata_latched[6:2]};
- end
- if (mem_rdata_latched[11:10] == 2'b10) begin // C.ANDI
- is_alu_reg_imm <= 1;
- decoded_rd <= 8 + mem_rdata_latched[9:7];
- decoded_rs1 <= 8 + mem_rdata_latched[9:7];
- end
- if (mem_rdata_latched[12:10] == 3'b011) begin // C.SUB, C.XOR, C.OR, C.AND
- is_alu_reg_reg <= 1;
- decoded_rd <= 8 + mem_rdata_latched[9:7];
- decoded_rs1 <= 8 + mem_rdata_latched[9:7];
- decoded_rs2 <= 8 + mem_rdata_latched[4:2];
- end
- end
- 3'b101: begin // C.J
- instr_jal <= 1;
- end
- 3'b110: begin // C.BEQZ
- is_beq_bne_blt_bge_bltu_bgeu <= 1;
- decoded_rs1 <= 8 + mem_rdata_latched[9:7];
- decoded_rs2 <= 0;
- end
- 3'b111: begin // C.BNEZ
- is_beq_bne_blt_bge_bltu_bgeu <= 1;
- decoded_rs1 <= 8 + mem_rdata_latched[9:7];
- decoded_rs2 <= 0;
- end
- endcase
- end
- 2'b10: begin // Quadrant 2
- case (mem_rdata_latched[15:13])
- 3'b000: begin // C.SLLI
- if (!mem_rdata_latched[12]) begin
- is_alu_reg_imm <= 1;
- decoded_rd <= mem_rdata_latched[11:7];
- decoded_rs1 <= mem_rdata_latched[11:7];
- decoded_rs2 <= {mem_rdata_latched[12], mem_rdata_latched[6:2]};
- end
- end
- 3'b010: begin // C.LWSP
- if (mem_rdata_latched[11:7]) begin
- is_lb_lh_lw_lbu_lhu <= 1;
- decoded_rd <= mem_rdata_latched[11:7];
- decoded_rs1 <= 2;
- end
- end
- 3'b100: begin
- if (mem_rdata_latched[12] == 0 && mem_rdata_latched[11:7] != 0 && mem_rdata_latched[6:2] == 0) begin // C.JR
- instr_jalr <= 1;
- decoded_rd <= 0;
- decoded_rs1 <= mem_rdata_latched[11:7];
- end
- if (mem_rdata_latched[12] == 0 && mem_rdata_latched[6:2] != 0) begin // C.MV
- is_alu_reg_reg <= 1;
- decoded_rd <= mem_rdata_latched[11:7];
- decoded_rs1 <= 0;
- decoded_rs2 <= mem_rdata_latched[6:2];
- end
- if (mem_rdata_latched[12] != 0 && mem_rdata_latched[11:7] != 0 && mem_rdata_latched[6:2] == 0) begin // C.JALR
- instr_jalr <= 1;
- decoded_rd <= 1;
- decoded_rs1 <= mem_rdata_latched[11:7];
- end
- if (mem_rdata_latched[12] != 0 && mem_rdata_latched[6:2] != 0) begin // C.ADD
- is_alu_reg_reg <= 1;
- decoded_rd <= mem_rdata_latched[11:7];
- decoded_rs1 <= mem_rdata_latched[11:7];
- decoded_rs2 <= mem_rdata_latched[6:2];
- end
- end
- 3'b110: begin // C.SWSP
- is_sb_sh_sw <= 1;
- decoded_rs1 <= 2;
- decoded_rs2 <= mem_rdata_latched[6:2];
- end
- endcase
- end
- endcase
- end
- end
-
- if (decoder_trigger && !decoder_pseudo_trigger) begin
- pcpi_insn <= WITH_PCPI ? mem_rdata_q : 'bx;
-
- instr_beq <= is_beq_bne_blt_bge_bltu_bgeu && mem_rdata_q[14:12] == 3'b000;
- instr_bne <= is_beq_bne_blt_bge_bltu_bgeu && mem_rdata_q[14:12] == 3'b001;
- instr_blt <= is_beq_bne_blt_bge_bltu_bgeu && mem_rdata_q[14:12] == 3'b100;
- instr_bge <= is_beq_bne_blt_bge_bltu_bgeu && mem_rdata_q[14:12] == 3'b101;
- instr_bltu <= is_beq_bne_blt_bge_bltu_bgeu && mem_rdata_q[14:12] == 3'b110;
- instr_bgeu <= is_beq_bne_blt_bge_bltu_bgeu && mem_rdata_q[14:12] == 3'b111;
-
- instr_lb <= is_lb_lh_lw_lbu_lhu && mem_rdata_q[14:12] == 3'b000;
- instr_lh <= is_lb_lh_lw_lbu_lhu && mem_rdata_q[14:12] == 3'b001;
- instr_lw <= is_lb_lh_lw_lbu_lhu && mem_rdata_q[14:12] == 3'b010;
- instr_lbu <= is_lb_lh_lw_lbu_lhu && mem_rdata_q[14:12] == 3'b100;
- instr_lhu <= is_lb_lh_lw_lbu_lhu && mem_rdata_q[14:12] == 3'b101;
-
- instr_sb <= is_sb_sh_sw && mem_rdata_q[14:12] == 3'b000;
- instr_sh <= is_sb_sh_sw && mem_rdata_q[14:12] == 3'b001;
- instr_sw <= is_sb_sh_sw && mem_rdata_q[14:12] == 3'b010;
-
- instr_addi <= is_alu_reg_imm && mem_rdata_q[14:12] == 3'b000;
- instr_slti <= is_alu_reg_imm && mem_rdata_q[14:12] == 3'b010;
- instr_sltiu <= is_alu_reg_imm && mem_rdata_q[14:12] == 3'b011;
- instr_xori <= is_alu_reg_imm && mem_rdata_q[14:12] == 3'b100;
- instr_ori <= is_alu_reg_imm && mem_rdata_q[14:12] == 3'b110;
- instr_andi <= is_alu_reg_imm && mem_rdata_q[14:12] == 3'b111;
-
- instr_slli <= is_alu_reg_imm && mem_rdata_q[14:12] == 3'b001 && mem_rdata_q[31:25] == 7'b0000000;
- instr_srli <= is_alu_reg_imm && mem_rdata_q[14:12] == 3'b101 && mem_rdata_q[31:25] == 7'b0000000;
- instr_srai <= is_alu_reg_imm && mem_rdata_q[14:12] == 3'b101 && mem_rdata_q[31:25] == 7'b0100000;
-
- instr_add <= is_alu_reg_reg && mem_rdata_q[14:12] == 3'b000 && mem_rdata_q[31:25] == 7'b0000000;
- instr_sub <= is_alu_reg_reg && mem_rdata_q[14:12] == 3'b000 && mem_rdata_q[31:25] == 7'b0100000;
- instr_sll <= is_alu_reg_reg && mem_rdata_q[14:12] == 3'b001 && mem_rdata_q[31:25] == 7'b0000000;
- instr_slt <= is_alu_reg_reg && mem_rdata_q[14:12] == 3'b010 && mem_rdata_q[31:25] == 7'b0000000;
- instr_sltu <= is_alu_reg_reg && mem_rdata_q[14:12] == 3'b011 && mem_rdata_q[31:25] == 7'b0000000;
- instr_xor <= is_alu_reg_reg && mem_rdata_q[14:12] == 3'b100 && mem_rdata_q[31:25] == 7'b0000000;
- instr_srl <= is_alu_reg_reg && mem_rdata_q[14:12] == 3'b101 && mem_rdata_q[31:25] == 7'b0000000;
- instr_sra <= is_alu_reg_reg && mem_rdata_q[14:12] == 3'b101 && mem_rdata_q[31:25] == 7'b0100000;
- instr_or <= is_alu_reg_reg && mem_rdata_q[14:12] == 3'b110 && mem_rdata_q[31:25] == 7'b0000000;
- instr_and <= is_alu_reg_reg && mem_rdata_q[14:12] == 3'b111 && mem_rdata_q[31:25] == 7'b0000000;
-
- instr_rdcycle <= ((mem_rdata_q[6:0] == 7'b1110011 && mem_rdata_q[31:12] == 'b11000000000000000010) ||
- (mem_rdata_q[6:0] == 7'b1110011 && mem_rdata_q[31:12] == 'b11000000000100000010)) && ENABLE_COUNTERS;
- instr_rdcycleh <= ((mem_rdata_q[6:0] == 7'b1110011 && mem_rdata_q[31:12] == 'b11001000000000000010) ||
- (mem_rdata_q[6:0] == 7'b1110011 && mem_rdata_q[31:12] == 'b11001000000100000010)) && ENABLE_COUNTERS && ENABLE_COUNTERS64;
- instr_rdinstr <= (mem_rdata_q[6:0] == 7'b1110011 && mem_rdata_q[31:12] == 'b11000000001000000010) && ENABLE_COUNTERS;
- instr_rdinstrh <= (mem_rdata_q[6:0] == 7'b1110011 && mem_rdata_q[31:12] == 'b11001000001000000010) && ENABLE_COUNTERS && ENABLE_COUNTERS64;
-
- instr_ecall_ebreak <= ((mem_rdata_q[6:0] == 7'b1110011 && !mem_rdata_q[31:21] && !mem_rdata_q[19:7]) ||
- (COMPRESSED_ISA && mem_rdata_q[15:0] == 16'h9002));
-
- instr_getq <= mem_rdata_q[6:0] == 7'b0001011 && mem_rdata_q[31:25] == 7'b0000000 && ENABLE_IRQ && ENABLE_IRQ_QREGS;
- instr_setq <= mem_rdata_q[6:0] == 7'b0001011 && mem_rdata_q[31:25] == 7'b0000001 && ENABLE_IRQ && ENABLE_IRQ_QREGS;
- instr_maskirq <= mem_rdata_q[6:0] == 7'b0001011 && mem_rdata_q[31:25] == 7'b0000011 && ENABLE_IRQ;
- instr_timer <= mem_rdata_q[6:0] == 7'b0001011 && mem_rdata_q[31:25] == 7'b0000101 && ENABLE_IRQ && ENABLE_IRQ_TIMER;
-
- is_slli_srli_srai <= is_alu_reg_imm && |{
- mem_rdata_q[14:12] == 3'b001 && mem_rdata_q[31:25] == 7'b0000000,
- mem_rdata_q[14:12] == 3'b101 && mem_rdata_q[31:25] == 7'b0000000,
- mem_rdata_q[14:12] == 3'b101 && mem_rdata_q[31:25] == 7'b0100000
- };
-
- is_jalr_addi_slti_sltiu_xori_ori_andi <= instr_jalr || is_alu_reg_imm && |{
- mem_rdata_q[14:12] == 3'b000,
- mem_rdata_q[14:12] == 3'b010,
- mem_rdata_q[14:12] == 3'b011,
- mem_rdata_q[14:12] == 3'b100,
- mem_rdata_q[14:12] == 3'b110,
- mem_rdata_q[14:12] == 3'b111
- };
-
- is_sll_srl_sra <= is_alu_reg_reg && |{
- mem_rdata_q[14:12] == 3'b001 && mem_rdata_q[31:25] == 7'b0000000,
- mem_rdata_q[14:12] == 3'b101 && mem_rdata_q[31:25] == 7'b0000000,
- mem_rdata_q[14:12] == 3'b101 && mem_rdata_q[31:25] == 7'b0100000
- };
-
- is_lui_auipc_jal_jalr_addi_add_sub <= 0;
- is_compare <= 0;
-
- (* parallel_case *)
- case (1'b1)
- instr_jal:
- decoded_imm <= decoded_imm_j;
- |{instr_lui, instr_auipc}:
- decoded_imm <= mem_rdata_q[31:12] << 12;
- |{instr_jalr, is_lb_lh_lw_lbu_lhu, is_alu_reg_imm}:
- decoded_imm <= $signed(mem_rdata_q[31:20]);
- is_beq_bne_blt_bge_bltu_bgeu:
- decoded_imm <= $signed({mem_rdata_q[31], mem_rdata_q[7], mem_rdata_q[30:25], mem_rdata_q[11:8], 1'b0});
- is_sb_sh_sw:
- decoded_imm <= $signed({mem_rdata_q[31:25], mem_rdata_q[11:7]});
- default:
- decoded_imm <= 1'bx;
- endcase
- end
-
- if (!resetn) begin
- is_beq_bne_blt_bge_bltu_bgeu <= 0;
- is_compare <= 0;
-
- instr_beq <= 0;
- instr_bne <= 0;
- instr_blt <= 0;
- instr_bge <= 0;
- instr_bltu <= 0;
- instr_bgeu <= 0;
-
- instr_addi <= 0;
- instr_slti <= 0;
- instr_sltiu <= 0;
- instr_xori <= 0;
- instr_ori <= 0;
- instr_andi <= 0;
-
- instr_add <= 0;
- instr_sub <= 0;
- instr_sll <= 0;
- instr_slt <= 0;
- instr_sltu <= 0;
- instr_xor <= 0;
- instr_srl <= 0;
- instr_sra <= 0;
- instr_or <= 0;
- instr_and <= 0;
- end
- end
-
-
- // Main State Machine
-
- localparam cpu_state_trap = 8'b10000000;
- localparam cpu_state_fetch = 8'b01000000;
- localparam cpu_state_ld_rs1 = 8'b00100000;
- localparam cpu_state_ld_rs2 = 8'b00010000;
- localparam cpu_state_exec = 8'b00001000;
- localparam cpu_state_shift = 8'b00000100;
- localparam cpu_state_stmem = 8'b00000010;
- localparam cpu_state_ldmem = 8'b00000001;
-
- reg [7:0] cpu_state;
- reg [1:0] irq_state;
-
- `FORMAL_KEEP reg [127:0] dbg_ascii_state;
-
- always @* begin
- dbg_ascii_state = "";
- if (cpu_state == cpu_state_trap) dbg_ascii_state = "trap";
- if (cpu_state == cpu_state_fetch) dbg_ascii_state = "fetch";
- if (cpu_state == cpu_state_ld_rs1) dbg_ascii_state = "ld_rs1";
- if (cpu_state == cpu_state_ld_rs2) dbg_ascii_state = "ld_rs2";
- if (cpu_state == cpu_state_exec) dbg_ascii_state = "exec";
- if (cpu_state == cpu_state_shift) dbg_ascii_state = "shift";
- if (cpu_state == cpu_state_stmem) dbg_ascii_state = "stmem";
- if (cpu_state == cpu_state_ldmem) dbg_ascii_state = "ldmem";
- end
-
- reg set_mem_do_rinst;
- reg set_mem_do_rdata;
- reg set_mem_do_wdata;
-
- reg latched_store;
- reg latched_stalu;
- reg latched_branch;
- reg latched_compr;
- reg latched_trace;
- reg latched_is_lu;
- reg latched_is_lh;
- reg latched_is_lb;
- reg [regindex_bits-1:0] latched_rd;
-
- reg [31:0] current_pc;
- assign next_pc = latched_store && latched_branch ? reg_out & ~1 : reg_next_pc;
-
- reg [3:0] pcpi_timeout_counter;
- reg pcpi_timeout;
-
- reg [31:0] next_irq_pending;
- reg do_waitirq;
-
- reg [31:0] alu_out, alu_out_q;
- reg alu_out_0, alu_out_0_q;
- reg alu_wait, alu_wait_2;
-
- reg [31:0] alu_add_sub;
- reg [31:0] alu_shl, alu_shr;
- reg alu_eq, alu_ltu, alu_lts;
-
- generate if (TWO_CYCLE_ALU) begin
- always @(posedge clk) begin
- alu_add_sub <= instr_sub ? reg_op1 - reg_op2 : reg_op1 + reg_op2;
- alu_eq <= reg_op1 == reg_op2;
- alu_lts <= $signed(reg_op1) < $signed(reg_op2);
- alu_ltu <= reg_op1 < reg_op2;
- alu_shl <= reg_op1 << reg_op2[4:0];
- alu_shr <= $signed({instr_sra || instr_srai ? reg_op1[31] : 1'b0, reg_op1}) >>> reg_op2[4:0];
- end
- end else begin
- always @* begin
- alu_add_sub = instr_sub ? reg_op1 - reg_op2 : reg_op1 + reg_op2;
- alu_eq = reg_op1 == reg_op2;
- alu_lts = $signed(reg_op1) < $signed(reg_op2);
- alu_ltu = reg_op1 < reg_op2;
- alu_shl = reg_op1 << reg_op2[4:0];
- alu_shr = $signed({instr_sra || instr_srai ? reg_op1[31] : 1'b0, reg_op1}) >>> reg_op2[4:0];
- end
- end endgenerate
-
- always @* begin
- alu_out_0 = 'bx;
- (* parallel_case, full_case *)
- case (1'b1)
- instr_beq:
- alu_out_0 = alu_eq;
- instr_bne:
- alu_out_0 = !alu_eq;
- instr_bge:
- alu_out_0 = !alu_lts;
- instr_bgeu:
- alu_out_0 = !alu_ltu;
- is_slti_blt_slt && (!TWO_CYCLE_COMPARE || !{instr_beq,instr_bne,instr_bge,instr_bgeu}):
- alu_out_0 = alu_lts;
- is_sltiu_bltu_sltu && (!TWO_CYCLE_COMPARE || !{instr_beq,instr_bne,instr_bge,instr_bgeu}):
- alu_out_0 = alu_ltu;
- endcase
-
- alu_out = 'bx;
- (* parallel_case, full_case *)
- case (1'b1)
- is_lui_auipc_jal_jalr_addi_add_sub:
- alu_out = alu_add_sub;
- is_compare:
- alu_out = alu_out_0;
- instr_xori || instr_xor:
- alu_out = reg_op1 ^ reg_op2;
- instr_ori || instr_or:
- alu_out = reg_op1 | reg_op2;
- instr_andi || instr_and:
- alu_out = reg_op1 & reg_op2;
- BARREL_SHIFTER && (instr_sll || instr_slli):
- alu_out = alu_shl;
- BARREL_SHIFTER && (instr_srl || instr_srli || instr_sra || instr_srai):
- alu_out = alu_shr;
- endcase
-
-`ifdef RISCV_FORMAL_BLACKBOX_ALU
- alu_out_0 = $anyseq;
- alu_out = $anyseq;
-`endif
- end
-
- reg clear_prefetched_high_word_q;
- always @(posedge clk) clear_prefetched_high_word_q <= clear_prefetched_high_word;
-
- always @* begin
- clear_prefetched_high_word = clear_prefetched_high_word_q;
- if (!prefetched_high_word)
- clear_prefetched_high_word = 0;
- if (latched_branch || irq_state || !resetn)
- clear_prefetched_high_word = COMPRESSED_ISA;
- end
-
- reg cpuregs_write;
- reg [31:0] cpuregs_wrdata;
- reg [31:0] cpuregs_rs1;
- reg [31:0] cpuregs_rs2;
- reg [regindex_bits-1:0] decoded_rs;
-
- always @* begin
- cpuregs_write = 0;
- cpuregs_wrdata = 'bx;
-
- if (cpu_state == cpu_state_fetch) begin
- (* parallel_case *)
- case (1'b1)
- latched_branch: begin
- cpuregs_wrdata = reg_pc + (latched_compr ? 2 : 4);
- cpuregs_write = 1;
- end
- latched_store && !latched_branch: begin
- cpuregs_wrdata = latched_stalu ? alu_out_q : reg_out;
- cpuregs_write = 1;
- end
- ENABLE_IRQ && irq_state[0]: begin
- cpuregs_wrdata = reg_next_pc | latched_compr;
- cpuregs_write = 1;
- end
- ENABLE_IRQ && irq_state[1]: begin
- cpuregs_wrdata = irq_pending & ~irq_mask;
- cpuregs_write = 1;
- end
- endcase
- end
- end
-
-`ifndef PICORV32_REGS
- always @(posedge clk) begin
- if (resetn && cpuregs_write && latched_rd)
-`ifdef PICORV32_TESTBUG_001
- cpuregs[latched_rd ^ 1] <= cpuregs_wrdata;
-`elsif PICORV32_TESTBUG_002
- cpuregs[latched_rd] <= cpuregs_wrdata ^ 1;
-`else
- cpuregs[latched_rd] <= cpuregs_wrdata;
-`endif
- end
-
- always @* begin
- decoded_rs = 'bx;
- if (ENABLE_REGS_DUALPORT) begin
-`ifndef RISCV_FORMAL_BLACKBOX_REGS
- cpuregs_rs1 = decoded_rs1 ? cpuregs[decoded_rs1] : 0;
- cpuregs_rs2 = decoded_rs2 ? cpuregs[decoded_rs2] : 0;
-`else
- cpuregs_rs1 = decoded_rs1 ? $anyseq : 0;
- cpuregs_rs2 = decoded_rs2 ? $anyseq : 0;
-`endif
- end else begin
- decoded_rs = (cpu_state == cpu_state_ld_rs2) ? decoded_rs2 : decoded_rs1;
-`ifndef RISCV_FORMAL_BLACKBOX_REGS
- cpuregs_rs1 = decoded_rs ? cpuregs[decoded_rs] : 0;
-`else
- cpuregs_rs1 = decoded_rs ? $anyseq : 0;
-`endif
- cpuregs_rs2 = cpuregs_rs1;
- end
- end
-`else
- wire[31:0] cpuregs_rdata1;
- wire[31:0] cpuregs_rdata2;
-
- wire [5:0] cpuregs_waddr = latched_rd;
- wire [5:0] cpuregs_raddr1 = ENABLE_REGS_DUALPORT ? decoded_rs1 : decoded_rs;
- wire [5:0] cpuregs_raddr2 = ENABLE_REGS_DUALPORT ? decoded_rs2 : 0;
-
- `PICORV32_REGS cpuregs (
- .clk(clk),
- .wen(resetn && cpuregs_write && latched_rd),
- .waddr(cpuregs_waddr),
- .raddr1(cpuregs_raddr1),
- .raddr2(cpuregs_raddr2),
- .wdata(cpuregs_wrdata),
- .rdata1(cpuregs_rdata1),
- .rdata2(cpuregs_rdata2)
- );
-
- always @* begin
- decoded_rs = 'bx;
- if (ENABLE_REGS_DUALPORT) begin
- cpuregs_rs1 = decoded_rs1 ? cpuregs_rdata1 : 0;
- cpuregs_rs2 = decoded_rs2 ? cpuregs_rdata2 : 0;
- end else begin
- decoded_rs = (cpu_state == cpu_state_ld_rs2) ? decoded_rs2 : decoded_rs1;
- cpuregs_rs1 = decoded_rs ? cpuregs_rdata1 : 0;
- cpuregs_rs2 = cpuregs_rs1;
- end
- end
-`endif
-
- assign launch_next_insn = cpu_state == cpu_state_fetch && decoder_trigger && (!ENABLE_IRQ || irq_delay || irq_active || !(irq_pending & ~irq_mask));
-
- always @(posedge clk) begin
- trap <= 0;
- reg_sh <= 'bx;
- reg_out <= 'bx;
- set_mem_do_rinst = 0;
- set_mem_do_rdata = 0;
- set_mem_do_wdata = 0;
-
- alu_out_0_q <= alu_out_0;
- alu_out_q <= alu_out;
-
- alu_wait <= 0;
- alu_wait_2 <= 0;
-
- if (launch_next_insn) begin
- dbg_rs1val <= 'bx;
- dbg_rs2val <= 'bx;
- dbg_rs1val_valid <= 0;
- dbg_rs2val_valid <= 0;
- end
-
- if (WITH_PCPI && CATCH_ILLINSN) begin
- if (resetn && pcpi_valid && !pcpi_int_wait) begin
- if (pcpi_timeout_counter)
- pcpi_timeout_counter <= pcpi_timeout_counter - 1;
- end else
- pcpi_timeout_counter <= ~0;
- pcpi_timeout <= !pcpi_timeout_counter;
- end
-
- if (ENABLE_COUNTERS) begin
- count_cycle <= resetn ? count_cycle + 1 : 0;
- if (!ENABLE_COUNTERS64) count_cycle[63:32] <= 0;
- end else begin
- count_cycle <= 'bx;
- count_instr <= 'bx;
- end
-
- next_irq_pending = ENABLE_IRQ ? irq_pending & LATCHED_IRQ : 'bx;
-
- if (ENABLE_IRQ && ENABLE_IRQ_TIMER && timer) begin
- timer <= timer - 1;
- end
-
- decoder_trigger <= mem_do_rinst && mem_done;
- decoder_trigger_q <= decoder_trigger;
- decoder_pseudo_trigger <= 0;
- decoder_pseudo_trigger_q <= decoder_pseudo_trigger;
- do_waitirq <= 0;
-
- trace_valid <= 0;
-
- if (!ENABLE_TRACE)
- trace_data <= 'bx;
-
- if (!resetn) begin
- reg_pc <= PROGADDR_RESET;
- reg_next_pc <= PROGADDR_RESET;
- if (ENABLE_COUNTERS)
- count_instr <= 0;
- latched_store <= 0;
- latched_stalu <= 0;
- latched_branch <= 0;
- latched_trace <= 0;
- latched_is_lu <= 0;
- latched_is_lh <= 0;
- latched_is_lb <= 0;
- pcpi_valid <= 0;
- pcpi_timeout <= 0;
- irq_active <= 0;
- irq_delay <= 0;
- irq_mask <= ~0;
- next_irq_pending = 0;
- irq_state <= 0;
- eoi <= 0;
- timer <= 0;
- if (~STACKADDR) begin
- latched_store <= 1;
- latched_rd <= 2;
- reg_out <= STACKADDR;
- end
- cpu_state <= cpu_state_fetch;
- end else
- (* parallel_case, full_case *)
- case (cpu_state)
- cpu_state_trap: begin
- trap <= 1;
- end
-
- cpu_state_fetch: begin
- mem_do_rinst <= !decoder_trigger && !do_waitirq;
- mem_wordsize <= 0;
-
- current_pc = reg_next_pc;
-
- (* parallel_case *)
- case (1'b1)
- latched_branch: begin
- current_pc = latched_store ? (latched_stalu ? alu_out_q : reg_out) & ~1 : reg_next_pc;
- `debug($display("ST_RD: %2d 0x%08x, BRANCH 0x%08x", latched_rd, reg_pc + (latched_compr ? 2 : 4), current_pc);)
- end
- latched_store && !latched_branch: begin
- `debug($display("ST_RD: %2d 0x%08x", latched_rd, latched_stalu ? alu_out_q : reg_out);)
- end
- ENABLE_IRQ && irq_state[0]: begin
- current_pc = PROGADDR_IRQ;
- irq_active <= 1;
- mem_do_rinst <= 1;
- end
- ENABLE_IRQ && irq_state[1]: begin
- eoi <= irq_pending & ~irq_mask;
- next_irq_pending = next_irq_pending & irq_mask;
- end
- endcase
-
- if (ENABLE_TRACE && latched_trace) begin
- latched_trace <= 0;
- trace_valid <= 1;
- if (latched_branch)
- trace_data <= (irq_active ? TRACE_IRQ : 0) | TRACE_BRANCH | (current_pc & 32'hfffffffe);
- else
- trace_data <= (irq_active ? TRACE_IRQ : 0) | (latched_stalu ? alu_out_q : reg_out);
- end
-
- reg_pc <= current_pc;
- reg_next_pc <= current_pc;
-
- latched_store <= 0;
- latched_stalu <= 0;
- latched_branch <= 0;
- latched_is_lu <= 0;
- latched_is_lh <= 0;
- latched_is_lb <= 0;
- latched_rd <= decoded_rd;
- latched_compr <= compressed_instr;
-
- if (ENABLE_IRQ && ((decoder_trigger && !irq_active && !irq_delay && |(irq_pending & ~irq_mask)) || irq_state)) begin
- irq_state <=
- irq_state == 2'b00 ? 2'b01 :
- irq_state == 2'b01 ? 2'b10 : 2'b00;
- latched_compr <= latched_compr;
- if (ENABLE_IRQ_QREGS)
- latched_rd <= irqregs_offset | irq_state[0];
- else
- latched_rd <= irq_state[0] ? 4 : 3;
- end else
- if (ENABLE_IRQ && (decoder_trigger || do_waitirq) && instr_waitirq) begin
- if (irq_pending) begin
- latched_store <= 1;
- reg_out <= irq_pending;
- reg_next_pc <= current_pc + (compressed_instr ? 2 : 4);
- mem_do_rinst <= 1;
- end else
- do_waitirq <= 1;
- end else
- if (decoder_trigger) begin
- `debug($display("-- %-0t", $time);)
- irq_delay <= irq_active;
- reg_next_pc <= current_pc + (compressed_instr ? 2 : 4);
- if (ENABLE_TRACE)
- latched_trace <= 1;
- if (ENABLE_COUNTERS) begin
- count_instr <= count_instr + 1;
- if (!ENABLE_COUNTERS64) count_instr[63:32] <= 0;
- end
- if (instr_jal) begin
- mem_do_rinst <= 1;
- reg_next_pc <= current_pc + decoded_imm_j;
- latched_branch <= 1;
- end else begin
- mem_do_rinst <= 0;
- mem_do_prefetch <= !instr_jalr && !instr_retirq;
- cpu_state <= cpu_state_ld_rs1;
- end
- end
- end
-
- cpu_state_ld_rs1: begin
- reg_op1 <= 'bx;
- reg_op2 <= 'bx;
-
- (* parallel_case *)
- case (1'b1)
- (CATCH_ILLINSN || WITH_PCPI) && instr_trap: begin
- if (WITH_PCPI) begin
- `debug($display("LD_RS1: %2d 0x%08x", decoded_rs1, cpuregs_rs1);)
- reg_op1 <= cpuregs_rs1;
- dbg_rs1val <= cpuregs_rs1;
- dbg_rs1val_valid <= 1;
- if (ENABLE_REGS_DUALPORT) begin
- pcpi_valid <= 1;
- `debug($display("LD_RS2: %2d 0x%08x", decoded_rs2, cpuregs_rs2);)
- reg_sh <= cpuregs_rs2;
- reg_op2 <= cpuregs_rs2;
- dbg_rs2val <= cpuregs_rs2;
- dbg_rs2val_valid <= 1;
- if (pcpi_int_ready) begin
- mem_do_rinst <= 1;
- pcpi_valid <= 0;
- reg_out <= pcpi_int_rd;
- latched_store <= pcpi_int_wr;
- cpu_state <= cpu_state_fetch;
- end else
- if (CATCH_ILLINSN && (pcpi_timeout || instr_ecall_ebreak)) begin
- pcpi_valid <= 0;
- `debug($display("EBREAK OR UNSUPPORTED INSN AT 0x%08x", reg_pc);)
- if (ENABLE_IRQ && !irq_mask[irq_ebreak] && !irq_active) begin
- next_irq_pending[irq_ebreak] = 1;
- cpu_state <= cpu_state_fetch;
- end else
- cpu_state <= cpu_state_trap;
- end
- end else begin
- cpu_state <= cpu_state_ld_rs2;
- end
- end else begin
- `debug($display("EBREAK OR UNSUPPORTED INSN AT 0x%08x", reg_pc);)
- if (ENABLE_IRQ && !irq_mask[irq_ebreak] && !irq_active) begin
- next_irq_pending[irq_ebreak] = 1;
- cpu_state <= cpu_state_fetch;
- end else
- cpu_state <= cpu_state_trap;
- end
- end
- ENABLE_COUNTERS && is_rdcycle_rdcycleh_rdinstr_rdinstrh: begin
- (* parallel_case, full_case *)
- case (1'b1)
- instr_rdcycle:
- reg_out <= count_cycle[31:0];
- instr_rdcycleh && ENABLE_COUNTERS64:
- reg_out <= count_cycle[63:32];
- instr_rdinstr:
- reg_out <= count_instr[31:0];
- instr_rdinstrh && ENABLE_COUNTERS64:
- reg_out <= count_instr[63:32];
- endcase
- latched_store <= 1;
- cpu_state <= cpu_state_fetch;
- end
- is_lui_auipc_jal: begin
- reg_op1 <= instr_lui ? 0 : reg_pc;
- reg_op2 <= decoded_imm;
- if (TWO_CYCLE_ALU)
- alu_wait <= 1;
- else
- mem_do_rinst <= mem_do_prefetch;
- cpu_state <= cpu_state_exec;
- end
- ENABLE_IRQ && ENABLE_IRQ_QREGS && instr_getq: begin
- `debug($display("LD_RS1: %2d 0x%08x", decoded_rs1, cpuregs_rs1);)
- reg_out <= cpuregs_rs1;
- dbg_rs1val <= cpuregs_rs1;
- dbg_rs1val_valid <= 1;
- latched_store <= 1;
- cpu_state <= cpu_state_fetch;
- end
- ENABLE_IRQ && ENABLE_IRQ_QREGS && instr_setq: begin
- `debug($display("LD_RS1: %2d 0x%08x", decoded_rs1, cpuregs_rs1);)
- reg_out <= cpuregs_rs1;
- dbg_rs1val <= cpuregs_rs1;
- dbg_rs1val_valid <= 1;
- latched_rd <= latched_rd | irqregs_offset;
- latched_store <= 1;
- cpu_state <= cpu_state_fetch;
- end
- ENABLE_IRQ && instr_retirq: begin
- eoi <= 0;
- irq_active <= 0;
- latched_branch <= 1;
- latched_store <= 1;
- `debug($display("LD_RS1: %2d 0x%08x", decoded_rs1, cpuregs_rs1);)
- reg_out <= CATCH_MISALIGN ? (cpuregs_rs1 & 32'h fffffffe) : cpuregs_rs1;
- dbg_rs1val <= cpuregs_rs1;
- dbg_rs1val_valid <= 1;
- cpu_state <= cpu_state_fetch;
- end
- ENABLE_IRQ && instr_maskirq: begin
- latched_store <= 1;
- reg_out <= irq_mask;
- `debug($display("LD_RS1: %2d 0x%08x", decoded_rs1, cpuregs_rs1);)
- irq_mask <= cpuregs_rs1 | MASKED_IRQ;
- dbg_rs1val <= cpuregs_rs1;
- dbg_rs1val_valid <= 1;
- cpu_state <= cpu_state_fetch;
- end
- ENABLE_IRQ && ENABLE_IRQ_TIMER && instr_timer: begin
- latched_store <= 1;
- reg_out <= timer;
- `debug($display("LD_RS1: %2d 0x%08x", decoded_rs1, cpuregs_rs1);)
- timer <= cpuregs_rs1;
- dbg_rs1val <= cpuregs_rs1;
- dbg_rs1val_valid <= 1;
- cpu_state <= cpu_state_fetch;
- end
- is_lb_lh_lw_lbu_lhu && !instr_trap: begin
- `debug($display("LD_RS1: %2d 0x%08x", decoded_rs1, cpuregs_rs1);)
- reg_op1 <= cpuregs_rs1;
- dbg_rs1val <= cpuregs_rs1;
- dbg_rs1val_valid <= 1;
- cpu_state <= cpu_state_ldmem;
- mem_do_rinst <= 1;
- end
- is_slli_srli_srai && !BARREL_SHIFTER: begin
- `debug($display("LD_RS1: %2d 0x%08x", decoded_rs1, cpuregs_rs1);)
- reg_op1 <= cpuregs_rs1;
- dbg_rs1val <= cpuregs_rs1;
- dbg_rs1val_valid <= 1;
- reg_sh <= decoded_rs2;
- cpu_state <= cpu_state_shift;
- end
- is_jalr_addi_slti_sltiu_xori_ori_andi, is_slli_srli_srai && BARREL_SHIFTER: begin
- `debug($display("LD_RS1: %2d 0x%08x", decoded_rs1, cpuregs_rs1);)
- reg_op1 <= cpuregs_rs1;
- dbg_rs1val <= cpuregs_rs1;
- dbg_rs1val_valid <= 1;
- reg_op2 <= is_slli_srli_srai && BARREL_SHIFTER ? decoded_rs2 : decoded_imm;
- if (TWO_CYCLE_ALU)
- alu_wait <= 1;
- else
- mem_do_rinst <= mem_do_prefetch;
- cpu_state <= cpu_state_exec;
- end
- default: begin
- `debug($display("LD_RS1: %2d 0x%08x", decoded_rs1, cpuregs_rs1);)
- reg_op1 <= cpuregs_rs1;
- dbg_rs1val <= cpuregs_rs1;
- dbg_rs1val_valid <= 1;
- if (ENABLE_REGS_DUALPORT) begin
- `debug($display("LD_RS2: %2d 0x%08x", decoded_rs2, cpuregs_rs2);)
- reg_sh <= cpuregs_rs2;
- reg_op2 <= cpuregs_rs2;
- dbg_rs2val <= cpuregs_rs2;
- dbg_rs2val_valid <= 1;
- (* parallel_case *)
- case (1'b1)
- is_sb_sh_sw: begin
- cpu_state <= cpu_state_stmem;
- mem_do_rinst <= 1;
- end
- is_sll_srl_sra && !BARREL_SHIFTER: begin
- cpu_state <= cpu_state_shift;
- end
- default: begin
- if (TWO_CYCLE_ALU || (TWO_CYCLE_COMPARE && is_beq_bne_blt_bge_bltu_bgeu)) begin
- alu_wait_2 <= TWO_CYCLE_ALU && (TWO_CYCLE_COMPARE && is_beq_bne_blt_bge_bltu_bgeu);
- alu_wait <= 1;
- end else
- mem_do_rinst <= mem_do_prefetch;
- cpu_state <= cpu_state_exec;
- end
- endcase
- end else
- cpu_state <= cpu_state_ld_rs2;
- end
- endcase
- end
-
- cpu_state_ld_rs2: begin
- `debug($display("LD_RS2: %2d 0x%08x", decoded_rs2, cpuregs_rs2);)
- reg_sh <= cpuregs_rs2;
- reg_op2 <= cpuregs_rs2;
- dbg_rs2val <= cpuregs_rs2;
- dbg_rs2val_valid <= 1;
-
- (* parallel_case *)
- case (1'b1)
- WITH_PCPI && instr_trap: begin
- pcpi_valid <= 1;
- if (pcpi_int_ready) begin
- mem_do_rinst <= 1;
- pcpi_valid <= 0;
- reg_out <= pcpi_int_rd;
- latched_store <= pcpi_int_wr;
- cpu_state <= cpu_state_fetch;
- end else
- if (CATCH_ILLINSN && (pcpi_timeout || instr_ecall_ebreak)) begin
- pcpi_valid <= 0;
- `debug($display("EBREAK OR UNSUPPORTED INSN AT 0x%08x", reg_pc);)
- if (ENABLE_IRQ && !irq_mask[irq_ebreak] && !irq_active) begin
- next_irq_pending[irq_ebreak] = 1;
- cpu_state <= cpu_state_fetch;
- end else
- cpu_state <= cpu_state_trap;
- end
- end
- is_sb_sh_sw: begin
- cpu_state <= cpu_state_stmem;
- mem_do_rinst <= 1;
- end
- is_sll_srl_sra && !BARREL_SHIFTER: begin
- cpu_state <= cpu_state_shift;
- end
- default: begin
- if (TWO_CYCLE_ALU || (TWO_CYCLE_COMPARE && is_beq_bne_blt_bge_bltu_bgeu)) begin
- alu_wait_2 <= TWO_CYCLE_ALU && (TWO_CYCLE_COMPARE && is_beq_bne_blt_bge_bltu_bgeu);
- alu_wait <= 1;
- end else
- mem_do_rinst <= mem_do_prefetch;
- cpu_state <= cpu_state_exec;
- end
- endcase
- end
-
- cpu_state_exec: begin
- reg_out <= reg_pc + decoded_imm;
- if ((TWO_CYCLE_ALU || TWO_CYCLE_COMPARE) && (alu_wait || alu_wait_2)) begin
- mem_do_rinst <= mem_do_prefetch && !alu_wait_2;
- alu_wait <= alu_wait_2;
- end else
- if (is_beq_bne_blt_bge_bltu_bgeu) begin
- latched_rd <= 0;
- latched_store <= TWO_CYCLE_COMPARE ? alu_out_0_q : alu_out_0;
- latched_branch <= TWO_CYCLE_COMPARE ? alu_out_0_q : alu_out_0;
- if (mem_done)
- cpu_state <= cpu_state_fetch;
- if (TWO_CYCLE_COMPARE ? alu_out_0_q : alu_out_0) begin
- decoder_trigger <= 0;
- set_mem_do_rinst = 1;
- end
- end else begin
- latched_branch <= instr_jalr;
- latched_store <= 1;
- latched_stalu <= 1;
- cpu_state <= cpu_state_fetch;
- end
- end
-
- cpu_state_shift: begin
- latched_store <= 1;
- if (reg_sh == 0) begin
- reg_out <= reg_op1;
- mem_do_rinst <= mem_do_prefetch;
- cpu_state <= cpu_state_fetch;
- end else if (TWO_STAGE_SHIFT && reg_sh >= 4) begin
- (* parallel_case, full_case *)
- case (1'b1)
- instr_slli || instr_sll: reg_op1 <= reg_op1 << 4;
- instr_srli || instr_srl: reg_op1 <= reg_op1 >> 4;
- instr_srai || instr_sra: reg_op1 <= $signed(reg_op1) >>> 4;
- endcase
- reg_sh <= reg_sh - 4;
- end else begin
- (* parallel_case, full_case *)
- case (1'b1)
- instr_slli || instr_sll: reg_op1 <= reg_op1 << 1;
- instr_srli || instr_srl: reg_op1 <= reg_op1 >> 1;
- instr_srai || instr_sra: reg_op1 <= $signed(reg_op1) >>> 1;
- endcase
- reg_sh <= reg_sh - 1;
- end
- end
-
- cpu_state_stmem: begin
- if (ENABLE_TRACE)
- reg_out <= reg_op2;
- if (!mem_do_prefetch || mem_done) begin
- if (!mem_do_wdata) begin
- (* parallel_case, full_case *)
- case (1'b1)
- instr_sb: mem_wordsize <= 2;
- instr_sh: mem_wordsize <= 1;
- instr_sw: mem_wordsize <= 0;
- endcase
- if (ENABLE_TRACE) begin
- trace_valid <= 1;
- trace_data <= (irq_active ? TRACE_IRQ : 0) | TRACE_ADDR | ((reg_op1 + decoded_imm) & 32'hffffffff);
- end
- reg_op1 <= reg_op1 + decoded_imm;
- set_mem_do_wdata = 1;
- end
- if (!mem_do_prefetch && mem_done) begin
- cpu_state <= cpu_state_fetch;
- decoder_trigger <= 1;
- decoder_pseudo_trigger <= 1;
- end
- end
- end
-
- cpu_state_ldmem: begin
- latched_store <= 1;
- if (!mem_do_prefetch || mem_done) begin
- if (!mem_do_rdata) begin
- (* parallel_case, full_case *)
- case (1'b1)
- instr_lb || instr_lbu: mem_wordsize <= 2;
- instr_lh || instr_lhu: mem_wordsize <= 1;
- instr_lw: mem_wordsize <= 0;
- endcase
- latched_is_lu <= is_lbu_lhu_lw;
- latched_is_lh <= instr_lh;
- latched_is_lb <= instr_lb;
- if (ENABLE_TRACE) begin
- trace_valid <= 1;
- trace_data <= (irq_active ? TRACE_IRQ : 0) | TRACE_ADDR | ((reg_op1 + decoded_imm) & 32'hffffffff);
- end
- reg_op1 <= reg_op1 + decoded_imm;
- set_mem_do_rdata = 1;
- end
- if (!mem_do_prefetch && mem_done) begin
- (* parallel_case, full_case *)
- case (1'b1)
- latched_is_lu: reg_out <= mem_rdata_word;
- latched_is_lh: reg_out <= $signed(mem_rdata_word[15:0]);
- latched_is_lb: reg_out <= $signed(mem_rdata_word[7:0]);
- endcase
- decoder_trigger <= 1;
- decoder_pseudo_trigger <= 1;
- cpu_state <= cpu_state_fetch;
- end
- end
- end
- endcase
-
- if (ENABLE_IRQ) begin
- next_irq_pending = next_irq_pending | irq;
- if(ENABLE_IRQ_TIMER && timer)
- if (timer - 1 == 0)
- next_irq_pending[irq_timer] = 1;
- end
-
- if (CATCH_MISALIGN && resetn && (mem_do_rdata || mem_do_wdata)) begin
- if (mem_wordsize == 0 && reg_op1[1:0] != 0) begin
- `debug($display("MISALIGNED WORD: 0x%08x", reg_op1);)
- if (ENABLE_IRQ && !irq_mask[irq_buserror] && !irq_active) begin
- next_irq_pending[irq_buserror] = 1;
- end else
- cpu_state <= cpu_state_trap;
- end
- if (mem_wordsize == 1 && reg_op1[0] != 0) begin
- `debug($display("MISALIGNED HALFWORD: 0x%08x", reg_op1);)
- if (ENABLE_IRQ && !irq_mask[irq_buserror] && !irq_active) begin
- next_irq_pending[irq_buserror] = 1;
- end else
- cpu_state <= cpu_state_trap;
- end
- end
- if (CATCH_MISALIGN && resetn && mem_do_rinst && (COMPRESSED_ISA ? reg_pc[0] : |reg_pc[1:0])) begin
- `debug($display("MISALIGNED INSTRUCTION: 0x%08x", reg_pc);)
- if (ENABLE_IRQ && !irq_mask[irq_buserror] && !irq_active) begin
- next_irq_pending[irq_buserror] = 1;
- end else
- cpu_state <= cpu_state_trap;
- end
- if (!CATCH_ILLINSN && decoder_trigger_q && !decoder_pseudo_trigger_q && instr_ecall_ebreak) begin
- cpu_state <= cpu_state_trap;
- end
-
- if (!resetn || mem_done) begin
- mem_do_prefetch <= 0;
- mem_do_rinst <= 0;
- mem_do_rdata <= 0;
- mem_do_wdata <= 0;
- end
-
- if (set_mem_do_rinst)
- mem_do_rinst <= 1;
- if (set_mem_do_rdata)
- mem_do_rdata <= 1;
- if (set_mem_do_wdata)
- mem_do_wdata <= 1;
-
- irq_pending <= next_irq_pending & ~MASKED_IRQ;
-
- if (!CATCH_MISALIGN) begin
- if (COMPRESSED_ISA) begin
- reg_pc[0] <= 0;
- reg_next_pc[0] <= 0;
- end else begin
- reg_pc[1:0] <= 0;
- reg_next_pc[1:0] <= 0;
- end
- end
- current_pc = 'bx;
- end
-
-`ifdef RISCV_FORMAL
- reg dbg_irq_call;
- reg dbg_irq_enter;
- reg [31:0] dbg_irq_ret;
- always @(posedge clk) begin
- rvfi_valid <= resetn && (launch_next_insn || trap) && dbg_valid_insn;
- rvfi_order <= resetn ? rvfi_order + rvfi_valid : 0;
-
- rvfi_insn <= dbg_insn_opcode;
- rvfi_rs1_addr <= dbg_rs1val_valid ? dbg_insn_rs1 : 0;
- rvfi_rs2_addr <= dbg_rs2val_valid ? dbg_insn_rs2 : 0;
- rvfi_pc_rdata <= dbg_insn_addr;
- rvfi_rs1_rdata <= dbg_rs1val_valid ? dbg_rs1val : 0;
- rvfi_rs2_rdata <= dbg_rs2val_valid ? dbg_rs2val : 0;
- rvfi_trap <= trap;
- rvfi_halt <= trap;
- rvfi_intr <= dbg_irq_enter;
- rvfi_mode <= 3;
- rvfi_ixl <= 1;
-
- if (!resetn) begin
- dbg_irq_call <= 0;
- dbg_irq_enter <= 0;
- end else
- if (rvfi_valid) begin
- dbg_irq_call <= 0;
- dbg_irq_enter <= dbg_irq_call;
- end else
- if (irq_state == 1) begin
- dbg_irq_call <= 1;
- dbg_irq_ret <= next_pc;
- end
-
- if (!resetn) begin
- rvfi_rd_addr <= 0;
- rvfi_rd_wdata <= 0;
- end else
- if (cpuregs_write && !irq_state) begin
-`ifdef PICORV32_TESTBUG_003
- rvfi_rd_addr <= latched_rd ^ 1;
-`else
- rvfi_rd_addr <= latched_rd;
-`endif
-`ifdef PICORV32_TESTBUG_004
- rvfi_rd_wdata <= latched_rd ? cpuregs_wrdata ^ 1 : 0;
-`else
- rvfi_rd_wdata <= latched_rd ? cpuregs_wrdata : 0;
-`endif
- end else
- if (rvfi_valid) begin
- rvfi_rd_addr <= 0;
- rvfi_rd_wdata <= 0;
- end
-
- casez (dbg_insn_opcode)
- 32'b 0000000_?????_000??_???_?????_0001011: begin // getq
- rvfi_rs1_addr <= 0;
- rvfi_rs1_rdata <= 0;
- end
- 32'b 0000001_?????_?????_???_000??_0001011: begin // setq
- rvfi_rd_addr <= 0;
- rvfi_rd_wdata <= 0;
- end
- 32'b 0000010_?????_00000_???_00000_0001011: begin // retirq
- rvfi_rs1_addr <= 0;
- rvfi_rs1_rdata <= 0;
- end
- endcase
-
- if (!dbg_irq_call) begin
- if (dbg_mem_instr) begin
- rvfi_mem_addr <= 0;
- rvfi_mem_rmask <= 0;
- rvfi_mem_wmask <= 0;
- rvfi_mem_rdata <= 0;
- rvfi_mem_wdata <= 0;
- end else
- if (dbg_mem_valid && dbg_mem_ready) begin
- rvfi_mem_addr <= dbg_mem_addr;
- rvfi_mem_rmask <= dbg_mem_wstrb ? 0 : ~0;
- rvfi_mem_wmask <= dbg_mem_wstrb;
- rvfi_mem_rdata <= dbg_mem_rdata;
- rvfi_mem_wdata <= dbg_mem_wdata;
- end
- end
- end
-
- always @* begin
-`ifdef PICORV32_TESTBUG_005
- rvfi_pc_wdata = (dbg_irq_call ? dbg_irq_ret : dbg_insn_addr) ^ 4;
-`else
- rvfi_pc_wdata = dbg_irq_call ? dbg_irq_ret : dbg_insn_addr;
-`endif
-
- rvfi_csr_mcycle_rmask = 0;
- rvfi_csr_mcycle_wmask = 0;
- rvfi_csr_mcycle_rdata = 0;
- rvfi_csr_mcycle_wdata = 0;
-
- rvfi_csr_minstret_rmask = 0;
- rvfi_csr_minstret_wmask = 0;
- rvfi_csr_minstret_rdata = 0;
- rvfi_csr_minstret_wdata = 0;
-
- if (rvfi_valid && rvfi_insn[6:0] == 7'b 1110011 && rvfi_insn[13:12] == 3'b010) begin
- if (rvfi_insn[31:20] == 12'h C00) begin
- rvfi_csr_mcycle_rmask = 64'h 0000_0000_FFFF_FFFF;
- rvfi_csr_mcycle_rdata = {32'h 0000_0000, rvfi_rd_wdata};
- end
- if (rvfi_insn[31:20] == 12'h C80) begin
- rvfi_csr_mcycle_rmask = 64'h FFFF_FFFF_0000_0000;
- rvfi_csr_mcycle_rdata = {rvfi_rd_wdata, 32'h 0000_0000};
- end
- if (rvfi_insn[31:20] == 12'h C02) begin
- rvfi_csr_minstret_rmask = 64'h 0000_0000_FFFF_FFFF;
- rvfi_csr_minstret_rdata = {32'h 0000_0000, rvfi_rd_wdata};
- end
- if (rvfi_insn[31:20] == 12'h C82) begin
- rvfi_csr_minstret_rmask = 64'h FFFF_FFFF_0000_0000;
- rvfi_csr_minstret_rdata = {rvfi_rd_wdata, 32'h 0000_0000};
- end
- end
- end
-`endif
-
- // Formal Verification
-`ifdef FORMAL
- reg [3:0] last_mem_nowait;
- always @(posedge clk)
- last_mem_nowait <= {last_mem_nowait, mem_ready || !mem_valid};
-
- // stall the memory interface for max 4 cycles
- restrict property (|last_mem_nowait || mem_ready || !mem_valid);
-
- // resetn low in first cycle, after that resetn high
- restrict property (resetn != $initstate);
-
- // this just makes it much easier to read traces. uncomment as needed.
- // assume property (mem_valid || !mem_ready);
-
- reg ok;
- always @* begin
- if (resetn) begin
- // instruction fetches are read-only
- if (mem_valid && mem_instr)
- assert (mem_wstrb == 0);
-
- // cpu_state must be valid
- ok = 0;
- if (cpu_state == cpu_state_trap) ok = 1;
- if (cpu_state == cpu_state_fetch) ok = 1;
- if (cpu_state == cpu_state_ld_rs1) ok = 1;
- if (cpu_state == cpu_state_ld_rs2) ok = !ENABLE_REGS_DUALPORT;
- if (cpu_state == cpu_state_exec) ok = 1;
- if (cpu_state == cpu_state_shift) ok = 1;
- if (cpu_state == cpu_state_stmem) ok = 1;
- if (cpu_state == cpu_state_ldmem) ok = 1;
- assert (ok);
- end
- end
-
- reg last_mem_la_read = 0;
- reg last_mem_la_write = 0;
- reg [31:0] last_mem_la_addr;
- reg [31:0] last_mem_la_wdata;
- reg [3:0] last_mem_la_wstrb = 0;
-
- always @(posedge clk) begin
- last_mem_la_read <= mem_la_read;
- last_mem_la_write <= mem_la_write;
- last_mem_la_addr <= mem_la_addr;
- last_mem_la_wdata <= mem_la_wdata;
- last_mem_la_wstrb <= mem_la_wstrb;
-
- if (last_mem_la_read) begin
- assert(mem_valid);
- assert(mem_addr == last_mem_la_addr);
- assert(mem_wstrb == 0);
- end
- if (last_mem_la_write) begin
- assert(mem_valid);
- assert(mem_addr == last_mem_la_addr);
- assert(mem_wdata == last_mem_la_wdata);
- assert(mem_wstrb == last_mem_la_wstrb);
- end
- if (mem_la_read || mem_la_write) begin
- assert(!mem_valid || mem_ready);
- end
- end
-`endif
-endmodule
-
-// This is a simple example implementation of PICORV32_REGS.
-// Use the PICORV32_REGS mechanism if you want to use custom
-// memory resources to implement the processor register file.
-// Note that your implementation must match the requirements of
-// the PicoRV32 configuration. (e.g. QREGS, etc)
-module picorv32_regs (
- input clk, wen,
- input [5:0] waddr,
- input [5:0] raddr1,
- input [5:0] raddr2,
- input [31:0] wdata,
- output [31:0] rdata1,
- output [31:0] rdata2
-);
- reg [31:0] regs [0:30];
-
- always @(posedge clk)
- if (wen) regs[~waddr[4:0]] <= wdata;
-
- assign rdata1 = regs[~raddr1[4:0]];
- assign rdata2 = regs[~raddr2[4:0]];
-endmodule
-
-
-/***************************************************************
- * picorv32_pcpi_mul
- ***************************************************************/
-
-module picorv32_pcpi_mul #(
- parameter STEPS_AT_ONCE = 1,
- parameter CARRY_CHAIN = 4
-) (
- input clk, resetn,
-
- input pcpi_valid,
- input [31:0] pcpi_insn,
- input [31:0] pcpi_rs1,
- input [31:0] pcpi_rs2,
- output reg pcpi_wr,
- output reg [31:0] pcpi_rd,
- output reg pcpi_wait,
- output reg pcpi_ready
-);
- reg instr_mul, instr_mulh, instr_mulhsu, instr_mulhu;
- wire instr_any_mul = |{instr_mul, instr_mulh, instr_mulhsu, instr_mulhu};
- wire instr_any_mulh = |{instr_mulh, instr_mulhsu, instr_mulhu};
- wire instr_rs1_signed = |{instr_mulh, instr_mulhsu};
- wire instr_rs2_signed = |{instr_mulh};
-
- reg pcpi_wait_q;
- wire mul_start = pcpi_wait && !pcpi_wait_q;
-
- always @(posedge clk) begin
- instr_mul <= 0;
- instr_mulh <= 0;
- instr_mulhsu <= 0;
- instr_mulhu <= 0;
-
- if (resetn && pcpi_valid && pcpi_insn[6:0] == 7'b0110011 && pcpi_insn[31:25] == 7'b0000001) begin
- case (pcpi_insn[14:12])
- 3'b000: instr_mul <= 1;
- 3'b001: instr_mulh <= 1;
- 3'b010: instr_mulhsu <= 1;
- 3'b011: instr_mulhu <= 1;
- endcase
- end
-
- pcpi_wait <= instr_any_mul;
- pcpi_wait_q <= pcpi_wait;
- end
-
- reg [63:0] rs1, rs2, rd, rdx;
- reg [63:0] next_rs1, next_rs2, this_rs2;
- reg [63:0] next_rd, next_rdx, next_rdt;
- reg [6:0] mul_counter;
- reg mul_waiting;
- reg mul_finish;
- integer i, j;
-
- // carry save accumulator
- always @* begin
- next_rd = rd;
- next_rdx = rdx;
- next_rs1 = rs1;
- next_rs2 = rs2;
-
- for (i = 0; i < STEPS_AT_ONCE; i=i+1) begin
- this_rs2 = next_rs1[0] ? next_rs2 : 0;
- if (CARRY_CHAIN == 0) begin
- next_rdt = next_rd ^ next_rdx ^ this_rs2;
- next_rdx = ((next_rd & next_rdx) | (next_rd & this_rs2) | (next_rdx & this_rs2)) << 1;
- next_rd = next_rdt;
- end else begin
- next_rdt = 0;
- for (j = 0; j < 64; j = j + CARRY_CHAIN)
- {next_rdt[j+CARRY_CHAIN-1], next_rd[j +: CARRY_CHAIN]} =
- next_rd[j +: CARRY_CHAIN] + next_rdx[j +: CARRY_CHAIN] + this_rs2[j +: CARRY_CHAIN];
- next_rdx = next_rdt << 1;
- end
- next_rs1 = next_rs1 >> 1;
- next_rs2 = next_rs2 << 1;
- end
- end
-
- always @(posedge clk) begin
- mul_finish <= 0;
- if (!resetn) begin
- mul_waiting <= 1;
- mul_counter <= 0;
- end else
- if (mul_waiting) begin
- if (instr_rs1_signed)
- rs1 <= $signed(pcpi_rs1);
- else
- rs1 <= $unsigned(pcpi_rs1);
-
- if (instr_rs2_signed)
- rs2 <= $signed(pcpi_rs2);
- else
- rs2 <= $unsigned(pcpi_rs2);
-
- rd <= 0;
- rdx <= 0;
- mul_counter <= (instr_any_mulh ? 63 - STEPS_AT_ONCE : 31 - STEPS_AT_ONCE);
- mul_waiting <= !mul_start;
- end else begin
- rd <= next_rd;
- rdx <= next_rdx;
- rs1 <= next_rs1;
- rs2 <= next_rs2;
-
- mul_counter <= mul_counter - STEPS_AT_ONCE;
- if (mul_counter[6]) begin
- mul_finish <= 1;
- mul_waiting <= 1;
- end
- end
- end
-
- always @(posedge clk) begin
- pcpi_wr <= 0;
- pcpi_ready <= 0;
- if (mul_finish && resetn) begin
- pcpi_wr <= 1;
- pcpi_ready <= 1;
- pcpi_rd <= instr_any_mulh ? rd >> 32 : rd;
- end
- end
-endmodule
-
-module picorv32_pcpi_fast_mul #(
- parameter EXTRA_MUL_FFS = 0,
- parameter EXTRA_INSN_FFS = 0,
- parameter MUL_CLKGATE = 0
-) (
- input clk, resetn,
-
- input pcpi_valid,
- input [31:0] pcpi_insn,
- input [31:0] pcpi_rs1,
- input [31:0] pcpi_rs2,
- output pcpi_wr,
- output [31:0] pcpi_rd,
- output pcpi_wait,
- output pcpi_ready
-);
- reg instr_mul, instr_mulh, instr_mulhsu, instr_mulhu;
- wire instr_any_mul = |{instr_mul, instr_mulh, instr_mulhsu, instr_mulhu};
- wire instr_any_mulh = |{instr_mulh, instr_mulhsu, instr_mulhu};
- wire instr_rs1_signed = |{instr_mulh, instr_mulhsu};
- wire instr_rs2_signed = |{instr_mulh};
-
- reg shift_out;
- reg [3:0] active;
- reg [32:0] rs1, rs2, rs1_q, rs2_q;
- reg [63:0] rd, rd_q;
-
- wire pcpi_insn_valid = pcpi_valid && pcpi_insn[6:0] == 7'b0110011 && pcpi_insn[31:25] == 7'b0000001;
- reg pcpi_insn_valid_q;
-
- always @* begin
- instr_mul = 0;
- instr_mulh = 0;
- instr_mulhsu = 0;
- instr_mulhu = 0;
-
- if (resetn && (EXTRA_INSN_FFS ? pcpi_insn_valid_q : pcpi_insn_valid)) begin
- case (pcpi_insn[14:12])
- 3'b000: instr_mul = 1;
- 3'b001: instr_mulh = 1;
- 3'b010: instr_mulhsu = 1;
- 3'b011: instr_mulhu = 1;
- endcase
- end
- end
-
- always @(posedge clk) begin
- pcpi_insn_valid_q <= pcpi_insn_valid;
- if (!MUL_CLKGATE || active[0]) begin
- rs1_q <= rs1;
- rs2_q <= rs2;
- end
- if (!MUL_CLKGATE || active[1]) begin
- rd <= $signed(EXTRA_MUL_FFS ? rs1_q : rs1) * $signed(EXTRA_MUL_FFS ? rs2_q : rs2);
- end
- if (!MUL_CLKGATE || active[2]) begin
- rd_q <= rd;
- end
- end
-
- always @(posedge clk) begin
- if (instr_any_mul && !(EXTRA_MUL_FFS ? active[3:0] : active[1:0])) begin
- if (instr_rs1_signed)
- rs1 <= $signed(pcpi_rs1);
- else
- rs1 <= $unsigned(pcpi_rs1);
-
- if (instr_rs2_signed)
- rs2 <= $signed(pcpi_rs2);
- else
- rs2 <= $unsigned(pcpi_rs2);
- active[0] <= 1;
- end else begin
- active[0] <= 0;
- end
-
- active[3:1] <= active;
- shift_out <= instr_any_mulh;
-
- if (!resetn)
- active <= 0;
- end
-
- assign pcpi_wr = active[EXTRA_MUL_FFS ? 3 : 1];
- assign pcpi_wait = 0;
- assign pcpi_ready = active[EXTRA_MUL_FFS ? 3 : 1];
-`ifdef RISCV_FORMAL_ALTOPS
- assign pcpi_rd =
- instr_mul ? (pcpi_rs1 + pcpi_rs2) ^ 32'h5876063e :
- instr_mulh ? (pcpi_rs1 + pcpi_rs2) ^ 32'hf6583fb7 :
- instr_mulhsu ? (pcpi_rs1 - pcpi_rs2) ^ 32'hecfbe137 :
- instr_mulhu ? (pcpi_rs1 + pcpi_rs2) ^ 32'h949ce5e8 : 1'bx;
-`else
- assign pcpi_rd = shift_out ? (EXTRA_MUL_FFS ? rd_q : rd) >> 32 : (EXTRA_MUL_FFS ? rd_q : rd);
-`endif
-endmodule
-
-
-/***************************************************************
- * picorv32_pcpi_div
- ***************************************************************/
-
-module picorv32_pcpi_div (
- input clk, resetn,
-
- input pcpi_valid,
- input [31:0] pcpi_insn,
- input [31:0] pcpi_rs1,
- input [31:0] pcpi_rs2,
- output reg pcpi_wr,
- output reg [31:0] pcpi_rd,
- output reg pcpi_wait,
- output reg pcpi_ready
-);
- reg instr_div, instr_divu, instr_rem, instr_remu;
- wire instr_any_div_rem = |{instr_div, instr_divu, instr_rem, instr_remu};
-
- reg pcpi_wait_q;
- wire start = pcpi_wait && !pcpi_wait_q;
-
- always @(posedge clk) begin
- instr_div <= 0;
- instr_divu <= 0;
- instr_rem <= 0;
- instr_remu <= 0;
-
- if (resetn && pcpi_valid && !pcpi_ready && pcpi_insn[6:0] == 7'b0110011 && pcpi_insn[31:25] == 7'b0000001) begin
- case (pcpi_insn[14:12])
- 3'b100: instr_div <= 1;
- 3'b101: instr_divu <= 1;
- 3'b110: instr_rem <= 1;
- 3'b111: instr_remu <= 1;
- endcase
- end
-
- pcpi_wait <= instr_any_div_rem && resetn;
- pcpi_wait_q <= pcpi_wait && resetn;
- end
-
- reg [31:0] dividend;
- reg [62:0] divisor;
- reg [31:0] quotient;
- reg [31:0] quotient_msk;
- reg running;
- reg outsign;
-
- always @(posedge clk) begin
- pcpi_ready <= 0;
- pcpi_wr <= 0;
- pcpi_rd <= 'bx;
-
- if (!resetn) begin
- running <= 0;
- end else
- if (start) begin
- running <= 1;
- dividend <= (instr_div || instr_rem) && pcpi_rs1[31] ? -pcpi_rs1 : pcpi_rs1;
- divisor <= ((instr_div || instr_rem) && pcpi_rs2[31] ? -pcpi_rs2 : pcpi_rs2) << 31;
- outsign <= (instr_div && (pcpi_rs1[31] != pcpi_rs2[31]) && |pcpi_rs2) || (instr_rem && pcpi_rs1[31]);
- quotient <= 0;
- quotient_msk <= 1 << 31;
- end else
- if (!quotient_msk && running) begin
- running <= 0;
- pcpi_ready <= 1;
- pcpi_wr <= 1;
-`ifdef RISCV_FORMAL_ALTOPS
- case (1)
- instr_div: pcpi_rd <= (pcpi_rs1 - pcpi_rs2) ^ 32'h7f8529ec;
- instr_divu: pcpi_rd <= (pcpi_rs1 - pcpi_rs2) ^ 32'h10e8fd70;
- instr_rem: pcpi_rd <= (pcpi_rs1 - pcpi_rs2) ^ 32'h8da68fa5;
- instr_remu: pcpi_rd <= (pcpi_rs1 - pcpi_rs2) ^ 32'h3138d0e1;
- endcase
-`else
- if (instr_div || instr_divu)
- pcpi_rd <= outsign ? -quotient : quotient;
- else
- pcpi_rd <= outsign ? -dividend : dividend;
-`endif
- end else begin
- if (divisor <= dividend) begin
- dividend <= dividend - divisor;
- quotient <= quotient | quotient_msk;
- end
- divisor <= divisor >> 1;
-`ifdef RISCV_FORMAL_ALTOPS
- quotient_msk <= quotient_msk >> 5;
-`else
- quotient_msk <= quotient_msk >> 1;
-`endif
- end
- end
-endmodule
-
-
-/***************************************************************
- * picorv32_axi
- ***************************************************************/
-
-module picorv32_axi #(
- parameter [ 0:0] ENABLE_COUNTERS = 1,
- parameter [ 0:0] ENABLE_COUNTERS64 = 1,
- parameter [ 0:0] ENABLE_REGS_16_31 = 1,
- parameter [ 0:0] ENABLE_REGS_DUALPORT = 1,
- parameter [ 0:0] TWO_STAGE_SHIFT = 1,
- parameter [ 0:0] BARREL_SHIFTER = 0,
- parameter [ 0:0] TWO_CYCLE_COMPARE = 0,
- parameter [ 0:0] TWO_CYCLE_ALU = 0,
- parameter [ 0:0] COMPRESSED_ISA = 0,
- parameter [ 0:0] CATCH_MISALIGN = 1,
- parameter [ 0:0] CATCH_ILLINSN = 1,
- parameter [ 0:0] ENABLE_PCPI = 0,
- parameter [ 0:0] ENABLE_MUL = 0,
- parameter [ 0:0] ENABLE_FAST_MUL = 0,
- parameter [ 0:0] ENABLE_DIV = 0,
- parameter [ 0:0] ENABLE_IRQ = 0,
- parameter [ 0:0] ENABLE_IRQ_QREGS = 1,
- parameter [ 0:0] ENABLE_IRQ_TIMER = 1,
- parameter [ 0:0] ENABLE_TRACE = 0,
- parameter [ 0:0] REGS_INIT_ZERO = 0,
- parameter [31:0] MASKED_IRQ = 32'h 0000_0000,
- parameter [31:0] LATCHED_IRQ = 32'h ffff_ffff,
- parameter [31:0] PROGADDR_RESET = 32'h 0000_0000,
- parameter [31:0] PROGADDR_IRQ = 32'h 0000_0010,
- parameter [31:0] STACKADDR = 32'h ffff_ffff
-) (
- input clk, resetn,
- output trap,
-
- // AXI4-lite master memory interface
-
- output mem_axi_awvalid,
- input mem_axi_awready,
- output [31:0] mem_axi_awaddr,
- output [ 2:0] mem_axi_awprot,
-
- output mem_axi_wvalid,
- input mem_axi_wready,
- output [31:0] mem_axi_wdata,
- output [ 3:0] mem_axi_wstrb,
-
- input mem_axi_bvalid,
- output mem_axi_bready,
-
- output mem_axi_arvalid,
- input mem_axi_arready,
- output [31:0] mem_axi_araddr,
- output [ 2:0] mem_axi_arprot,
-
- input mem_axi_rvalid,
- output mem_axi_rready,
- input [31:0] mem_axi_rdata,
-
- // Pico Co-Processor Interface (PCPI)
- output pcpi_valid,
- output [31:0] pcpi_insn,
- output [31:0] pcpi_rs1,
- output [31:0] pcpi_rs2,
- input pcpi_wr,
- input [31:0] pcpi_rd,
- input pcpi_wait,
- input pcpi_ready,
-
- // IRQ interface
- input [31:0] irq,
- output [31:0] eoi,
-
-`ifdef RISCV_FORMAL
- output rvfi_valid,
- output [63:0] rvfi_order,
- output [31:0] rvfi_insn,
- output rvfi_trap,
- output rvfi_halt,
- output rvfi_intr,
- output [ 4:0] rvfi_rs1_addr,
- output [ 4:0] rvfi_rs2_addr,
- output [31:0] rvfi_rs1_rdata,
- output [31:0] rvfi_rs2_rdata,
- output [ 4:0] rvfi_rd_addr,
- output [31:0] rvfi_rd_wdata,
- output [31:0] rvfi_pc_rdata,
- output [31:0] rvfi_pc_wdata,
- output [31:0] rvfi_mem_addr,
- output [ 3:0] rvfi_mem_rmask,
- output [ 3:0] rvfi_mem_wmask,
- output [31:0] rvfi_mem_rdata,
- output [31:0] rvfi_mem_wdata,
-`endif
-
- // Trace Interface
- output trace_valid,
- output [35:0] trace_data
-);
- wire mem_valid;
- wire [31:0] mem_addr;
- wire [31:0] mem_wdata;
- wire [ 3:0] mem_wstrb;
- wire mem_instr;
- wire mem_ready;
- wire [31:0] mem_rdata;
-
- picorv32_axi_adapter axi_adapter (
- .clk (clk ),
- .resetn (resetn ),
- .mem_axi_awvalid(mem_axi_awvalid),
- .mem_axi_awready(mem_axi_awready),
- .mem_axi_awaddr (mem_axi_awaddr ),
- .mem_axi_awprot (mem_axi_awprot ),
- .mem_axi_wvalid (mem_axi_wvalid ),
- .mem_axi_wready (mem_axi_wready ),
- .mem_axi_wdata (mem_axi_wdata ),
- .mem_axi_wstrb (mem_axi_wstrb ),
- .mem_axi_bvalid (mem_axi_bvalid ),
- .mem_axi_bready (mem_axi_bready ),
- .mem_axi_arvalid(mem_axi_arvalid),
- .mem_axi_arready(mem_axi_arready),
- .mem_axi_araddr (mem_axi_araddr ),
- .mem_axi_arprot (mem_axi_arprot ),
- .mem_axi_rvalid (mem_axi_rvalid ),
- .mem_axi_rready (mem_axi_rready ),
- .mem_axi_rdata (mem_axi_rdata ),
- .mem_valid (mem_valid ),
- .mem_instr (mem_instr ),
- .mem_ready (mem_ready ),
- .mem_addr (mem_addr ),
- .mem_wdata (mem_wdata ),
- .mem_wstrb (mem_wstrb ),
- .mem_rdata (mem_rdata )
- );
-
- picorv32 #(
- .ENABLE_COUNTERS (ENABLE_COUNTERS ),
- .ENABLE_COUNTERS64 (ENABLE_COUNTERS64 ),
- .ENABLE_REGS_16_31 (ENABLE_REGS_16_31 ),
- .ENABLE_REGS_DUALPORT(ENABLE_REGS_DUALPORT),
- .TWO_STAGE_SHIFT (TWO_STAGE_SHIFT ),
- .BARREL_SHIFTER (BARREL_SHIFTER ),
- .TWO_CYCLE_COMPARE (TWO_CYCLE_COMPARE ),
- .TWO_CYCLE_ALU (TWO_CYCLE_ALU ),
- .COMPRESSED_ISA (COMPRESSED_ISA ),
- .CATCH_MISALIGN (CATCH_MISALIGN ),
- .CATCH_ILLINSN (CATCH_ILLINSN ),
- .ENABLE_PCPI (ENABLE_PCPI ),
- .ENABLE_MUL (ENABLE_MUL ),
- .ENABLE_FAST_MUL (ENABLE_FAST_MUL ),
- .ENABLE_DIV (ENABLE_DIV ),
- .ENABLE_IRQ (ENABLE_IRQ ),
- .ENABLE_IRQ_QREGS (ENABLE_IRQ_QREGS ),
- .ENABLE_IRQ_TIMER (ENABLE_IRQ_TIMER ),
- .ENABLE_TRACE (ENABLE_TRACE ),
- .REGS_INIT_ZERO (REGS_INIT_ZERO ),
- .MASKED_IRQ (MASKED_IRQ ),
- .LATCHED_IRQ (LATCHED_IRQ ),
- .PROGADDR_RESET (PROGADDR_RESET ),
- .PROGADDR_IRQ (PROGADDR_IRQ ),
- .STACKADDR (STACKADDR )
- ) picorv32_core (
- .clk (clk ),
- .resetn (resetn),
- .trap (trap ),
-
- .mem_valid(mem_valid),
- .mem_addr (mem_addr ),
- .mem_wdata(mem_wdata),
- .mem_wstrb(mem_wstrb),
- .mem_instr(mem_instr),
- .mem_ready(mem_ready),
- .mem_rdata(mem_rdata),
-
- .pcpi_valid(pcpi_valid),
- .pcpi_insn (pcpi_insn ),
- .pcpi_rs1 (pcpi_rs1 ),
- .pcpi_rs2 (pcpi_rs2 ),
- .pcpi_wr (pcpi_wr ),
- .pcpi_rd (pcpi_rd ),
- .pcpi_wait (pcpi_wait ),
- .pcpi_ready(pcpi_ready),
-
- .irq(irq),
- .eoi(eoi),
-
-`ifdef RISCV_FORMAL
- .rvfi_valid (rvfi_valid ),
- .rvfi_order (rvfi_order ),
- .rvfi_insn (rvfi_insn ),
- .rvfi_trap (rvfi_trap ),
- .rvfi_halt (rvfi_halt ),
- .rvfi_intr (rvfi_intr ),
- .rvfi_rs1_addr (rvfi_rs1_addr ),
- .rvfi_rs2_addr (rvfi_rs2_addr ),
- .rvfi_rs1_rdata(rvfi_rs1_rdata),
- .rvfi_rs2_rdata(rvfi_rs2_rdata),
- .rvfi_rd_addr (rvfi_rd_addr ),
- .rvfi_rd_wdata (rvfi_rd_wdata ),
- .rvfi_pc_rdata (rvfi_pc_rdata ),
- .rvfi_pc_wdata (rvfi_pc_wdata ),
- .rvfi_mem_addr (rvfi_mem_addr ),
- .rvfi_mem_rmask(rvfi_mem_rmask),
- .rvfi_mem_wmask(rvfi_mem_wmask),
- .rvfi_mem_rdata(rvfi_mem_rdata),
- .rvfi_mem_wdata(rvfi_mem_wdata),
-`endif
-
- .trace_valid(trace_valid),
- .trace_data (trace_data)
- );
-endmodule
-
-
-/***************************************************************
- * picorv32_axi_adapter
- ***************************************************************/
-
-module picorv32_axi_adapter (
- input clk, resetn,
-
- // AXI4-lite master memory interface
-
- output mem_axi_awvalid,
- input mem_axi_awready,
- output [31:0] mem_axi_awaddr,
- output [ 2:0] mem_axi_awprot,
-
- output mem_axi_wvalid,
- input mem_axi_wready,
- output [31:0] mem_axi_wdata,
- output [ 3:0] mem_axi_wstrb,
-
- input mem_axi_bvalid,
- output mem_axi_bready,
-
- output mem_axi_arvalid,
- input mem_axi_arready,
- output [31:0] mem_axi_araddr,
- output [ 2:0] mem_axi_arprot,
-
- input mem_axi_rvalid,
- output mem_axi_rready,
- input [31:0] mem_axi_rdata,
-
- // Native PicoRV32 memory interface
-
- input mem_valid,
- input mem_instr,
- output mem_ready,
- input [31:0] mem_addr,
- input [31:0] mem_wdata,
- input [ 3:0] mem_wstrb,
- output [31:0] mem_rdata
-);
- reg ack_awvalid;
- reg ack_arvalid;
- reg ack_wvalid;
- reg xfer_done;
-
- assign mem_axi_awvalid = mem_valid && |mem_wstrb && !ack_awvalid;
- assign mem_axi_awaddr = mem_addr;
- assign mem_axi_awprot = 0;
-
- assign mem_axi_arvalid = mem_valid && !mem_wstrb && !ack_arvalid;
- assign mem_axi_araddr = mem_addr;
- assign mem_axi_arprot = mem_instr ? 3'b100 : 3'b000;
-
- assign mem_axi_wvalid = mem_valid && |mem_wstrb && !ack_wvalid;
- assign mem_axi_wdata = mem_wdata;
- assign mem_axi_wstrb = mem_wstrb;
-
- assign mem_ready = mem_axi_bvalid || mem_axi_rvalid;
- assign mem_axi_bready = mem_valid && |mem_wstrb;
- assign mem_axi_rready = mem_valid && !mem_wstrb;
- assign mem_rdata = mem_axi_rdata;
-
- always @(posedge clk) begin
- if (!resetn) begin
- ack_awvalid <= 0;
- end else begin
- xfer_done <= mem_valid && mem_ready;
- if (mem_axi_awready && mem_axi_awvalid)
- ack_awvalid <= 1;
- if (mem_axi_arready && mem_axi_arvalid)
- ack_arvalid <= 1;
- if (mem_axi_wready && mem_axi_wvalid)
- ack_wvalid <= 1;
- if (xfer_done || !mem_valid) begin
- ack_awvalid <= 0;
- ack_arvalid <= 0;
- ack_wvalid <= 0;
- end
- end
- end
-endmodule
-
-
-/***************************************************************
- * picorv32_wb
- ***************************************************************/
-
-module picorv32_wb #(
- parameter [ 0:0] ENABLE_COUNTERS = 1,
- parameter [ 0:0] ENABLE_COUNTERS64 = 1,
- parameter [ 0:0] ENABLE_REGS_16_31 = 1,
- parameter [ 0:0] ENABLE_REGS_DUALPORT = 1,
- parameter [ 0:0] TWO_STAGE_SHIFT = 1,
- parameter [ 0:0] BARREL_SHIFTER = 0,
- parameter [ 0:0] TWO_CYCLE_COMPARE = 0,
- parameter [ 0:0] TWO_CYCLE_ALU = 0,
- parameter [ 0:0] COMPRESSED_ISA = 0,
- parameter [ 0:0] CATCH_MISALIGN = 1,
- parameter [ 0:0] CATCH_ILLINSN = 1,
- parameter [ 0:0] ENABLE_PCPI = 0,
- parameter [ 0:0] ENABLE_MUL = 0,
- parameter [ 0:0] ENABLE_FAST_MUL = 0,
- parameter [ 0:0] ENABLE_DIV = 0,
- parameter [ 0:0] ENABLE_IRQ = 0,
- parameter [ 0:0] ENABLE_IRQ_QREGS = 1,
- parameter [ 0:0] ENABLE_IRQ_TIMER = 1,
- parameter [ 0:0] ENABLE_TRACE = 0,
- parameter [ 0:0] REGS_INIT_ZERO = 0,
- parameter [31:0] MASKED_IRQ = 32'h 0000_0000,
- parameter [31:0] LATCHED_IRQ = 32'h ffff_ffff,
- parameter [31:0] PROGADDR_RESET = 32'h 0000_0000,
- parameter [31:0] PROGADDR_IRQ = 32'h 0000_0010,
- parameter [31:0] STACKADDR = 32'h ffff_ffff
-) (
- output trap,
-
- // Wishbone interfaces
- input wb_rst_i,
- input wb_clk_i,
-
- output reg [31:0] wbm_adr_o,
- output reg [31:0] wbm_dat_o,
- input [31:0] wbm_dat_i,
- output reg wbm_we_o,
- output reg [3:0] wbm_sel_o,
- output reg wbm_stb_o,
- input wbm_ack_i,
- output reg wbm_cyc_o,
-
- // Pico Co-Processor Interface (PCPI)
- output pcpi_valid,
- output [31:0] pcpi_insn,
- output [31:0] pcpi_rs1,
- output [31:0] pcpi_rs2,
- input pcpi_wr,
- input [31:0] pcpi_rd,
- input pcpi_wait,
- input pcpi_ready,
-
- // IRQ interface
- input [31:0] irq,
- output [31:0] eoi,
-
-`ifdef RISCV_FORMAL
- output rvfi_valid,
- output [63:0] rvfi_order,
- output [31:0] rvfi_insn,
- output rvfi_trap,
- output rvfi_halt,
- output rvfi_intr,
- output [ 4:0] rvfi_rs1_addr,
- output [ 4:0] rvfi_rs2_addr,
- output [31:0] rvfi_rs1_rdata,
- output [31:0] rvfi_rs2_rdata,
- output [ 4:0] rvfi_rd_addr,
- output [31:0] rvfi_rd_wdata,
- output [31:0] rvfi_pc_rdata,
- output [31:0] rvfi_pc_wdata,
- output [31:0] rvfi_mem_addr,
- output [ 3:0] rvfi_mem_rmask,
- output [ 3:0] rvfi_mem_wmask,
- output [31:0] rvfi_mem_rdata,
- output [31:0] rvfi_mem_wdata,
-`endif
-
- // Trace Interface
- output trace_valid,
- output [35:0] trace_data,
-
- output mem_instr
-);
- wire mem_valid;
- wire [31:0] mem_addr;
- wire [31:0] mem_wdata;
- wire [ 3:0] mem_wstrb;
- reg mem_ready;
- reg [31:0] mem_rdata;
-
- wire clk;
- wire resetn;
-
- assign clk = wb_clk_i;
- assign resetn = ~wb_rst_i;
-
- picorv32 #(
- .ENABLE_COUNTERS (ENABLE_COUNTERS ),
- .ENABLE_COUNTERS64 (ENABLE_COUNTERS64 ),
- .ENABLE_REGS_16_31 (ENABLE_REGS_16_31 ),
- .ENABLE_REGS_DUALPORT(ENABLE_REGS_DUALPORT),
- .TWO_STAGE_SHIFT (TWO_STAGE_SHIFT ),
- .BARREL_SHIFTER (BARREL_SHIFTER ),
- .TWO_CYCLE_COMPARE (TWO_CYCLE_COMPARE ),
- .TWO_CYCLE_ALU (TWO_CYCLE_ALU ),
- .COMPRESSED_ISA (COMPRESSED_ISA ),
- .CATCH_MISALIGN (CATCH_MISALIGN ),
- .CATCH_ILLINSN (CATCH_ILLINSN ),
- .ENABLE_PCPI (ENABLE_PCPI ),
- .ENABLE_MUL (ENABLE_MUL ),
- .ENABLE_FAST_MUL (ENABLE_FAST_MUL ),
- .ENABLE_DIV (ENABLE_DIV ),
- .ENABLE_IRQ (ENABLE_IRQ ),
- .ENABLE_IRQ_QREGS (ENABLE_IRQ_QREGS ),
- .ENABLE_IRQ_TIMER (ENABLE_IRQ_TIMER ),
- .ENABLE_TRACE (ENABLE_TRACE ),
- .REGS_INIT_ZERO (REGS_INIT_ZERO ),
- .MASKED_IRQ (MASKED_IRQ ),
- .LATCHED_IRQ (LATCHED_IRQ ),
- .PROGADDR_RESET (PROGADDR_RESET ),
- .PROGADDR_IRQ (PROGADDR_IRQ ),
- .STACKADDR (STACKADDR )
- ) picorv32_core (
- .clk (clk ),
- .resetn (resetn),
- .trap (trap ),
-
- .mem_valid(mem_valid),
- .mem_addr (mem_addr ),
- .mem_wdata(mem_wdata),
- .mem_wstrb(mem_wstrb),
- .mem_instr(mem_instr),
- .mem_ready(mem_ready),
- .mem_rdata(mem_rdata),
-
- .pcpi_valid(pcpi_valid),
- .pcpi_insn (pcpi_insn ),
- .pcpi_rs1 (pcpi_rs1 ),
- .pcpi_rs2 (pcpi_rs2 ),
- .pcpi_wr (pcpi_wr ),
- .pcpi_rd (pcpi_rd ),
- .pcpi_wait (pcpi_wait ),
- .pcpi_ready(pcpi_ready),
-
- .irq(irq),
- .eoi(eoi),
-
-`ifdef RISCV_FORMAL
- .rvfi_valid (rvfi_valid ),
- .rvfi_order (rvfi_order ),
- .rvfi_insn (rvfi_insn ),
- .rvfi_trap (rvfi_trap ),
- .rvfi_halt (rvfi_halt ),
- .rvfi_intr (rvfi_intr ),
- .rvfi_rs1_addr (rvfi_rs1_addr ),
- .rvfi_rs2_addr (rvfi_rs2_addr ),
- .rvfi_rs1_rdata(rvfi_rs1_rdata),
- .rvfi_rs2_rdata(rvfi_rs2_rdata),
- .rvfi_rd_addr (rvfi_rd_addr ),
- .rvfi_rd_wdata (rvfi_rd_wdata ),
- .rvfi_pc_rdata (rvfi_pc_rdata ),
- .rvfi_pc_wdata (rvfi_pc_wdata ),
- .rvfi_mem_addr (rvfi_mem_addr ),
- .rvfi_mem_rmask(rvfi_mem_rmask),
- .rvfi_mem_wmask(rvfi_mem_wmask),
- .rvfi_mem_rdata(rvfi_mem_rdata),
- .rvfi_mem_wdata(rvfi_mem_wdata),
-`endif
-
- .trace_valid(trace_valid),
- .trace_data (trace_data)
- );
- // Wishbone Controller
- localparam IDLE = 2'b00;
- localparam WBSTART = 2'b01;
- localparam WBEND = 2'b10;
-
- reg [1:0] state;
-
- wire we;
- assign we = (mem_wstrb[0] | mem_wstrb[1] | mem_wstrb[2] | mem_wstrb[3]);
-
- always @(posedge wb_clk_i) begin
- if (wb_rst_i) begin
- wbm_adr_o <= 0;
- wbm_dat_o <= 0;
- wbm_we_o <= 0;
- wbm_sel_o <= 0;
- wbm_stb_o <= 0;
- wbm_cyc_o <= 0;
- state <= IDLE;
- end else begin
- case (state)
- IDLE: begin
- if (mem_valid) begin
- wbm_adr_o <= mem_addr;
- wbm_dat_o <= mem_wdata;
- wbm_we_o <= we;
- wbm_sel_o <= mem_wstrb;
-
- wbm_stb_o <= 1'b1;
- wbm_cyc_o <= 1'b1;
- state <= WBSTART;
- end else begin
- mem_ready <= 1'b0;
-
- wbm_stb_o <= 1'b0;
- wbm_cyc_o <= 1'b0;
- wbm_we_o <= 1'b0;
- end
- end
- WBSTART:begin
- if (wbm_ack_i) begin
- mem_rdata <= wbm_dat_i;
- mem_ready <= 1'b1;
-
- state <= WBEND;
-
- wbm_stb_o <= 1'b0;
- wbm_cyc_o <= 1'b0;
- wbm_we_o <= 1'b0;
- end
- end
- WBEND: begin
- mem_ready <= 1'b0;
-
- state <= IDLE;
- end
- default:
- state <= IDLE;
- endcase
- end
- end
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/ring_osc2x13.v b/caravel/rtl/ring_osc2x13.v
deleted file mode 100644
index f20110e..0000000
--- a/caravel/rtl/ring_osc2x13.v
+++ /dev/null
@@ -1,250 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-// Tunable ring oscillator---synthesizable (physical) version.
-//
-// NOTE: This netlist cannot be simulated correctly due to lack
-// of accurate timing in the digital cell verilog models.
-
-module delay_stage(in, trim, out);
- input in;
- input [1:0] trim;
- output out;
-
- wire d0, d1, d2, ts;
-
- sky130_fd_sc_hd__clkbuf_2 delaybuf0 (
- .A(in),
- .X(ts)
- );
-
- sky130_fd_sc_hd__clkbuf_1 delaybuf1 (
- .A(ts),
- .X(d0)
- );
-
- sky130_fd_sc_hd__einvp_2 delayen1 (
- .A(d0),
- .TE(trim[1]),
- .Z(d1)
- );
-
- sky130_fd_sc_hd__einvn_4 delayenb1 (
- .A(ts),
- .TE_B(trim[1]),
- .Z(d1)
- );
-
- sky130_fd_sc_hd__clkinv_1 delayint0 (
- .A(d1),
- .Y(d2)
- );
-
- sky130_fd_sc_hd__einvp_2 delayen0 (
- .A(d2),
- .TE(trim[0]),
- .Z(out)
- );
-
- sky130_fd_sc_hd__einvn_8 delayenb0 (
- .A(ts),
- .TE_B(trim[0]),
- .Z(out)
- );
-
-endmodule
-
-module start_stage(in, trim, reset, out);
- input in;
- input [1:0] trim;
- input reset;
- output out;
-
- wire d0, d1, d2, ctrl0, one;
-
- sky130_fd_sc_hd__clkbuf_1 delaybuf0 (
- .A(in),
- .X(d0)
- );
-
- sky130_fd_sc_hd__einvp_2 delayen1 (
- .A(d0),
- .TE(trim[1]),
- .Z(d1)
- );
-
- sky130_fd_sc_hd__einvn_4 delayenb1 (
- .A(in),
- .TE_B(trim[1]),
- .Z(d1)
- );
-
- sky130_fd_sc_hd__clkinv_1 delayint0 (
- .A(d1),
- .Y(d2)
- );
-
- sky130_fd_sc_hd__einvp_2 delayen0 (
- .A(d2),
- .TE(trim[0]),
- .Z(out)
- );
-
- sky130_fd_sc_hd__einvn_8 delayenb0 (
- .A(in),
- .TE_B(ctrl0),
- .Z(out)
- );
-
- sky130_fd_sc_hd__einvp_1 reseten0 (
- .A(one),
- .TE(reset),
- .Z(out)
- );
-
- sky130_fd_sc_hd__or2_2 ctrlen0 (
- .A(reset),
- .B(trim[0]),
- .X(ctrl0)
- );
-
- sky130_fd_sc_hd__conb_1 const1 (
- .HI(one),
- .LO()
- );
-
-endmodule
-
-// Ring oscillator with 13 stages, each with two trim bits delay
-// (see above). Trim is not binary: For trim[1:0], lower bit
-// trim[0] is primary trim and must be applied first; upper
-// bit trim[1] is secondary trim and should only be applied
-// after the primary trim is applied, or it has no effect.
-//
-// Total effective number of inverter stages in this oscillator
-// ranges from 13 at trim 0 to 65 at trim 24. The intention is
-// to cover a range greater than 2x so that the midrange can be
-// reached over all PVT conditions.
-//
-// Frequency of this ring oscillator under SPICE simulations at
-// nominal PVT is maximum 214 MHz (trim 0), minimum 90 MHz (trim 24).
-
-module ring_osc2x13(reset, trim, clockp);
- input reset;
- input [25:0] trim;
- output[1:0] clockp;
-
-`ifdef FUNCTIONAL // i.e., behavioral model below
-
- reg [1:0] clockp;
- reg hiclock;
- integer i;
- real delay;
- wire [5:0] bcount;
-
- assign bcount = trim[0] + trim[1] + trim[2]
- + trim[3] + trim[4] + trim[5] + trim[6] + trim[7]
- + trim[8] + trim[9] + trim[10] + trim[11] + trim[12]
- + trim[13] + trim[14] + trim[15] + trim[16] + trim[17]
- + trim[18] + trim[19] + trim[20] + trim[21] + trim[22]
- + trim[23] + trim[24] + trim[25];
-
- initial begin
- hiclock <= 1'b0;
- delay = 3.0;
- end
-
- // Fastest operation is 214 MHz = 4.67ns
- // Delay per trim is 0.02385
- // Run "hiclock" at 2x this rate, then use positive and negative
- // edges to derive the 0 and 90 degree phase clocks.
-
- always #delay begin
- hiclock <= (hiclock === 1'b0);
- end
-
- always @(trim) begin
- // Implement trim as a variable delay, one delay per trim bit
- delay = 1.168 + 0.012 * $itor(bcount);
- end
-
- always @(posedge hiclock or posedge reset) begin
- if (reset == 1'b1) begin
- clockp[0] <= 1'b0;
- end else begin
- clockp[0] <= (clockp[0] === 1'b0);
- end
- end
-
- always @(negedge hiclock or posedge reset) begin
- if (reset == 1'b1) begin
- clockp[1] <= 1'b0;
- end else begin
- clockp[1] <= (clockp[1] === 1'b0);
- end
- end
-
-`else // !FUNCTIONAL; i.e., gate level netlist below
-
- wire [1:0] clockp;
- wire [12:0] d;
- wire [1:0] c;
-
- // Main oscillator loop stages
-
- genvar i;
- generate
- for (i = 0; i < 12; i = i + 1) begin : dstage
- delay_stage id (
- .in(d[i]),
- .trim({trim[i+13], trim[i]}),
- .out(d[i+1])
- );
- end
- endgenerate
-
- // Reset/startup stage
-
- start_stage iss (
- .in(d[12]),
- .trim({trim[25], trim[12]}),
- .reset(reset),
- .out(d[0])
- );
-
- // Buffered outputs a 0 and 90 degrees phase (approximately)
-
- sky130_fd_sc_hd__clkinv_2 ibufp00 (
- .A(d[0]),
- .Y(c[0])
- );
- sky130_fd_sc_hd__clkinv_8 ibufp01 (
- .A(c[0]),
- .Y(clockp[0])
- );
- sky130_fd_sc_hd__clkinv_2 ibufp10 (
- .A(d[6]),
- .Y(c[1])
- );
- sky130_fd_sc_hd__clkinv_8 ibufp11 (
- .A(c[1]),
- .Y(clockp[1])
- );
-
-`endif // !FUNCTIONAL
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/simple_por.v b/caravel/rtl/simple_por.v
deleted file mode 100644
index 8168c0b..0000000
--- a/caravel/rtl/simple_por.v
+++ /dev/null
@@ -1,92 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-`timescale 1 ns / 1 ps
-
-module simple_por(
-`ifdef USE_POWER_PINS
- inout vdd3v3,
- inout vdd1v8,
- inout vss,
-`endif
- output porb_h,
- output porb_l,
- output por_l
-);
-
- wire mid, porb_h;
- reg inode;
-
- // This is a behavioral model! Actual circuit is a resitor dumping
- // current (slowly) from vdd3v3 onto a capacitor, and this fed into
- // two schmitt triggers for strong hysteresis/glitch tolerance.
-
- initial begin
- inode <= 1'b0;
- end
-
- // Emulate current source on capacitor as a 500ns delay either up or
- // down. Note that this is sped way up for verilog simulation; the
- // actual circuit is set to a 15ms delay.
-
- always @(posedge vdd3v3) begin
- #500 inode <= 1'b1;
- end
- always @(negedge vdd3v3) begin
- #500 inode <= 1'b0;
- end
-
- // Instantiate two shmitt trigger buffers in series
-
- sky130_fd_sc_hvl__schmittbuf_1 hystbuf1 (
-`ifdef USE_POWER_PINS
- .VPWR(vdd3v3),
- .VGND(vss),
- .VPB(vdd3v3),
- .VNB(vss),
-`endif
- .A(inode),
- .X(mid)
- );
-
- sky130_fd_sc_hvl__schmittbuf_1 hystbuf2 (
-`ifdef USE_POWER_PINS
- .VPWR(vdd3v3),
- .VGND(vss),
- .VPB(vdd3v3),
- .VNB(vss),
-`endif
- .A(mid),
- .X(porb_h)
- );
-
- sky130_fd_sc_hvl__lsbufhv2lv_1 porb_level (
-`ifdef USE_POWER_PINS
- .VPWR(vdd3v3),
- .VPB(vdd3v3),
- .LVPWR(vdd1v8),
- .VNB(vss),
- .VGND(vss),
-`endif
- .A(porb_h),
- .X(porb_l)
- );
-
- // since this is behavioral anyway, but this should be
- // replaced by a proper inverter
- assign por_l = ~porb_l;
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/simple_spi_master.v b/caravel/rtl/simple_spi_master.v
deleted file mode 100644
index 60a923b..0000000
--- a/caravel/rtl/simple_spi_master.v
+++ /dev/null
@@ -1,410 +0,0 @@
-`default_nettype none
-// SPDX-FileCopyrightText: 2019 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-//----------------------------------------------------------------------------
-// Module: simple_spi_master
-//
-//----------------------------------------------------------------------------
-// Copyright (C) 2019 efabless, inc.
-//
-// This source file may be used and distributed without
-// restriction provided that this copyright statement is not
-// removed from the file and that any derivative work contains
-// the original copyright notice and the associated disclaimer.
-//
-// This source file is free software; you can redistribute it
-// and/or modify it under the terms of the GNU Lesser General
-// Public License as published by the Free Software Foundation;
-// either version 2.1 of the License, or (at your option) any
-// later version.
-//
-// This source is distributed in the hope that it will be
-// useful, but WITHOUT ANY WARRANTY; without even the implied
-// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-// PURPOSE. See the GNU Lesser General Public License for more
-// details.
-//
-//--------------------------------------------------------------------
-//
-// resetn: active low async reset
-// clk: master clock (before prescaler)
-// stream:
-// 0 = apply/release CSB separately for each byte
-// 1 = apply CSB until stream bit is cleared
-// mlb:
-// 0 = msb 1st
-// 1 = lsb 1st
-// invsck:
-// 0 = normal SCK
-// 1 = inverted SCK
-// invcsb:
-// 0 = normal CSB (active low)
-// 1 = inverted CSB (active high)
-// mode:
-// 0 = read and change data on opposite SCK edges
-// 1 = read and change data on the same SCK edge
-// enable:
-// 0 = disable the SPI master
-// 1 = enable the SPI master
-// irqena:
-// 0 = disable interrupt
-// 1 = enable interrupt
-// hkconn:
-// 0 = housekeeping SPI disconnected
-// 1 = housekeeping SPI connected (when SPI master enabled)
-// prescaler: count (in master clock cycles) of 1/2 SCK cycle.
-//
-// reg_dat_we:
-// 1 = data write enable
-// reg_dat_re:
-// 1 = data read enable
-// reg_cfg_*: Signaling for read/write of configuration register
-// reg_dat_*: Signaling for read/write of data register
-//
-// err_out: Indicates attempt to read/write before data ready
-// (failure to wait for reg_dat_wait to clear)
-//
-// Between "mode" and "invsck", all four standard SPI modes are supported
-//
-//--------------------------------------------------------------------
-
-module simple_spi_master_wb #(
- parameter BASE_ADR = 32'h2100_0000,
- parameter CONFIG = 8'h00,
- parameter DATA = 8'h04
-) (
- input wb_clk_i,
- input wb_rst_i,
- input [31:0] wb_adr_i,
- input [31:0] wb_dat_i,
- input [3:0] wb_sel_i,
- input wb_we_i,
- input wb_cyc_i,
- input wb_stb_i,
- output wb_ack_o,
- output [31:0] wb_dat_o,
-
- output hk_connect, // Connect to housekeeping SPI
- output spi_enabled, // Use to mux pins with GPIO control
- input sdi, // SPI input
- output csb, // SPI chip select
- output sck, // SPI clock
- output sdo, // SPI output
- output sdoenb, // SPI output enable
- output irq // interrupt output
-);
-
- wire [31:0] simple_spi_master_reg_cfg_do;
- wire [31:0] simple_spi_master_reg_dat_do;
-
- wire resetn = ~wb_rst_i;
- wire valid = wb_stb_i && wb_cyc_i;
- wire simple_spi_master_reg_cfg_sel = valid && (wb_adr_i == (BASE_ADR | CONFIG));
- wire simple_spi_master_reg_dat_sel = valid && (wb_adr_i == (BASE_ADR | DATA));
-
- wire [1:0] reg_cfg_we = (simple_spi_master_reg_cfg_sel) ?
- (wb_sel_i[1:0] & {2{wb_we_i}}): 2'b00;
- wire reg_dat_we = (simple_spi_master_reg_dat_sel) ? (wb_sel_i[0] & wb_we_i): 1'b0;
- wire reg_dat_wait;
-
- wire [31:0] mem_wdata = wb_dat_i;
- wire reg_dat_re = simple_spi_master_reg_dat_sel && !wb_sel_i && ~wb_we_i;
-
- assign wb_dat_o = (simple_spi_master_reg_cfg_sel) ? simple_spi_master_reg_cfg_do :
- simple_spi_master_reg_dat_do;
- assign wb_ack_o = (simple_spi_master_reg_cfg_sel || simple_spi_master_reg_dat_sel)
- && (!reg_dat_wait);
-
- simple_spi_master spi_master (
- .resetn(resetn),
- .clk(wb_clk_i),
- .reg_cfg_we(reg_cfg_we),
- .reg_cfg_di(mem_wdata),
- .reg_cfg_do(simple_spi_master_reg_cfg_do),
- .reg_dat_we(reg_dat_we),
- .reg_dat_re(reg_dat_re),
- .reg_dat_di(mem_wdata),
- .reg_dat_do(simple_spi_master_reg_dat_do),
- .reg_dat_wait(reg_dat_wait),
-
- .hk_connect(hk_connect), // Attach to housekeeping SPI slave
- .spi_enabled(spi_enabled), // Mux pins with GPIO
- .sdi(sdi), // SPI input
- .csb(csb), // SPI chip select
- .sck(sck), // SPI clock
- .sdo(sdo), // SPI output
- .irq_out(irq) // interrupt
- );
-endmodule
-
-module simple_spi_master (
- input resetn,
- input clk, // master clock (assume 100MHz)
-
- input [1:0] reg_cfg_we,
- input [31:0] reg_cfg_di,
- output [31:0] reg_cfg_do,
-
- input reg_dat_we,
- input reg_dat_re,
- input [31:0] reg_dat_di,
- output [31:0] reg_dat_do,
- output reg_dat_wait,
- output irq_out,
- output err_out,
-
- output hk_connect, // Connect to housekeeping SPI
- output spi_enabled, // Used to mux pins with GPIO
- input sdi, // SPI input
- output csb, // SPI chip select
- output sck, // SPI clock
- output sdo // SPI output
-);
-
- parameter IDLE = 2'b00;
- parameter SENDL = 2'b01;
- parameter SENDH = 2'b10;
- parameter FINISH = 2'b11;
-
- reg done;
- reg isdo, hsck, icsb;
- reg [1:0] state;
- reg isck;
- reg err_out;
-
- reg [7:0] treg, rreg, d_latched;
- reg [2:0] nbit;
-
- reg [7:0] prescaler;
- reg [7:0] count;
- reg invsck;
- reg invcsb;
- reg mlb;
- reg irqena;
- reg stream;
- reg mode;
- reg enable;
- reg hkconn;
-
- wire csb;
- wire irq_out;
- wire sck;
- wire sdo;
- wire sdoenb;
- wire hk_connect;
- wire spi_enabled;
-
- // Define behavior for inverted SCK and inverted CSB
- assign csb = (invcsb) ? ~icsb : icsb;
- assign sck = (invsck) ? ~isck : isck;
-
- // No bidirectional 3-pin mode defined, so SDO is enabled whenever CSB is low.
- assign sdoenb = icsb;
- assign sdo = isdo;
-
- assign irq_out = irqena & done;
- assign hk_connect = (enable == 1'b1) ? hkconn : 1'b0;
- assign spi_enabled = enable;
-
- // Read configuration and data registers
- assign reg_cfg_do = {16'd0, hkconn, irqena, enable, stream, mode,
- invsck, invcsb, mlb, prescaler};
- assign reg_dat_wait = ~done;
- assign reg_dat_do = done ? rreg : ~0;
-
- // Write configuration register
- always @(posedge clk or negedge resetn) begin
- if (resetn == 1'b0) begin
- prescaler <= 8'd2;
- invcsb <= 1'b0;
- invsck <= 1'b0;
- mlb <= 1'b0;
- enable <= 1'b0;
- irqena <= 1'b0;
- stream <= 1'b0;
- mode <= 1'b0;
- hkconn <= 1'b0;
- end else begin
- if (reg_cfg_we[0]) prescaler <= reg_cfg_di[7:0];
- if (reg_cfg_we[1]) begin
- mlb <= reg_cfg_di[8];
- invcsb <= reg_cfg_di[9];
- invsck <= reg_cfg_di[10];
- mode <= reg_cfg_di[11];
- stream <= reg_cfg_di[12];
- enable <= reg_cfg_di[13];
- irqena <= reg_cfg_di[14];
- hkconn <= reg_cfg_di[15];
- end //reg_cfg_we[1]
- end //resetn
- end //always
-
- // Watch for read and write enables on clk, not hsck, so as not to
- // miss them.
-
- reg w_latched, r_latched;
-
- always @(posedge clk or negedge resetn) begin
- if (resetn == 1'b0) begin
- err_out <= 1'b0;
- w_latched <= 1'b0;
- r_latched <= 1'b0;
- d_latched <= 8'd0;
- end else begin
- // Clear latches on SEND, otherwise latch when seen
- if (state == SENDL || state == SENDH) begin
- if (reg_dat_we == 1'b0) begin
- w_latched <= 1'b0;
- end
- end else begin
- if (reg_dat_we == 1'b1) begin
- if (done == 1'b0 && w_latched == 1'b1) begin
- err_out <= 1'b1;
- end else begin
- w_latched <= 1'b1;
- d_latched <= reg_dat_di[7:0];
- err_out <= 1'b0;
- end
- end
- end
-
- if (reg_dat_re == 1'b1) begin
- if (r_latched == 1'b1) begin
- r_latched <= 1'b0;
- end else begin
- err_out <= 1'b1; // byte not available
- end
- end else if (state == FINISH) begin
- r_latched <= 1'b1;
- end if (state == SENDL || state == SENDH) begin
- if (r_latched == 1'b1) begin
- err_out <= 1'b1; // last byte was never read
- end else begin
- r_latched <= 1'b0;
- end
- end
- end
- end
-
- // State transition.
-
- always @(posedge hsck or negedge resetn) begin
- if (resetn == 1'b0) begin
- state <= IDLE;
- nbit <= 3'd0;
- icsb <= 1'b1;
- done <= 1'b1;
- end else begin
- if (state == IDLE) begin
- if (w_latched == 1'b1) begin
- state <= SENDL;
- nbit <= 3'd0;
- icsb <= 1'b0;
- done <= 1'b0;
- end else begin
- icsb <= ~stream;
- end
- end else if (state == SENDL) begin
- state <= SENDH;
- end else if (state == SENDH) begin
- nbit <= nbit + 1;
- if (nbit == 3'd7) begin
- state <= FINISH;
- end else begin
- state <= SENDL;
- end
- end else if (state == FINISH) begin
- icsb <= ~stream;
- done <= 1'b1;
- state <= IDLE;
- end
- end
- end
-
- // Set up internal clock. The enable bit gates the internal clock
- // to shut down the master SPI when disabled.
-
- always @(posedge clk or negedge resetn) begin
- if (resetn == 1'b0) begin
- count <= 8'd0;
- hsck <= 1'b0;
- end else begin
- if (enable == 1'b0) begin
- count <= 8'd0;
- end else begin
- count <= count + 1;
- if (count == prescaler) begin
- hsck <= ~hsck;
- count <= 8'd0;
- end // count
- end // enable
- end // resetn
- end // always
-
- // sck is half the rate of hsck
-
- always @(posedge hsck or negedge resetn) begin
- if (resetn == 1'b0) begin
- isck <= 1'b0;
- end else begin
- if (state == IDLE || state == FINISH)
- isck <= 1'b0;
- else
- isck <= ~isck;
- end // resetn
- end // always
-
- // Main procedure: read, write, shift data
-
- always @(posedge hsck or negedge resetn) begin
- if (resetn == 1'b0) begin
- rreg <= 8'hff;
- treg <= 8'hff;
- isdo <= 1'b0;
- end else begin
- if (isck == 1'b0 && (state == SENDL || state == SENDH)) begin
- if (mlb == 1'b1) begin
- // LSB first, sdi@msb -> right shift
- rreg <= {sdi, rreg[7:1]};
- end else begin
- // MSB first, sdi@lsb -> left shift
- rreg <= {rreg[6:0], sdi};
- end
- end // read on ~isck
-
- if (w_latched == 1'b1) begin
- if (mlb == 1'b1) begin
- treg <= {1'b1, d_latched[7:1]};
- isdo <= d_latched[0];
- end else begin
- treg <= {d_latched[6:0], 1'b1};
- isdo <= d_latched[7];
- end // mlb
- end else if ((mode ^ isck) == 1'b1) begin
- if (mlb == 1'b1) begin
- // LSB first, shift right
- treg <= {1'b1, treg[7:1]};
- isdo <= treg[0];
- end else begin
- // MSB first shift LEFT
- treg <= {treg[6:0], 1'b1};
- isdo <= treg[7];
- end // mlb
- end // write on mode ^ isck
- end // resetn
- end // always
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/simpleuart.v b/caravel/rtl/simpleuart.v
deleted file mode 100644
index 12be167..0000000
--- a/caravel/rtl/simpleuart.v
+++ /dev/null
@@ -1,223 +0,0 @@
-`default_nettype none
-/*
- * SPDX-FileCopyrightText: 2015 Clifford Wolf
- * PicoSoC - A simple example SoC using PicoRV32
- *
- * Copyright (C) 2017 Clifford Wolf <clifford@clifford.at>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * SPDX-License-Identifier: ISC
- */
-
-module simpleuart_wb # (
- parameter BASE_ADR = 32'h 2000_0000,
- parameter CLK_DIV = 8'h00,
- parameter DATA = 8'h04,
- parameter CONFIG = 8'h08
-) (
- input wb_clk_i,
- input wb_rst_i,
-
- input [31:0] wb_adr_i, // (verify): input address was originaly 22 bits , why ? (max number of words ?)
- input [31:0] wb_dat_i,
- input [3:0] wb_sel_i,
- input wb_we_i,
- input wb_cyc_i,
- input wb_stb_i,
-
- output wb_ack_o,
- output [31:0] wb_dat_o,
-
- output uart_enabled,
- output ser_tx,
- input ser_rx
-
-);
- wire [31:0] simpleuart_reg_div_do;
- wire [31:0] simpleuart_reg_dat_do;
- wire [31:0] simpleuart_reg_cfg_do;
- wire reg_dat_wait;
-
- wire resetn = ~wb_rst_i;
- wire valid = wb_stb_i && wb_cyc_i;
- wire simpleuart_reg_div_sel = valid && (wb_adr_i == (BASE_ADR | CLK_DIV));
- wire simpleuart_reg_dat_sel = valid && (wb_adr_i == (BASE_ADR | DATA));
- wire simpleuart_reg_cfg_sel = valid && (wb_adr_i == (BASE_ADR | CONFIG));
-
- wire [3:0] reg_div_we = simpleuart_reg_div_sel ? (wb_sel_i & {4{wb_we_i}}): 4'b 0000;
- wire reg_dat_we = simpleuart_reg_dat_sel ? (wb_sel_i[0] & wb_we_i): 1'b 0; // simpleuart_reg_dat_sel ? mem_wstrb[0] : 1'b 0
- wire reg_cfg_we = simpleuart_reg_cfg_sel ? (wb_sel_i[0] & wb_we_i): 1'b 0;
-
- wire [31:0] mem_wdata = wb_dat_i;
- wire reg_dat_re = simpleuart_reg_dat_sel && !wb_sel_i && ~wb_we_i; // read_enable
-
- assign wb_dat_o = simpleuart_reg_div_sel ? simpleuart_reg_div_do:
- simpleuart_reg_cfg_sel ? simpleuart_reg_cfg_do:
- simpleuart_reg_dat_do;
- assign wb_ack_o = (simpleuart_reg_div_sel || simpleuart_reg_dat_sel
- || simpleuart_reg_cfg_sel) && (!reg_dat_wait);
-
- simpleuart simpleuart (
- .clk (wb_clk_i),
- .resetn (resetn),
-
- .ser_tx (ser_tx),
- .ser_rx (ser_rx),
- .enabled (uart_enabled),
-
- .reg_div_we (reg_div_we),
- .reg_div_di (mem_wdata),
- .reg_div_do (simpleuart_reg_div_do),
-
- .reg_cfg_we (reg_cfg_we),
- .reg_cfg_di (mem_wdata),
- .reg_cfg_do (simpleuart_reg_cfg_do),
-
- .reg_dat_we (reg_dat_we),
- .reg_dat_re (reg_dat_re),
- .reg_dat_di (mem_wdata),
- .reg_dat_do (simpleuart_reg_dat_do),
- .reg_dat_wait(reg_dat_wait)
- );
-
-endmodule
-
-module simpleuart (
- input clk,
- input resetn,
-
- output enabled,
- output ser_tx,
- input ser_rx,
-
- input [3:0] reg_div_we,
- input [31:0] reg_div_di,
- output [31:0] reg_div_do,
-
- input reg_cfg_we,
- input [31:0] reg_cfg_di,
- output [31:0] reg_cfg_do,
-
- input reg_dat_we,
- input reg_dat_re,
- input [31:0] reg_dat_di,
- output [31:0] reg_dat_do,
- output reg_dat_wait
-);
- reg [31:0] cfg_divider;
- reg enabled;
-
- reg [3:0] recv_state;
- reg [31:0] recv_divcnt;
- reg [7:0] recv_pattern;
- reg [7:0] recv_buf_data;
- reg recv_buf_valid;
-
- reg [9:0] send_pattern;
- reg [3:0] send_bitcnt;
- reg [31:0] send_divcnt;
- reg send_dummy;
-
- assign reg_div_do = cfg_divider;
- assign reg_cfg_do = {31'd0, enabled};
-
- assign reg_dat_wait = reg_dat_we && (send_bitcnt || send_dummy);
- assign reg_dat_do = recv_buf_valid ? recv_buf_data : ~0;
-
- always @(posedge clk) begin
- if (!resetn) begin
- cfg_divider <= 1;
- enabled <= 1'b0;
- end else begin
- if (reg_div_we[0]) cfg_divider[ 7: 0] <= reg_div_di[ 7: 0];
- if (reg_div_we[1]) cfg_divider[15: 8] <= reg_div_di[15: 8];
- if (reg_div_we[2]) cfg_divider[23:16] <= reg_div_di[23:16];
- if (reg_div_we[3]) cfg_divider[31:24] <= reg_div_di[31:24];
- if (reg_cfg_we) enabled <= reg_div_di[0];
- end
- end
-
- always @(posedge clk) begin
- if (!resetn) begin
- recv_state <= 0;
- recv_divcnt <= 0;
- recv_pattern <= 0;
- recv_buf_data <= 0;
- recv_buf_valid <= 0;
- end else begin
- recv_divcnt <= recv_divcnt + 1;
- if (reg_dat_re)
- recv_buf_valid <= 0;
- case (recv_state)
- 0: begin
- if (!ser_rx && enabled)
- recv_state <= 1;
- recv_divcnt <= 0;
- end
- 1: begin
- if (2*recv_divcnt > cfg_divider) begin
- recv_state <= 2;
- recv_divcnt <= 0;
- end
- end
- 10: begin
- if (recv_divcnt > cfg_divider) begin
- recv_buf_data <= recv_pattern;
- recv_buf_valid <= 1;
- recv_state <= 0;
- end
- end
- default: begin
- if (recv_divcnt > cfg_divider) begin
- recv_pattern <= {ser_rx, recv_pattern[7:1]};
- recv_state <= recv_state + 1;
- recv_divcnt <= 0;
- end
- end
- endcase
- end
- end
-
- assign ser_tx = send_pattern[0];
-
- always @(posedge clk) begin
- if (reg_div_we && enabled)
- send_dummy <= 1;
- send_divcnt <= send_divcnt + 1;
- if (!resetn) begin
- send_pattern <= ~0;
- send_bitcnt <= 0;
- send_divcnt <= 0;
- send_dummy <= 1;
- end else begin
- if (send_dummy && !send_bitcnt) begin
- send_pattern <= ~0;
- send_bitcnt <= 15;
- send_divcnt <= 0;
- send_dummy <= 0;
- end else
- if (reg_dat_we && !send_bitcnt) begin
- send_pattern <= {1'b1, reg_dat_di[7:0], 1'b0};
- send_bitcnt <= 10;
- send_divcnt <= 0;
- end else
- if (send_divcnt > cfg_divider && send_bitcnt) begin
- send_pattern <= {1'b1, send_pattern[9:1]};
- send_bitcnt <= send_bitcnt - 1;
- send_divcnt <= 0;
- end
- end
- end
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped.v b/caravel/rtl/sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped.v
deleted file mode 100644
index 19f19b0..0000000
--- a/caravel/rtl/sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped.v
+++ /dev/null
@@ -1,50 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-module sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped (
- X ,
- A ,
-`ifdef USE_POWER_PINS
- VPWR ,
- VGND ,
- LVPWR,
- LVGND,
-`endif
-);
-
-output X ;
-input A ;
-`ifdef USE_POWER_PINS
-inout VPWR ;
-inout VGND ;
-inout LVPWR;
-inout LVGND;
-`endif
-
-sky130_fd_sc_hvl__lsbufhv2lv_1 lvlshiftdown (
-`ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VPB(VPWR),
-
- .LVPWR(LVPWR),
-
- .VNB(VGND),
- .VGND(VGND),
-`endif
- .A(A),
- .X(X)
-);
-
-endmodule
diff --git a/caravel/rtl/spimemio.v b/caravel/rtl/spimemio.v
deleted file mode 100644
index 0e3c95f..0000000
--- a/caravel/rtl/spimemio.v
+++ /dev/null
@@ -1,753 +0,0 @@
-`default_nettype none
-/*
- * SPDX-FileCopyrightText: 2015 Clifford Wolf
- * PicoSoC - A simple example SoC using PicoRV32
- *
- * Copyright (C) 2017 Clifford Wolf <clifford@clifford.at>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * SPDX-License-Identifier: ISC
- */
-
-module spimemio_wb (
- input wb_clk_i,
- input wb_rst_i,
-
- input [31:0] wb_adr_i,
- input [31:0] wb_dat_i,
- input [3:0] wb_sel_i,
- input wb_we_i,
- input wb_cyc_i,
-
- input wb_flash_stb_i,
- input wb_cfg_stb_i,
-
- output wb_flash_ack_o,
- output wb_cfg_ack_o,
-
- output [31:0] wb_flash_dat_o,
- output [31:0] wb_cfg_dat_o,
-
- output quad_mode,
- input pass_thru,
- input pass_thru_csb,
- input pass_thru_sck,
- input pass_thru_sdi,
- output pass_thru_sdo,
-
- output flash_csb,
- output flash_clk,
-
- output flash_csb_oeb,
- output flash_clk_oeb,
-
- output flash_io0_oeb,
- output flash_io1_oeb,
- output flash_io2_oeb,
- output flash_io3_oeb,
-
- output flash_csb_ieb,
- output flash_clk_ieb,
-
- output flash_io0_ieb,
- output flash_io1_ieb,
- output flash_io2_ieb,
- output flash_io3_ieb,
-
- output flash_io0_do,
- output flash_io1_do,
- output flash_io2_do,
- output flash_io3_do,
-
- input flash_io0_di,
- input flash_io1_di,
- input flash_io2_di,
- input flash_io3_di
-
-);
- wire spimem_ready;
- wire [23:0] mem_addr;
- wire [31:0] spimem_rdata;
- wire [31:0] spimemio_cfgreg_do;
- wire [3:0] cfgreg_we;
- wire spimemio_cfgreg_sel;
- wire valid;
- wire resetn;
- wire quad_mode;
-
- assign resetn = ~wb_rst_i;
- assign valid = wb_cyc_i && wb_flash_stb_i;
- assign wb_flash_ack_o = spimem_ready;
- assign wb_cfg_ack_o = spimemio_cfgreg_sel;
-
- assign mem_addr = wb_adr_i[23:0];
- assign spimemio_cfgreg_sel = wb_cyc_i && wb_cfg_stb_i;
-
- assign cfgreg_we = spimemio_cfgreg_sel ? wb_sel_i & {4{wb_we_i}} : 4'b 0000;
- assign wb_flash_dat_o = spimem_rdata;
- assign wb_cfg_dat_o = spimemio_cfgreg_do;
-
- spimemio spimemio (
- .clk (wb_clk_i),
- .resetn (resetn),
- .valid (valid),
- .ready (spimem_ready),
- .addr (mem_addr),
- .rdata (spimem_rdata),
-
- .flash_csb (flash_csb),
- .flash_clk (flash_clk),
-
- .flash_csb_oeb (flash_csb_oeb),
- .flash_clk_oeb (flash_clk_oeb),
-
- .flash_io0_oeb (flash_io0_oeb),
- .flash_io1_oeb (flash_io1_oeb),
- .flash_io2_oeb (flash_io2_oeb),
- .flash_io3_oeb (flash_io3_oeb),
-
- .flash_csb_ieb (flash_csb_ieb),
- .flash_clk_ieb (flash_clk_ieb),
-
- .flash_io0_ieb (flash_io0_ieb),
- .flash_io1_ieb (flash_io1_ieb),
- .flash_io2_ieb (flash_io2_ieb),
- .flash_io3_ieb (flash_io3_ieb),
-
- .flash_io0_do (flash_io0_do),
- .flash_io1_do (flash_io1_do),
- .flash_io2_do (flash_io2_do),
- .flash_io3_do (flash_io3_do),
-
- .flash_io0_di (flash_io0_di),
- .flash_io1_di (flash_io1_di),
- .flash_io2_di (flash_io2_di),
- .flash_io3_di (flash_io3_di),
-
- .cfgreg_we(cfgreg_we),
- .cfgreg_di(wb_dat_i),
- .cfgreg_do(spimemio_cfgreg_do),
-
- .quad_mode(quad_mode),
- .pass_thru(pass_thru),
- .pass_thru_csb(pass_thru_csb),
- .pass_thru_sck(pass_thru_sck),
- .pass_thru_sdi(pass_thru_sdi),
- .pass_thru_sdo(pass_thru_sdo)
- );
-
-endmodule
-
-module spimemio (
- input clk, resetn,
-
- input valid,
- output ready,
- input [23:0] addr,
- output reg [31:0] rdata,
-
- output flash_csb,
- output flash_clk,
-
- output flash_csb_oeb,
- output flash_clk_oeb,
-
- output flash_io0_oeb,
- output flash_io1_oeb,
- output flash_io2_oeb,
- output flash_io3_oeb,
-
- output flash_csb_ieb,
- output flash_clk_ieb,
-
- output flash_io0_ieb,
- output flash_io1_ieb,
- output flash_io2_ieb,
- output flash_io3_ieb,
-
- output flash_io0_do,
- output flash_io1_do,
- output flash_io2_do,
- output flash_io3_do,
-
- input flash_io0_di,
- input flash_io1_di,
- input flash_io2_di,
- input flash_io3_di,
-
- input [3:0] cfgreg_we,
- input [31:0] cfgreg_di,
- output [31:0] cfgreg_do,
-
- output quad_mode,
-
- input pass_thru,
- input pass_thru_csb,
- input pass_thru_sck,
- input pass_thru_sdi,
- output pass_thru_sdo
-);
- reg xfer_resetn;
- reg din_valid;
- wire din_ready;
- reg [7:0] din_data;
- reg [3:0] din_tag;
- reg din_cont;
- reg din_qspi;
- reg din_ddr;
- reg din_rd;
-
- wire dout_valid;
- wire [7:0] dout_data;
- wire [3:0] dout_tag;
- wire quad_mode;
-
- reg [23:0] buffer;
-
- reg [23:0] rd_addr;
- reg rd_valid;
- reg rd_wait;
- reg rd_inc;
-
- assign ready = valid && (addr == rd_addr) && rd_valid;
- wire jump = valid && !ready && (addr != rd_addr+4) && rd_valid;
-
- reg softreset;
-
- reg config_en; // cfgreg[31]
- reg config_ddr; // cfgreg[22]
- reg config_qspi; // cfgreg[21]
- reg config_cont; // cfgreg[20]
- reg [3:0] config_dummy; // cfgreg[19:16]
- reg [3:0] config_oe; // cfgreg[11:8]
- reg config_csb; // cfgreg[5]
- reg config_clk; // cfgref[4]
- reg [3:0] config_do; // cfgreg[3:0]
-
- assign cfgreg_do[31] = config_en;
- assign cfgreg_do[30:23] = 0;
- assign cfgreg_do[22] = config_ddr;
- assign cfgreg_do[21] = config_qspi;
- assign cfgreg_do[20] = config_cont;
- assign cfgreg_do[19:16] = config_dummy;
- assign cfgreg_do[15:12] = 0;
- assign cfgreg_do[11:8] = {~flash_io3_oeb, ~flash_io2_oeb, ~flash_io1_oeb, ~flash_io0_oeb};
- assign cfgreg_do[7:6] = 0;
- assign cfgreg_do[5] = flash_csb;
- assign cfgreg_do[4] = flash_clk;
- assign cfgreg_do[3:0] = {flash_io3_di, flash_io2_di, flash_io1_di, flash_io0_di};
-
- always @(posedge clk) begin
- softreset <= !config_en || cfgreg_we;
- if (!resetn) begin
- softreset <= 1;
- config_en <= 1;
- config_csb <= 0;
- config_clk <= 0;
- config_oe <= 0;
- config_do <= 0;
- config_ddr <= 0;
- config_qspi <= 0;
- config_cont <= 0;
- config_dummy <= 8;
- end else begin
- if (cfgreg_we[0]) begin
- config_csb <= cfgreg_di[5];
- config_clk <= cfgreg_di[4];
- config_do <= cfgreg_di[3:0];
- end
- if (cfgreg_we[1]) begin
- config_oe <= cfgreg_di[11:8];
- end
- if (cfgreg_we[2]) begin
- config_ddr <= cfgreg_di[22];
- config_qspi <= cfgreg_di[21];
- config_cont <= cfgreg_di[20];
- config_dummy <= cfgreg_di[19:16];
- end
- if (cfgreg_we[3]) begin
- config_en <= cfgreg_di[31];
- end
- end
- end
-
- wire xfer_csb;
- wire xfer_clk;
-
- wire xfer_io0_oe;
- wire xfer_io1_oe;
- wire xfer_io2_oe;
- wire xfer_io3_oe;
-
- wire xfer_io0_do;
- wire xfer_io1_do;
- wire xfer_io2_do;
- wire xfer_io3_do;
-
- reg xfer_io0_90;
- reg xfer_io1_90;
- reg xfer_io2_90;
- reg xfer_io3_90;
-
- always @(negedge clk) begin
- xfer_io0_90 <= xfer_io0_do;
- xfer_io1_90 <= xfer_io1_do;
- xfer_io2_90 <= xfer_io2_do;
- xfer_io3_90 <= xfer_io3_do;
- end
-
- wire pass_thru;
- wire pass_thru_csb;
- wire pass_thru_sck;
- wire pass_thru_sdi;
- wire pass_thru_sdo;
-
- assign quad_mode = config_qspi;
-
- assign flash_csb = (pass_thru) ? pass_thru_csb : (config_en ? xfer_csb : config_csb);
- assign flash_clk = (pass_thru) ? pass_thru_sck : (config_en ? xfer_clk : config_clk);
-
- assign flash_csb_oeb = (pass_thru) ? 1'b0 : (~resetn ? 1'b1 : 1'b0);
- assign flash_clk_oeb = (pass_thru) ? 1'b0 : (~resetn ? 1'b1 : 1'b0);
-
- assign flash_io0_oeb = pass_thru ? 1'b0 : ~resetn ? 1'b1 : (config_en ? ~xfer_io0_oe : ~config_oe[0]);
- assign flash_io1_oeb = (pass_thru | ~resetn) ? 1'b1 : (config_en ? ~xfer_io1_oe : ~config_oe[1]);
- assign flash_io2_oeb = (pass_thru | ~resetn) ? 1'b1 : (config_en ? ~xfer_io2_oe : ~config_oe[2]);
- assign flash_io3_oeb = (pass_thru | ~resetn) ? 1'b1 : (config_en ? ~xfer_io3_oe : ~config_oe[3]);
- assign flash_csb_ieb = 1'b1; /* Always disabled */
- assign flash_clk_ieb = 1'b1; /* Always disabled */
-
- assign flash_io0_ieb = (pass_thru | ~resetn) ? 1'b1 : (config_en ? xfer_io0_oe : config_oe[0]);
- assign flash_io1_ieb = pass_thru ? 1'b0 : ~resetn ? 1'b1 : (config_en ? xfer_io1_oe : config_oe[1]);
- assign flash_io2_ieb = (pass_thru | ~resetn) ? 1'b1 : (config_en ? xfer_io2_oe : config_oe[2]);
- assign flash_io3_ieb = (pass_thru | ~resetn) ? 1'b1 : (config_en ? xfer_io3_oe : config_oe[3]);
-
- assign flash_io0_do = pass_thru ? pass_thru_sdi : (config_en ? (config_ddr ? xfer_io0_90 : xfer_io0_do) : config_do[0]);
- assign flash_io1_do = config_en ? (config_ddr ? xfer_io1_90 : xfer_io1_do) : config_do[1];
- assign flash_io2_do = config_en ? (config_ddr ? xfer_io2_90 : xfer_io2_do) : config_do[2];
- assign flash_io3_do = config_en ? (config_ddr ? xfer_io3_90 : xfer_io3_do) : config_do[3];
- assign pass_thru_sdo = pass_thru ? flash_io1_di : 1'b0;
-
- wire xfer_dspi = din_ddr && !din_qspi;
- wire xfer_ddr = din_ddr && din_qspi;
-
- spimemio_xfer xfer (
- .clk (clk ),
- .resetn (resetn ),
- .xfer_resetn (xfer_resetn ),
- .din_valid (din_valid ),
- .din_ready (din_ready ),
- .din_data (din_data ),
- .din_tag (din_tag ),
- .din_cont (din_cont ),
- .din_dspi (xfer_dspi ),
- .din_qspi (din_qspi ),
- .din_ddr (xfer_ddr ),
- .din_rd (din_rd ),
- .dout_valid (dout_valid ),
- .dout_data (dout_data ),
- .dout_tag (dout_tag ),
- .flash_csb (xfer_csb ),
- .flash_clk (xfer_clk ),
- .flash_io0_oe (xfer_io0_oe ),
- .flash_io1_oe (xfer_io1_oe ),
- .flash_io2_oe (xfer_io2_oe ),
- .flash_io3_oe (xfer_io3_oe ),
- .flash_io0_do (xfer_io0_do ),
- .flash_io1_do (xfer_io1_do ),
- .flash_io2_do (xfer_io2_do ),
- .flash_io3_do (xfer_io3_do ),
- .flash_io0_di (flash_io0_di),
- .flash_io1_di (flash_io1_di),
- .flash_io2_di (flash_io2_di),
- .flash_io3_di (flash_io3_di)
- );
-
- reg [3:0] state;
-
- always @(posedge clk) begin
- xfer_resetn <= 1;
- din_valid <= 0;
-
- if (!resetn || softreset) begin
- state <= 0;
- xfer_resetn <= 0;
- rd_valid <= 0;
- din_tag <= 0;
- din_cont <= 0;
- din_qspi <= 0;
- din_ddr <= 0;
- din_rd <= 0;
- end else begin
- if (dout_valid && dout_tag == 1) buffer[ 7: 0] <= dout_data;
- if (dout_valid && dout_tag == 2) buffer[15: 8] <= dout_data;
- if (dout_valid && dout_tag == 3) buffer[23:16] <= dout_data;
- if (dout_valid && dout_tag == 4) begin
- rdata <= {dout_data, buffer};
- rd_addr <= rd_inc ? rd_addr + 4 : addr;
- rd_valid <= 1;
- rd_wait <= rd_inc;
- rd_inc <= 1;
- end
-
- if (valid)
- rd_wait <= 0;
-
- case (state)
- 0: begin
- din_valid <= 1;
- din_data <= 8'h ff;
- din_tag <= 0;
- if (din_ready) begin
- din_valid <= 0;
- state <= 1;
- end
- end
- 1: begin
- if (dout_valid) begin
- xfer_resetn <= 0;
- state <= 2;
- end
- end
- 2: begin
- din_valid <= 1;
- din_data <= 8'h ab;
- din_tag <= 0;
- if (din_ready) begin
- din_valid <= 0;
- state <= 3;
- end
- end
- 3: begin
- if (dout_valid) begin
- xfer_resetn <= 0;
- state <= 4;
- end
- end
- 4: begin
- rd_inc <= 0;
- din_valid <= 1;
- din_tag <= 0;
- case ({config_ddr, config_qspi})
- 2'b11: din_data <= 8'h ED;
- 2'b01: din_data <= 8'h EB;
- 2'b10: din_data <= 8'h BB;
- 2'b00: din_data <= 8'h 03;
- endcase
- if (din_ready) begin
- din_valid <= 0;
- state <= 5;
- end
- end
- 5: begin
- if (valid && !ready) begin
- din_valid <= 1;
- din_tag <= 0;
- din_data <= addr[23:16];
- din_qspi <= config_qspi;
- din_ddr <= config_ddr;
- if (din_ready) begin
- din_valid <= 0;
- state <= 6;
- end
- end
- end
- 6: begin
- din_valid <= 1;
- din_tag <= 0;
- din_data <= addr[15:8];
- if (din_ready) begin
- din_valid <= 0;
- state <= 7;
- end
- end
- 7: begin
- din_valid <= 1;
- din_tag <= 0;
- din_data <= addr[7:0];
- if (din_ready) begin
- din_valid <= 0;
- din_data <= 0;
- state <= config_qspi || config_ddr ? 8 : 9;
- end
- end
- 8: begin
- din_valid <= 1;
- din_tag <= 0;
- din_data <= config_cont ? 8'h A5 : 8'h FF;
- if (din_ready) begin
- din_rd <= 1;
- din_data <= config_dummy;
- din_valid <= 0;
- state <= 9;
- end
- end
- 9: begin
- din_valid <= 1;
- din_tag <= 1;
- if (din_ready) begin
- din_valid <= 0;
- state <= 10;
- end
- end
- 10: begin
- din_valid <= 1;
- din_data <= 8'h 00;
- din_tag <= 2;
- if (din_ready) begin
- din_valid <= 0;
- state <= 11;
- end
- end
- 11: begin
- din_valid <= 1;
- din_tag <= 3;
- if (din_ready) begin
- din_valid <= 0;
- state <= 12;
- end
- end
- 12: begin
- if (!rd_wait || valid) begin
- din_valid <= 1;
- din_tag <= 4;
- if (din_ready) begin
- din_valid <= 0;
- state <= 9;
- end
- end
- end
- endcase
-
- if (jump) begin
- rd_inc <= 0;
- rd_valid <= 0;
- xfer_resetn <= 0;
- if (config_cont) begin
- state <= 5;
- end else begin
- state <= 4;
- din_qspi <= 0;
- din_ddr <= 0;
- end
- din_rd <= 0;
- end
- end
- end
-endmodule
-
-module spimemio_xfer (
- input clk, resetn, xfer_resetn,
-
- input din_valid,
- output din_ready,
- input [7:0] din_data,
- input [3:0] din_tag,
- input din_cont,
- input din_dspi,
- input din_qspi,
- input din_ddr,
- input din_rd,
-
- output dout_valid,
- output [7:0] dout_data,
- output [3:0] dout_tag,
-
- output reg flash_csb,
- output reg flash_clk,
-
- output reg flash_io0_oe,
- output reg flash_io1_oe,
- output reg flash_io2_oe,
- output reg flash_io3_oe,
-
- output reg flash_io0_do,
- output reg flash_io1_do,
- output reg flash_io2_do,
- output reg flash_io3_do,
-
- input flash_io0_di,
- input flash_io1_di,
- input flash_io2_di,
- input flash_io3_di
-);
- reg [7:0] obuffer;
- reg [7:0] ibuffer;
-
- reg [3:0] count;
- reg [3:0] dummy_count;
-
- reg xfer_cont;
- reg xfer_dspi;
- reg xfer_qspi;
- reg xfer_ddr;
- reg xfer_ddr_q;
- reg xfer_rd;
- reg [3:0] xfer_tag;
- reg [3:0] xfer_tag_q;
-
- reg [7:0] next_obuffer;
- reg [7:0] next_ibuffer;
- reg [3:0] next_count;
-
- reg fetch;
- reg next_fetch;
- reg last_fetch;
-
- always @(posedge clk) begin
- xfer_ddr_q <= xfer_ddr;
- xfer_tag_q <= xfer_tag;
- end
-
- assign din_ready = din_valid && xfer_resetn && next_fetch;
-
- assign dout_valid = (xfer_ddr_q ? fetch && !last_fetch : next_fetch && !fetch) && xfer_resetn;
- assign dout_data = ibuffer;
- assign dout_tag = xfer_tag_q;
-
- always @* begin
- flash_io0_oe = 0;
- flash_io1_oe = 0;
- flash_io2_oe = 0;
- flash_io3_oe = 0;
-
- flash_io0_do = 0;
- flash_io1_do = 0;
- flash_io2_do = 0;
- flash_io3_do = 0;
-
- next_obuffer = obuffer;
- next_ibuffer = ibuffer;
- next_count = count;
- next_fetch = 0;
-
- if (dummy_count == 0) begin
- casez ({xfer_ddr, xfer_qspi, xfer_dspi})
- 3'b 000: begin
- flash_io0_oe = 1;
- flash_io0_do = obuffer[7];
-
- if (flash_clk) begin
- next_obuffer = {obuffer[6:0], 1'b 0};
- next_count = count - |count;
- end else begin
- next_ibuffer = {ibuffer[6:0], flash_io1_di};
- end
-
- next_fetch = (next_count == 0);
- end
- 3'b 01?: begin
- flash_io0_oe = !xfer_rd;
- flash_io1_oe = !xfer_rd;
- flash_io2_oe = !xfer_rd;
- flash_io3_oe = !xfer_rd;
-
- flash_io0_do = obuffer[4];
- flash_io1_do = obuffer[5];
- flash_io2_do = obuffer[6];
- flash_io3_do = obuffer[7];
-
- if (flash_clk) begin
- next_obuffer = {obuffer[3:0], 4'b 0000};
- next_count = count - {|count, 2'b00};
- end else begin
- next_ibuffer = {ibuffer[3:0], flash_io3_di, flash_io2_di, flash_io1_di, flash_io0_di};
- end
-
- next_fetch = (next_count == 0);
- end
- 3'b 11?: begin
- flash_io0_oe = !xfer_rd;
- flash_io1_oe = !xfer_rd;
- flash_io2_oe = !xfer_rd;
- flash_io3_oe = !xfer_rd;
-
- flash_io0_do = obuffer[4];
- flash_io1_do = obuffer[5];
- flash_io2_do = obuffer[6];
- flash_io3_do = obuffer[7];
-
- next_obuffer = {obuffer[3:0], 4'b 0000};
- next_ibuffer = {ibuffer[3:0], flash_io3_di, flash_io2_di, flash_io1_di, flash_io0_di};
- next_count = count - {|count, 2'b00};
-
- next_fetch = (next_count == 0);
- end
- 3'b ??1: begin
- flash_io0_oe = !xfer_rd;
- flash_io1_oe = !xfer_rd;
-
- flash_io0_do = obuffer[6];
- flash_io1_do = obuffer[7];
-
- if (flash_clk) begin
- next_obuffer = {obuffer[5:0], 2'b 00};
- next_count = count - {|count, 1'b0};
- end else begin
- next_ibuffer = {ibuffer[5:0], flash_io1_di, flash_io0_di};
- end
-
- next_fetch = (next_count == 0);
- end
- endcase
- end
- end
-
- always @(posedge clk) begin
- if (!resetn || !xfer_resetn) begin
- fetch <= 1;
- last_fetch <= 1;
- flash_csb <= 1;
- flash_clk <= 0;
- count <= 0;
- dummy_count <= 0;
- xfer_tag <= 0;
- xfer_cont <= 0;
- xfer_dspi <= 0;
- xfer_qspi <= 0;
- xfer_ddr <= 0;
- xfer_rd <= 0;
- end else begin
- fetch <= next_fetch;
- last_fetch <= xfer_ddr ? fetch : 1;
- if (dummy_count) begin
- flash_clk <= !flash_clk && !flash_csb;
- dummy_count <= dummy_count - flash_clk;
- end else
- if (count) begin
- flash_clk <= !flash_clk && !flash_csb;
- obuffer <= next_obuffer;
- ibuffer <= next_ibuffer;
- count <= next_count;
- end
- if (din_valid && din_ready) begin
- flash_csb <= 0;
- flash_clk <= 0;
-
- count <= 8;
- dummy_count <= din_rd ? din_data : 0;
- obuffer <= din_data;
-
- xfer_tag <= din_tag;
- xfer_cont <= din_cont;
- xfer_dspi <= din_dspi;
- xfer_qspi <= din_qspi;
- xfer_ddr <= din_ddr;
- xfer_rd <= din_rd;
- end
- end
- end
-endmodule
-
-`default_nettype wire
diff --git a/caravel/rtl/sram_1rw1r_32_256_8_sky130.v b/caravel/rtl/sram_1rw1r_32_256_8_sky130.v
deleted file mode 100644
index cd7cc59..0000000
--- a/caravel/rtl/sram_1rw1r_32_256_8_sky130.v
+++ /dev/null
@@ -1,133 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-// OpenRAM SRAM model
-// Words: 256
-// Word size: 32
-// Write size: 8
-
-module sram_1rw1r_32_256_8_sky130(
-`ifdef USE_POWER_PINS
- vdd,
- gnd,
-`endif
-// Port 0: RW
- clk0,csb0,web0,wmask0,addr0,din0,dout0,
-// Port 1: R
- clk1,csb1,addr1,dout1
- );
-
- parameter NUM_WMASKS = 4 ;
- parameter DATA_WIDTH = 32 ;
- parameter ADDR_WIDTH = 8 ;
- parameter RAM_DEPTH = 1 << ADDR_WIDTH;
- // FIXME: This delay is arbitrary.
- parameter DELAY = 3 ;
-
-`ifdef USE_POWER_PINS
- inout vdd;
- inout gnd;
-`endif
- input clk0; // clock
- input csb0; // active low chip select
- input web0; // active low write control
- input [NUM_WMASKS-1:0] wmask0; // write mask
- input [ADDR_WIDTH-1:0] addr0;
- input [DATA_WIDTH-1:0] din0;
- output [DATA_WIDTH-1:0] dout0;
- input clk1; // clock
- input csb1; // active low chip select
- input [ADDR_WIDTH-1:0] addr1;
- output [DATA_WIDTH-1:0] dout1;
-
- reg csb0_reg;
- reg web0_reg;
- reg [NUM_WMASKS-1:0] wmask0_reg;
- reg [ADDR_WIDTH-1:0] addr0_reg;
- reg [DATA_WIDTH-1:0] din0_reg;
- reg [DATA_WIDTH-1:0] dout0;
-
- // All inputs are registers
- always @(posedge clk0)
- begin
- csb0_reg = csb0;
- web0_reg = web0;
- wmask0_reg = wmask0;
- addr0_reg = addr0;
- din0_reg = din0;
- dout0 = #(DELAY) 32'bx;
-`ifdef DBG
- if ( !csb0_reg && web0_reg )
- $display($time," Reading %m addr0=%b dout0=%b",addr0_reg,mem[addr0_reg]);
- if ( !csb0_reg && !web0_reg )
- $display($time," Writing %m addr0=%b din0=%b wmask0=%b",addr0_reg,din0_reg,wmask0_reg);
-`endif
- end
-
- reg csb1_reg;
- reg [ADDR_WIDTH-1:0] addr1_reg;
- reg [DATA_WIDTH-1:0] dout1;
-
- // All inputs are registers
- always @(posedge clk1)
- begin
- csb1_reg = csb1;
- addr1_reg = addr1;
-`ifdef DBG
- if (!csb0 && !web0 && !csb1 && (addr0 == addr1))
- $display($time," WARNING: Writing and reading addr0=%b and addr1=%b simultaneously!",addr0,addr1);
- dout1 = 32'bx;
- if ( !csb1_reg )
- $display($time," Reading %m addr1=%b dout1=%b",addr1_reg,mem[addr1_reg]);
-`endif
- end
-
-reg [DATA_WIDTH-1:0] mem [0:RAM_DEPTH-1];
-
- // Memory Write Block Port 0
- // Write Operation : When web0 = 0, csb0 = 0
- always @ (negedge clk0)
- begin : MEM_WRITE0
- if ( !csb0_reg && !web0_reg ) begin
- if (wmask0_reg[0])
- mem[addr0_reg][7:0] = din0_reg[7:0];
- if (wmask0_reg[1])
- mem[addr0_reg][15:8] = din0_reg[15:8];
- if (wmask0_reg[2])
- mem[addr0_reg][23:16] = din0_reg[23:16];
- if (wmask0_reg[3])
- mem[addr0_reg][31:24] = din0_reg[31:24];
- end
- end
-
- // Memory Read Block Port 0
- // Read Operation : When web0 = 1, csb0 = 0
- always @ (negedge clk0)
- begin : MEM_READ0
- if (!csb0_reg && web0_reg)
- dout0 <= #(DELAY) mem[addr0_reg];
- end
-
- // Memory Read Block Port 1
- // Read Operation : When web1 = 1, csb1 = 0
- always @ (negedge clk1)
- begin : MEM_READ1
- if (!csb1_reg)
- dout1 <= #(DELAY) mem[addr1_reg];
- end
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/storage.v b/caravel/rtl/storage.v
deleted file mode 100644
index a3c1b14..0000000
--- a/caravel/rtl/storage.v
+++ /dev/null
@@ -1,107 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-
-module storage (
-`ifdef USE_POWER_PINS
- input wire VPWR,
- input wire VGND,
-`endif
- // MGMT_AREA R/W Interface
- input mgmt_clk,
- input [`RAM_BLOCKS-1:0] mgmt_ena,
- input [`RAM_BLOCKS-1:0] mgmt_wen, // not shared
- input [(`RAM_BLOCKS*4)-1:0] mgmt_wen_mask, // not shared
- input [7:0] mgmt_addr,
- input [31:0] mgmt_wdata,
- output [(`RAM_BLOCKS*32)-1:0] mgmt_rdata,
-
- // MGMT_AREA RO Interface
- input mgmt_ena_ro,
- input [7:0] mgmt_addr_ro,
- output [31:0] mgmt_rdata_ro
-);
-
- // Add buf_4 -> 2x buf_8 to suuply clock to each block.
- wire mgmt_clk_buf;
- sky130_fd_sc_hd__buf_4 BUF_4 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .A(mgmt_clk),
- .X(mgmt_clk_buf)
- );
-
- wire mgmt_clk_sram0;
- sky130_fd_sc_hd__buf_8 BUF0_8 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .A(mgmt_clk_buf),
- .X(mgmt_clk_sram0)
- );
-
- wire mgmt_clk_sram1;
- sky130_fd_sc_hd__buf_8 BUF1_8 (
- `ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VGND(VGND),
- .VPB(VPWR),
- .VNB(VGND),
- `endif
- .A(mgmt_clk_buf),
- .X(mgmt_clk_sram1)
- );
-
- sram_1rw1r_32_256_8_sky130 SRAM_0 (
- // MGMT R/W port
- .clk0(mgmt_clk_sram0),
- .csb0(mgmt_ena[0]),
- .web0(mgmt_wen[0]),
- .wmask0(mgmt_wen_mask[3:0]),
- .addr0(mgmt_addr),
- .din0(mgmt_wdata),
- .dout0(mgmt_rdata[31:0]),
- // MGMT RO port
- .clk1(mgmt_clk_sram0),
- .csb1(mgmt_ena_ro),
- .addr1(mgmt_addr_ro),
- .dout1(mgmt_rdata_ro)
- );
-
- sram_1rw1r_32_256_8_sky130 SRAM_1 (
- // MGMT R/W port
- .clk0(mgmt_clk_sram1),
- .csb0(mgmt_ena[1]),
- .web0(mgmt_wen[1]),
- .wmask0(mgmt_wen_mask[7:4]),
- .addr0(mgmt_addr),
- .din0(mgmt_wdata),
- .dout0(mgmt_rdata[63:32]),
- .clk1(1'b0),
- .csb1(1'b1),
- .addr1(8'b0),
- .dout1()
- );
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/storage_bridge_wb.v b/caravel/rtl/storage_bridge_wb.v
deleted file mode 100644
index 0f24321..0000000
--- a/caravel/rtl/storage_bridge_wb.v
+++ /dev/null
@@ -1,112 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-module storage_bridge_wb (
- // MGMT_AREA R/W WB Interface
- input wb_clk_i,
- input wb_rst_i,
-
- input [31:0] wb_adr_i,
- input [31:0] wb_dat_i,
- input [3:0] wb_sel_i,
- input wb_we_i,
- input wb_cyc_i,
- input [1:0] wb_stb_i,
- output reg [1:0] wb_ack_o,
- output reg [31:0] wb_rw_dat_o,
-
- // MGMT_AREA RO WB Interface
- output [31:0] wb_ro_dat_o,
-
- // MGMT Area native memory interface
- output [`RAM_BLOCKS-1:0] mgmt_ena,
- output [(`RAM_BLOCKS*4)-1:0] mgmt_wen_mask,
- output [`RAM_BLOCKS-1:0] mgmt_wen,
- output [7:0] mgmt_addr,
- output [31:0] mgmt_wdata,
- input [(`RAM_BLOCKS*32)-1:0] mgmt_rdata,
-
- // MGMT_AREA RO Interface
- output mgmt_ena_ro,
- output [7:0] mgmt_addr_ro,
- input [31:0] mgmt_rdata_ro
-);
- parameter [(`RAM_BLOCKS*24)-1:0] RW_BLOCKS_ADR = {
- {24'h 10_0000},
- {24'h 00_0000}
- };
-
- parameter [23:0] RO_BLOCKS_ADR = {
- {24'h 20_0000}
- };
-
- parameter ADR_MASK = 24'h FF_0000;
-
- wire [1:0] valid;
- wire [1:0] wen;
- wire [7:0] wen_mask;
-
- assign valid = {2{wb_cyc_i}} & wb_stb_i;
- assign wen = wb_we_i & valid;
- assign wen_mask = wb_sel_i & {{4{wen[1]}}, {4{wen[0]}}};
-
- // Ack generation
- reg [1:0] wb_ack_read;
-
- always @(posedge wb_clk_i) begin
- if (wb_rst_i == 1'b 1) begin
- wb_ack_read <= 2'b0;
- wb_ack_o <= 2'b0;
- end else begin
- wb_ack_o <= wb_we_i? (valid & ~wb_ack_o): wb_ack_read;
- wb_ack_read <= (valid & ~wb_ack_o) & ~wb_ack_read;
- end
- end
-
- // Address decoding
- wire [`RAM_BLOCKS-1: 0] rw_sel;
- wire ro_sel;
-
- genvar iS;
- generate
- for (iS = 0; iS < `RAM_BLOCKS; iS = iS + 1) begin
- assign rw_sel[iS] =
- ((wb_adr_i[23:0] & ADR_MASK) == RW_BLOCKS_ADR[(iS+1)*24-1:iS*24]);
- end
- endgenerate
-
- // Management R/W interface
- assign mgmt_ena = valid[0] ? ~rw_sel : {`RAM_BLOCKS{1'b1}};
- assign mgmt_wen = ~{`RAM_BLOCKS{wen[0]}};
- assign mgmt_wen_mask = {`RAM_BLOCKS{wen_mask[3:0]}};
- assign mgmt_addr = wb_adr_i[9:2];
- assign mgmt_wdata = wb_dat_i[31:0];
-
- integer i;
- always @(*) begin
- wb_rw_dat_o = {32{1'b0}};
- for (i=0; i<(`RAM_BLOCKS*32); i=i+1)
- wb_rw_dat_o[i%32] = wb_rw_dat_o[i%32] | (rw_sel[i/32] & mgmt_rdata[i]);
- end
-
- // RO Interface
- assign ro_sel = ((wb_adr_i[23:0] & ADR_MASK) == RO_BLOCKS_ADR);
- assign mgmt_ena_ro = valid[1] ? ~ro_sel : 1'b1;
- assign mgmt_addr_ro = wb_adr_i[9:2];
- assign wb_ro_dat_o = mgmt_rdata_ro;
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/sysctrl.v b/caravel/rtl/sysctrl.v
deleted file mode 100644
index c18979e..0000000
--- a/caravel/rtl/sysctrl.v
+++ /dev/null
@@ -1,180 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-module sysctrl_wb #(
- parameter BASE_ADR = 32'h2F00_0000,
- parameter PWRGOOD = 8'h00,
- parameter CLK_OUT = 8'h04,
- parameter TRAP_OUT = 8'h08,
- parameter IRQ_SRC = 8'h0c
-) (
- input wb_clk_i,
- input wb_rst_i,
-
- input [31:0] wb_dat_i,
- input [31:0] wb_adr_i,
- input [3:0] wb_sel_i,
- input wb_cyc_i,
- input wb_stb_i,
- input wb_we_i,
-
- output [31:0] wb_dat_o,
- output wb_ack_o,
-
- input usr1_vcc_pwrgood,
- input usr2_vcc_pwrgood,
- input usr1_vdd_pwrgood,
- input usr2_vdd_pwrgood,
- output clk1_output_dest,
- output clk2_output_dest,
- output trap_output_dest,
- output irq_7_inputsrc,
- output irq_8_inputsrc
-
-);
-
- wire resetn;
- wire valid;
- wire ready;
- wire [3:0] iomem_we;
-
- assign resetn = ~wb_rst_i;
- assign valid = wb_stb_i && wb_cyc_i;
-
- assign iomem_we = wb_sel_i & {4{wb_we_i}};
- assign wb_ack_o = ready;
-
- sysctrl #(
- .BASE_ADR(BASE_ADR),
- .PWRGOOD(PWRGOOD),
- .CLK_OUT(CLK_OUT),
- .TRAP_OUT(TRAP_OUT),
- .IRQ_SRC(IRQ_SRC)
- ) sysctrl (
- .clk(wb_clk_i),
- .resetn(resetn),
-
- .iomem_addr(wb_adr_i),
- .iomem_valid(valid),
- .iomem_wstrb(iomem_we),
- .iomem_wdata(wb_dat_i),
- .iomem_rdata(wb_dat_o),
- .iomem_ready(ready),
-
- .usr1_vcc_pwrgood(usr1_vcc_pwrgood),
- .usr2_vcc_pwrgood(usr2_vcc_pwrgood),
- .usr1_vdd_pwrgood(usr1_vdd_pwrgood),
- .usr2_vdd_pwrgood(usr2_vdd_pwrgood),
- .clk1_output_dest(clk1_output_dest),
- .clk2_output_dest(clk2_output_dest),
- .trap_output_dest(trap_output_dest),
- .irq_8_inputsrc(irq_8_inputsrc),
- .irq_7_inputsrc(irq_7_inputsrc)
- );
-
-endmodule
-
-module sysctrl #(
- parameter BASE_ADR = 32'h2300_0000,
- parameter PWRGOOD = 8'h00,
- parameter CLK_OUT = 8'h04,
- parameter TRAP_OUT = 8'h08,
- parameter IRQ_SRC = 8'h0c
-) (
- input clk,
- input resetn,
-
- input [31:0] iomem_addr,
- input iomem_valid,
- input [3:0] iomem_wstrb,
- input [31:0] iomem_wdata,
- output reg [31:0] iomem_rdata,
- output reg iomem_ready,
-
- input usr1_vcc_pwrgood,
- input usr2_vcc_pwrgood,
- input usr1_vdd_pwrgood,
- input usr2_vdd_pwrgood,
- output clk1_output_dest,
- output clk2_output_dest,
- output trap_output_dest,
- output irq_7_inputsrc,
- output irq_8_inputsrc
-);
-
- reg clk1_output_dest;
- reg clk2_output_dest;
- reg trap_output_dest;
- reg irq_7_inputsrc;
- reg irq_8_inputsrc;
-
- wire usr1_vcc_pwrgood;
- wire usr2_vcc_pwrgood;
- wire usr1_vdd_pwrgood;
- wire usr2_vdd_pwrgood;
-
- wire pwrgood_sel;
- wire clk_out_sel;
- wire trap_out_sel;
- wire irq_sel;
-
- assign pwrgood_sel = (iomem_addr[7:0] == PWRGOOD);
- assign clk_out_sel = (iomem_addr[7:0] == CLK_OUT);
- assign trap_out_sel = (iomem_addr[7:0] == TRAP_OUT);
- assign irq_sel = (iomem_addr[7:0] == IRQ_SRC);
-
- always @(posedge clk) begin
- if (!resetn) begin
- clk1_output_dest <= 0;
- clk2_output_dest <= 0;
- trap_output_dest <= 0;
- irq_7_inputsrc <= 0;
- irq_8_inputsrc <= 0;
- end else begin
- iomem_ready <= 0;
- if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
- iomem_ready <= 1'b 1;
-
- if (pwrgood_sel) begin
- iomem_rdata <= {28'd0, usr2_vdd_pwrgood, usr1_vdd_pwrgood,
- usr2_vcc_pwrgood, usr1_vcc_pwrgood};
- // These are read-only bits; no write behavior on wstrb.
-
- end else if (clk_out_sel) begin
- iomem_rdata <= {30'd0, clk2_output_dest, clk1_output_dest};
- if (iomem_wstrb[0]) begin
- clk1_output_dest <= iomem_wdata[0];
- clk2_output_dest <= iomem_wdata[1];
- end
-
- end else if (trap_out_sel) begin
- iomem_rdata <= {31'd0, trap_output_dest};
- if (iomem_wstrb[0])
- trap_output_dest <= iomem_wdata[0];
-
- end else if (irq_sel) begin
- iomem_rdata <= {30'd0, irq_8_inputsrc, irq_7_inputsrc};
- if (iomem_wstrb[0]) begin
- irq_7_inputsrc <= iomem_wdata[0];
- irq_8_inputsrc <= iomem_wdata[1];
- end
- end
- end
- end
- end
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/user_id_programming.v b/caravel/rtl/user_id_programming.v
deleted file mode 100644
index 873bbce..0000000
--- a/caravel/rtl/user_id_programming.v
+++ /dev/null
@@ -1,57 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-// This module represents an unprogrammed mask revision
-// block that is configured with via programming on the
-// chip top level. This value is passed to the block as
-// a parameter
-
-module user_id_programming #(
- parameter [ 0:0] USER_PROJECT_ID = 32'h0
-) (
-`ifdef USE_POWER_PINS
- inout VPWR,
- inout VGND,
-`endif
- output [31:0] mask_rev
-);
- wire [31:0] mask_rev;
- wire [31:0] user_proj_id_high;
- wire [31:0] user_proj_id_low;
-
- // For the mask revision input, use an array of digital constant logic cells
-
- sky130_fd_sc_hd__conb_1 mask_rev_value [31:0] (
-`ifdef USE_POWER_PINS
- .VPWR(VPWR),
- .VPB(VPWR),
- .VNB(VGND),
- .VGND(VGND),
-`endif
- .HI(user_proj_id_high),
- .LO(user_proj_id_low)
- );
-
- genvar i;
- generate
- for (i = 0; i < 32; i = i+1) begin
- assign mask_rev[i] = (USER_PROJECT_ID & (32'h01 << i)) ?
- user_proj_id_high[i] : user_proj_id_low[i];
- end
- endgenerate
-
-endmodule
-`default_nettype wire
diff --git a/caravel/rtl/wb_intercon.v b/caravel/rtl/wb_intercon.v
deleted file mode 100644
index 7ebce83..0000000
--- a/caravel/rtl/wb_intercon.v
+++ /dev/null
@@ -1,74 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-module wb_intercon #(
- parameter DW = 32, // Data Width
- parameter AW = 32, // Address Width
- parameter NS = 6 // Number of Slaves
-) (
- // Master Interface
- input [AW-1:0] wbm_adr_i,
- input wbm_stb_i,
-
- output reg [DW-1:0] wbm_dat_o,
- output wbm_ack_o,
-
- // Slave Interface
- input [NS*DW-1:0] wbs_dat_i,
- input [NS-1:0] wbs_ack_i,
- output [NS-1:0] wbs_stb_o
-);
- parameter [NS*AW-1:0] ADR_MASK = { // Page & Sub-page bits
- {8'hFF, {24{1'b0}} },
- {8'hFF, {24{1'b0}} },
- {8'hFF, {24{1'b0}} },
- {8'hFF, {24{1'b0}} },
- {8'hFF, {24{1'b0}} },
- {8'hFF, {24{1'b0}} }
- };
- parameter [NS*AW-1:0] SLAVE_ADR = {
- { 32'h2800_0000 }, // Flash Configuration Register
- { 32'h2200_0000 }, // System Control
- { 32'h2100_0000 }, // GPIOs
- { 32'h2000_0000 }, // UART
- { 32'h1000_0000 }, // Flash
- { 32'h0000_0000 } // RAM
- };
-
- wire [NS-1: 0] slave_sel;
-
- // Address decoder
- genvar iS;
- generate
- for (iS = 0; iS < NS; iS = iS + 1) begin
- assign slave_sel[iS] =
- ((wbm_adr_i & ADR_MASK[(iS+1)*AW-1:iS*AW]) == SLAVE_ADR[(iS+1)*AW-1:iS*AW]);
- end
- endgenerate
-
- // Data-out Assignment
- assign wbm_ack_o = |(wbs_ack_i & slave_sel);
- assign wbs_stb_o = {NS{wbm_stb_i}} & slave_sel;
-
- integer i;
- always @(*) begin
- wbm_dat_o = {DW{1'b0}};
- for (i=0; i<(NS*DW); i=i+1)
- wbm_dat_o[i%DW] = wbm_dat_o[i%DW] | (slave_sel[i/DW] & wbs_dat_i[i]);
- end
-
-endmodule
-`default_nettype wire