# Matcha

## About the project

Matcha is an open-source reference hardware implementation for Project Open Se Cura,
a low-power, secure embedded platform for ambient ML applications.

## About this repository

This repository contains hardware (RTL), software, and utilities written as part of
the Matcha project.

## Documentation

The project contains comprehensive documentation of the SOC, all IPs, and tools.
<!-- TODO: Add link to documents -->.

## How to contribute

Have a look at our [GettingStarted Guide](https://opensecura.googlesource.com/docs/+/refs/heads/master/GettingStarted.md)
for guidelines on how to contribute code to this repository.

## Licensing

Unless otherwise noted, everything in this repository is covered by the Apache
License, Version 2.0 (see [LICENSE](./LICENSE) for full text).

## Prerequisites

Development for matcha requires that the necessary tools and prerequisites be
installed.  See [GettingStarted Guide](https://opensecura.googlesource.com/docs/+/refs/heads/master/GettingStarted.md)

To setup the build system, run following steps at root of repo:

```bash
source build/setup.sh
```

Install the prerequisites:

```bash
m prereqs
```

Install the tools used for development:

```bash
m tools
```

## Code/Repo Structure

```bash
<root_dir>/hw/matcha/
    hw/top_matcha/
        BUILD
        cdc/
        data/
        dv/
        formal/
        ip/
        ip_autogen/
        lint/
        rdc/
        rtl/
        sw/
        syn/
        util/
    hw/
        BUILD
        Makefile
    sw/
        BUILD
        device/
    util/
        BUILD
        dvsim_matcha/
        make_new_dif/
        openocd/
        topgen_util/
        topgen_matcha.py

<root_dir>/hw/opentitan_upstream/
<root_dir>/build/
<root_dir>/Manifest/
<root_dir>/Makefile
<root_dir>/GettingStarted.md
<toot_dir>/...
```

## Quick start guide and cheat sheet

For following steps, make sure the above "Prerequisites" steps have been run if
the repo is been checked out at the first time.

Build RTL top Level and generate registers, interrupt and address map:

```bash
m matcha_hw_generate_all
```

Build verilator simulation target:

```bash
m matcha_hw_verilator_sim
```

Run matcha verilator test suite

```bash
m matcha_hw_verilator_tests
```

Run FPGA compilation flow for Nexus FPGA board:

```bash
m matcha_hw_fpga_nexus
```

## Bazel debug

Run matcha single test with messages to stdout

```bazel
bazel test --test_output=streamed //sw/device/tests:verilator_mailbox_test
```

Run matcha test suites

```bazel
bazel test --test_output=streamed //sw/device/tests:verilator_test_suite
```

Run FPGA compilation flow for Nexus FPGA board with debug commands:

```bazel
bazel build -s //hw/bitstream/vivado:fpga_nexus
```

## Simulation logs

Enable tracing on a single test

```bazel
bazel test --test_output=streamed  --test_timeout=1000000 --test_arg=--trace //sw/device/tests:verilator_cam_ctrl_test
```

*Note: `--test_timeout=1000000` sets timeout in seconds. This helps prevent timeout issues then using trace.*

Waveform dump and peripheral logs for a test located in:

```bash
<root_dir>/hw/matcha/bazel-testlogs/sw/device/tests/<test_name>/test.outputs/output.zip
    sim.fst (if tracing is enabled)
    uart0.log
    smc_uart.log
    spi0.log
    usb0.log
```

*Note: The trace_core_#.log files available in output.zip is currently a TODO
item.*

## The FPGA compiled bitstream and reports (resource utilization, pin assignment, etc) can be found in following directory:

<matcha_root_dir>/bazel-bin/hw/bitstream/vivado/build.fpga_nexus/synth-vivado/google_systems_chip_matcha_nexus_0.1.runs/impl_1/chip_matcha_nexus.bit
<matcha_root_dir>/bazel-bin/hw/bitstream/vivado/build.fpga_nexus/synth-vivado/google_systems_chip_matcha_nexus_0.1.runs/impl_1/*.rpt
<matcha_root_dir>/bazel-bin/hw/bitstream/vivado/build.fpga_nexus/synth-vivado/google_systems_chip_matcha_nexus_0.1.runs/synth_1/*.rpt

## DV flow

 [Setup DV flow](./doc/getting_started/setup_dv.md)
