blob: 176b3be7b387b53969a101e93ff3f13cebf7176c [file] [log] [blame]
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -07001.. raw:: html
2
3 <!---
4 # SPDX-FileCopyrightText: 2020 Efabless Corporation
5 #
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 # http://www.apache.org/licenses/LICENSE-2.0
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17 #
18 # SPDX-License-Identifier: Apache-2.0
19 -->
20
21Caravel User Project
22====================
23
manarabdelatyd0e7afb2021-04-22 00:21:13 +020024|License| |User CI| |Caravel Build|
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -070025
26Table of contents
27=================
28
29- `Overview <#overview>`__
manarabdelatyd0e7afb2021-04-22 00:21:13 +020030- `Install Caravel <#install-caravel>`__
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -070031- `Caravel Integration <#caravel-integration>`__
32
33 - `Repo Integration <#repo-integration>`__
34 - `Verilog Integration <#verilog-integration>`__
35
36- `Running Full Chip Simulation <#running-full-chip-simulation>`__
37- `Hardening the User Project Macro using
38 Openlane <#hardening-the-user-project-macro-using-openlane>`__
39- `Checklist for Open-MPW
40 Submission <#checklist-for-open-mpw-submission>`__
41
42Overview
43========
44
45This repo contains a sample user project that utilizes the
46`caravel <https://github.com/efabless/caravel.git>`__ chip user space.
47The user project is a simple counter that showcases how to make use of
48`caravel's <https://github.com/efabless/caravel.git>`__ user space
49utilities like IO pads, logic analyzer probes, and wishbone port. The
50repo also demonstrates the recommended structure for the open-mpw
51shuttle projects.
52
manarabdelatyd8dd0102021-04-30 08:40:52 +020053Prerequisites
54=============
55
56- Docker
57
manarabdelatyd0e7afb2021-04-22 00:21:13 +020058Install Caravel
59===============
60
61To setup caravel, run the following:
62
63.. code:: bash
64
matt venn77f39732021-05-04 13:31:13 +020065 # If unset, CARAVEL_ROOT will be set to $(pwd)/caravel
manarabdelatyd0e7afb2021-04-22 00:21:13 +020066 # If you want to install caravel at a different location, run "export CARAVEL_ROOT=<caravel-path>"
matt venn77f39732021-05-04 13:31:13 +020067 export CARAVEL_ROOT=$(pwd)/caravel
68
manarabdelatyd0e7afb2021-04-22 00:21:13 +020069 # Disable submodule installation if needed by, run "export SUBMODULE=0"
Mohamed Kassem9ae1f072021-04-23 12:19:31 -070070
manarabdelaty0218c0f2021-04-29 18:31:49 +020071 git clone https://github.com/efabless/caravel_user_project.git
Mohamed Kassem9ae1f072021-04-23 12:19:31 -070072 cd caravel_user_project
manarabdelatyd0e7afb2021-04-22 00:21:13 +020073 make install
74
75To update the installed caravel to the latest, run:
76
77.. code:: bash
78
79 make update_caravel
80
81To remove caravel, run
82
83.. code:: bash
84
85 make uninstall
86
87By default
88`caravel-lite <https://github.com/efabless/caravel-lite.git>`__ is
89installed. To install the full version of caravel, run this prior to
90calling make install.
91
92.. code:: bash
93
94 export CARAVEL_LITE=0
95
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -070096Caravel Integration
97===================
98
99Repo Integration
100----------------
101
102Caravel files are kept separate from the user project by having caravel
manarabdelatyd0e7afb2021-04-22 00:21:13 +0200103as submodule. The submodule commit should point to the latest of
104caravel/caravel-lite master. The following files should have a symbolic
105link to `caravel's <https://github.com/efabless/caravel.git>`__
106corresponding files:
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -0700107
108- `Openlane Makefile <openlane/Makefile>`__: This provides an easier
manarabdelatyd0e7afb2021-04-22 00:21:13 +0200109 way for running openlane to harden your macros. Refer to `Hardening
110 the User Project Macro using
111 Openlane <#hardening-the-user-project-macro-using-openlane>`__. Also,
112 the makefile retains the openlane summary reports under the signoff
113 directory.
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -0700114
115- `Pin order <openlane/user_project_wrapper/pin_order.cfg>`__ file for
116 the user wrapper: The hardened user project wrapper macro must have
117 the same pin order specified in caravel's repo. Failing to adhere to
118 the same order will fail the gds integration of the macro with
119 caravel's back-end.
120
manarabdelatyd0e7afb2021-04-22 00:21:13 +0200121The symbolic links are automatically set when you run ``make install``.
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -0700122
123Verilog Integration
124-------------------
125
126You need to create a wrapper around your macro that adheres to the
127template at
128`user\_project\_wrapper <caravel/verilog/rtl/__user_project_wrapper.v>`__.
129The wrapper top module must be named ``user_project_wrapper`` and must
130have the same input and output ports. The wrapper gives access to the
131user space utilities provided by caravel like IO ports, logic analyzer
132probes, and wishbone bus connection to the management SoC.
133
134For this sample project, the user macro makes use of:
135
136- The IO ports for displaying the count register values on the IO pads.
137
138- The LA probes for supplying an optional reset and clock signals and
139 for setting an initial value for the count register.
140
matt venn4acd8b72021-04-27 11:34:42 +0200141- The wishbone port for reading/writing the count value through the
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -0700142 management SoC.
143
144Refer to `user\_project\_wrapper <verilog/rtl/user_project_wrapper.v>`__
145for more information.
146
147.. raw:: html
148
149 <p align="center">
150 <img src="./_static/counter_32.png" width="50%" height="50%">
151 </p>
manarabdelatyd0e7afb2021-04-22 00:21:13 +0200152
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -0700153.. raw:: html
154
155 </p>
156
manarabdelatyd8dd0102021-04-30 08:40:52 +0200157Building the PDK
158================
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -0700159
manarabdelatyd8dd0102021-04-30 08:40:52 +0200160You have two options for building the pdk:
manarabdelatyd0e7afb2021-04-22 00:21:13 +0200161
manarabdelatyd8dd0102021-04-30 08:40:52 +0200162- Build the pdk natively.
manarabdelatyd0e7afb2021-04-22 00:21:13 +0200163
manarabdelatyd8dd0102021-04-30 08:40:52 +0200164Make sure you have `Magic VLSI Layout Tool <http://opencircuitdesign.com/magic/index.html>`__ installed on your machine before building the pdk.
manarabdelatyd0e7afb2021-04-22 00:21:13 +0200165
166.. code:: bash
167
168 # set PDK_ROOT to the path you wish to use for the pdk
169 export PDK_ROOT=<pdk-installation-path>
170
171 # you can optionally specify skywater-pdk and open-pdks commit used
172 # by setting and exporting SKYWATER_COMMIT and OPEN_PDKS_COMMIT
173 # if you do not set them, they default to the last verfied commits tested for this project
174
175 make pdk
176
manarabdelatyd8dd0102021-04-30 08:40:52 +0200177- Build the pdk using openlane's docker image which has magic installed.
178
179.. code:: bash
180
181 # set PDK_ROOT to the path you wish to use for the pdk
182 export PDK_ROOT=<pdk-installation-path>
183
184 # you can optionally specify skywater-pdk and open-pdks commit used
185 # by setting and exporting SKYWATER_COMMIT and OPEN_PDKS_COMMIT
186 # if you do not set them, they default to the last verfied commits tested for this project
187
188 make pdk-nonnative
189
190Running Full Chip Simulation
191============================
192
193First, you will need to install the simulation environment, by
194
195.. code:: bash
196
197 make simenv
198
199This will pull a docker image with the needed tools installed.
200
manarabdelatyd0e7afb2021-04-22 00:21:13 +0200201Then, run the RTL and GL simulation by
202
203.. code:: bash
204
205 export PDK_ROOT=<pdk-installation-path>
206 export CARAVEL_ROOT=$(pwd)/caravel
207 # specify simulation mode: RTL/GL
208 export SIM=RTL
209 # Run IO ports testbench, make verify-io_ports
210 make verify-<dv-pattern>
211
212The verilog test-benches are under this directory
Manarffaf9842021-04-30 22:55:37 +0200213`verilog/dv <https://github.com/efabless/caravel_user_project/tree/main/verilog/dv>`__. For more information on setting up the
manarabdelatyd0e7afb2021-04-22 00:21:13 +0200214simulation environment and the available testbenches for this sample
Manarffaf9842021-04-30 22:55:37 +0200215project, refer to `README <https://github.com/efabless/caravel_user_project/blob/main/verilog/dv/README.md>`__.
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -0700216
217Hardening the User Project Macro using Openlane
218===============================================
219
manarabdelatyd8dd0102021-04-30 08:40:52 +0200220You will need to install openlane by running the following
manarabdelatyd0e7afb2021-04-22 00:21:13 +0200221
222.. code:: bash
223
manarabdelaty0218c0f2021-04-29 18:31:49 +0200224 export OPENLANE_ROOT=<openlane-installation-path>
225 export OPENLANE_TAG=<latest-openlane-tag>
226 make openlane
manarabdelatyd0e7afb2021-04-22 00:21:13 +0200227
228For detailed instructions on how to install openlane and the pdk refer
229to
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -0700230`README <https://github.com/efabless/openlane/blob/master/README.md>`__.
231
232There are two options for hardening the user project macro using
233openlane:
234
2351. Hardening the user macro, then embedding it in the wrapper
2362. Flattening the user macro with the wrapper.
237
238For more details on this, refer to this
manarabdelatyd0e7afb2021-04-22 00:21:13 +0200239`README <https://github.com/efabless/caravel/blob/master/openlane/README.rst>`__.
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -0700240
241For this sample project, we went for the first option where the user
242macro is hardened first, then it is inserted in the user project
243wrapper.
244
245.. raw:: html
246
247 <p align="center">
248 <img src="./_static/wrapper.png" width="50%" height="50%">
249 </p>
250
manarabdelatyd0e7afb2021-04-22 00:21:13 +0200251.. raw:: html
252
253 </p>
254
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -0700255To reproduce hardening this project, run the following:
256
257.. code:: bash
258
manarabdelaty0218c0f2021-04-29 18:31:49 +0200259 # Run openlane to harden user_proj_example
260 make user_proj_example
261 # Run openlane to harden user_project_wrapper
262 make user_project_wrapper
263
264
manarabdelaty0218c0f2021-04-29 18:31:49 +0200265Running Open-MPW Precheck Locally
266=================================
267
268You can install the precheck by running
269
270.. code:: bash
271
272 # By default, this install the precheck in your home directory
273 # To change the installtion path, run "export PRECHECK_ROOT=<precheck installation path>"
274 make precheck
275
276This will clone the precheck repo and pull the latest precheck docker image.
277
278
279Then, you can run the precheck by running
manarabdelatyd8dd0102021-04-30 08:40:52 +0200280Specify CARAVEL_ROOT before running any of the following,
manarabdelaty0218c0f2021-04-29 18:31:49 +0200281
282.. code:: bash
283
manarabdelatyd8dd0102021-04-30 08:40:52 +0200284 # export CARAVEL_ROOT=$(pwd)/caravel
285 export CARAVEL_ROOT=<path-to-caravel>
manarabdelaty0218c0f2021-04-29 18:31:49 +0200286 make run-precheck
287
288This will run all the precheck checks on your project and will produce the logs under the ``checks`` directory.
289
290
291Other Miscellaneous Targets
292============================
293
294The makefile provides a number of useful that targets that can run LVS, DRC, and XOR checks on your hardened design outside of openlane's flow.
295
296Run ```make help`` to display available targets.
297
298Specify CARAVEL_ROOT before running any of the following,
299
300.. code:: bash
manarabdelatyd8dd0102021-04-30 08:40:52 +0200301
302 # export CARAVEL_ROOT=$(pwd)/caravel
manarabdelaty0218c0f2021-04-29 18:31:49 +0200303 export CARAVEL_ROOT=<path-to-caravel>
304
305Run lvs on spice,
306
307.. code:: bash
308
309 make lvs-<macro_name>
310
311Run lvs on the gds,
312
313.. code:: bash
314
315 make lvs-gds-<macro_name>
316
317Run lvs on the maglef,
318
319.. code:: bash
320
321 make lvs-maglef-<macro_name>
322
323Run drc using magic,
324
325.. code:: bash
326
327 make drc-<macro_name>
328
329Run antenna check using magic,
330
331.. code:: bash
332
333 make antenna-<macro_name>
334
335Run XOR check,
336
337.. code:: bash
338
339 make xor-wrapper
340
Mohamed Kassem6f2fcd22021-04-19 10:14:19 -0700341
342Checklist for Open-MPW Submission
343=================================
344
345- [x] The project repo adheres to the same directory structure in this
346 repo.
347- [x] The project repo contain info.yaml at the project root.
348- [x] Top level macro is named ``user_project_wrapper``.
349- [x] Full Chip Simulation passes for RTL and GL (gate-level)
350- [x] The hardened Macros are LVS and DRC clean
351- [x] The hardened ``user_project_wrapper`` adheres to the same pin
352 order specified at
353 `pin\_order <https://github.com/efabless/caravel/blob/master/openlane/user_project_wrapper_empty/pin_order.cfg>`__
354- [x] XOR check passes with zero total difference.
355- [x] Openlane summary reports are retained under ./signoff/
356
357.. |License| image:: https://img.shields.io/badge/License-Apache%202.0-blue.svg
358 :target: https://opensource.org/licenses/Apache-2.0
manarabdelatyd0e7afb2021-04-22 00:21:13 +0200359.. |User CI| image:: https://github.com/efabless/caravel_project_example/actions/workflows/user_project_ci.yml/badge.svg
360 :target: https://github.com/efabless/caravel_project_example/actions/workflows/user_project_ci.yml
361.. |Caravel Build| image:: https://github.com/efabless/caravel_project_example/actions/workflows/caravel_build.yml/badge.svg
Mohamed Kassem9ae1f072021-04-23 12:19:31 -0700362 :target: https://github.com/efabless/caravel_project_example/actions/workflows/caravel_build.yml