# Aim of the project This project gives an example of the desired structure for a *Verilog* project. It is composed of the following folders: - build : Contains (tcl) scripts to build a Vivado or other project out of this arborescence. - constraints : Contains the constraints (if needed) for the project. - ip : Contains external dependencies of the project. This folder is used for commodity only in order to simplify test and verification scripts. Its contents should be populated by a build script (or manually copied in some cases). Each subdirectory corresponds to a dependency in the same format as the current document. For old projects, at least *src* directory should be present. Normally, it should not be under version control. - runs : Contains all temporary files built by the runs of different tools (e.g. simulation, verification etc.). It might have a substructure, depending on the tool. It **should not** be under version control. - scripts : Contains different scripts related to the project. Typical examples - launch simulation or verification. The scripts might be in shell, makefile, tcl etc. A preference for tcl should be considered. - src : Contains source files for the project. It has subdirectories corresponding to the HDL language used (Verilog, VHDL, Migen, Amaranth, etc) - tests : Contains testbenches for the project. It has subdirectories corresponding to the used tool (cocotb, verilog, verilator, etc). For *python*-based tools, the corresponding structure should allow test discovery using pytest (file names containing *test* and functions containing *test*). - verification : Contains scripts and files for formal verification. - other folders that are related to the editor and that probably should not be under version control. The project should be under version control (e.g. *git*) and have corresponding *.gitignore* specifications. The root of the project shall only contain: - a README.md file that gives the description of the project. - *.gitignore* or similar files, related to the version control. - a *Makefile* or a launcher script named *project* that have arguments allowing to run different tools. If present, it must contain at least the argument *clean* that will delete all elements from the *run* folder (maybe also all non-vcs tracked files). - Editor-related files, e.g. *workspace.code-workspace* for VSCode. These files should not be under version control.