Initial commit
This commit is contained in:
41
verilog/dv/Makefile
Normal file
41
verilog/dv/Makefile
Normal file
@@ -0,0 +1,41 @@
|
||||
# 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
|
||||
|
||||
# ---- Test patterns for project striVe ----
|
||||
|
||||
.SUFFIXES:
|
||||
.SILENT: clean all
|
||||
|
||||
|
||||
PATTERNS = io_ports la_test1 la_test2 wb_port mprj_stimulus
|
||||
|
||||
all: ${PATTERNS}
|
||||
|
||||
for i in ${PATTERNS}; do \
|
||||
( cd $$i && make -f Makefile $${i}.vcd &> verify.log && grep Monitor verify.log) ; \
|
||||
done
|
||||
|
||||
DV_PATTERNS = $(foreach dv, $(PATTERNS), verify-$(dv))
|
||||
$(DV_PATTERNS): verify-% :
|
||||
cd $* && make
|
||||
|
||||
clean: ${PATTERNS}
|
||||
for i in ${PATTERNS}; do \
|
||||
( cd $$i && \rm -f *.elf *.hex *.bin *.vvp *.log *.vcd *.lst *.hexe ) ; \
|
||||
done
|
||||
rm -rf *.log
|
||||
|
||||
.PHONY: clean all
|
||||
273
verilog/dv/README.md
Normal file
273
verilog/dv/README.md
Normal file
@@ -0,0 +1,273 @@
|
||||
<!---
|
||||
# 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
|
||||
-->
|
||||
|
||||
# Table of Contents
|
||||
* [Quick Start](./README.md#quick-start)
|
||||
* [For advanced users](./README.md#for-advanced-users)
|
||||
* [Simulation Environment Setup](./README.md#simulation-environment-setup)
|
||||
* [Docker](./README.md#1-docker)
|
||||
* [Running Simulation](./README.md#running-simulation)
|
||||
* [User Project Example DV](./README.md#user-project-example-dv)
|
||||
* [IO Ports Test](./README.md#io-ports-test)
|
||||
* [Logic Analyzer Test 1](./README.md#logic-analyzer-test-1)
|
||||
* [Logic Analyzer Test 2](./README.md#logic-analyzer-test-2)
|
||||
* [MPRJ Stimulus](./README.md#mprj_stimulus)
|
||||
* [Wishbone Test](./README.md#wishbone-test)
|
||||
|
||||
# Quick Launch for Designers
|
||||
|
||||
## Dependencies
|
||||
|
||||
- Docker: [Linux](https://hub.docker.com/search?q=&type=edition&offering=community&operating_system=linux&utm_source=docker&utm_medium=webreferral&utm_campaign=dd-smartbutton&utm_location=header) || [Windows](https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe?utm_source=docker&utm_medium=webreferral&utm_campaign=dd-smartbutton&utm_location=header) || [Mac with Intel Chip](https://desktop.docker.com/mac/main/amd64/Docker.dmg?utm_source=docker&utm_medium=webreferral&utm_campaign=dd-smartbutton&utm_location=header) || [Mac with Apple Chip](https://desktop.docker.com/mac/main/arm64/Docker.dmg?utm_source=docker&utm_medium=webreferral&utm_campaign=dd-smartbutton&utm_location=header)
|
||||
|
||||
## Running the simulation
|
||||
|
||||
Assuming you already:
|
||||
- went throught the [quick start](https://github.com/efabless/caravel_user_project/blob/main/docs/source/quickstart.rst) for setting up your environemnt,
|
||||
- integrated your design into the user's wrapper and
|
||||
- hardenned your design as well as the user's wrapper (for GL simulation)
|
||||
|
||||
````
|
||||
make simenv
|
||||
SIM=RTL make verify-<dv-test>
|
||||
# OR
|
||||
SIM=GL make verify-<dv-test>
|
||||
````
|
||||
``<dv-test>``: io_ports, mprj_stimulus, la_test1, la_test2 or wb_port.
|
||||
|
||||
# For advanced users
|
||||
|
||||
## Simulation Environment Setup
|
||||
|
||||
There are two options for setting up the simulation environment:
|
||||
|
||||
* Pulling a pre-built docker image
|
||||
* Installing the dependecies locally. Instructions to setting up the environment locally can be found [here](https://github.com/efabless/caravel_user_project/verilog/dv/local-install.md)
|
||||
|
||||
### Docker
|
||||
|
||||
There is an available docker setup with the needed tools at [efabless/dockerized-verification-setup](https://github.com/efabless/dockerized-verification-setup)
|
||||
|
||||
Run the following to pull the image:
|
||||
|
||||
```
|
||||
docker pull efabless/dv_setup:latest
|
||||
```
|
||||
|
||||
## Running Simulation
|
||||
|
||||
First, you will need to export a number of environment variables:
|
||||
|
||||
```bash
|
||||
export PDK_PATH=<pdk-location/sky130A>
|
||||
export CARAVEL_ROOT=<caravel_root>
|
||||
export TARGET_PATH=<caravel_user_project>
|
||||
```
|
||||
|
||||
Then, run the following command to start the docker container :
|
||||
|
||||
```
|
||||
docker run -it -v ${TARGET_PATH}:${TARGET_PATH} -v ${PDK_ROOT}:${PDK_ROOT} \
|
||||
-v ${CARAVEL_ROOT}:${CARAVEL_ROOT} \
|
||||
-e TARGET_PATH=${TARGET_PATH} -e PDK_ROOT=${PDK_ROOT} \
|
||||
-e CARAVEL_ROOT=${CARAVEL_ROOT} \
|
||||
-e TOOLS=/foss/tools/riscv-gnu-toolchain-rv32i/411d134 \
|
||||
-e DESIGNS=$(TARGET_PATH) \
|
||||
-e CORE_VERILOG_PATH=$(TARGET_PATH)/mgmt_core_wrapper/verilog \
|
||||
-e MCW_ROOT=$(MCW_ROOT) \
|
||||
efabless/dv_setup:latest
|
||||
```
|
||||
|
||||
Then, navigate to the directory where the DV tests reside :
|
||||
|
||||
```bash
|
||||
cd $TARGET_PATH/verilog/dv/
|
||||
```
|
||||
|
||||
To run any simulation, you need to be on the top level or caravel_user_project.
|
||||
|
||||
To run RTL simulation for one of the DV tests,
|
||||
|
||||
```bash
|
||||
SIM=RTL make verify-<dv-test>
|
||||
```
|
||||
|
||||
To run gate level simulation for one of the DV tests,
|
||||
|
||||
```bash
|
||||
SIM=GL make verify-<dv-test>
|
||||
```
|
||||
|
||||
# User Project Example DV
|
||||
|
||||
A discription of the example testbenches
|
||||
|
||||
The directory includes five tests for the counter user-project example:
|
||||
|
||||
### IO Ports Test
|
||||
|
||||
* This test is meant to verify that we can configure the pads for the user project area. The firmware configures the lower 8 IO pads in the user space as outputs:
|
||||
|
||||
```c
|
||||
reg_mprj_io_0 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_1 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
.....
|
||||
reg_mprj_io_7 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
```
|
||||
|
||||
* Then, the firmware applies the pad configuration by enabling the serial transfer on the shift register responsible for configuring the pads and waits until the transfer is done.
|
||||
```c
|
||||
reg_mprj_xfer = 1;
|
||||
while (reg_mprj_xfer == 1);
|
||||
```
|
||||
|
||||
* The testbench success criteria is that we can observe the counter value on the lower 8 I/O pads. This criteria is checked by the testbench through observing the values on the I/O pads as follows:
|
||||
|
||||
```verilog
|
||||
wait(mprj_io_0 == 8'h01);
|
||||
wait(mprj_io_0 == 8'h02);
|
||||
wait(mprj_io_0 == 8'h03);
|
||||
....
|
||||
wait(mprj_io_0 == 8'hFF);
|
||||
```
|
||||
|
||||
* If the testbench fails, it will print a timeout message to the terminal.
|
||||
|
||||
### Logic Analyzer Test 1
|
||||
|
||||
* This test is meant to verify that we can use the logic analyzer to monitor and write signals in the user project from the management SoC. Firstly, the firmware configures the upper 16 of the first 32 GPIO pads as outputs from the managent SoC, applies the configuration by initiating the serial transfer on the shift register, and writes a value on the pads to indicate the end of pad configuration and the start of the test.
|
||||
|
||||
```c
|
||||
reg_mprj_io_31 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_30 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
.....
|
||||
reg_mprj_io_16 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
|
||||
reg_mprj_io_15 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_14 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
.....
|
||||
reg_mprj_io_0 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
|
||||
reg_mprj_io_6 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
|
||||
reg_mprj_xfer = 1;
|
||||
while (reg_mprj_xfer == 1);
|
||||
|
||||
// Flag start of the test
|
||||
reg_mprj_datal = 0xAB400000;
|
||||
```
|
||||
|
||||
This is done to flag the start/success/end of the simulation by writing a certain value to the I/Os which is then checked by the testbench to know whether the test started/ended/succeeded. For example, the testbench checks on the value of the upper 16 of 32 I/Os, if it is equal to `16'hAB40`, then we know that the test started.
|
||||
|
||||
```verilog
|
||||
wait(checkbits == 16'hAB40);
|
||||
$display("LA Test 1 started");
|
||||
```
|
||||
|
||||
* Then, the firmware configures the logic analyzer (LA) probes `[31:0]` as inputs to the management SoC to monitor the counter value, and configure the logic analyzer probes `[63:32]` as outputs from the management SoC (inputs to the user_proj_example) to set the counter initial value. This is done by writing to the LA probes enable registers. Note that the output enable is active low, while the input enable is active high. Every channel can be configured for input, output, or both independently.
|
||||
|
||||
|
||||
```c
|
||||
reg_la0_oenb = reg_la0_iena = 0x00000000; // [31:0]
|
||||
reg_la1_oenb = reg_la1_iena = 0xFFFFFFFF; // [63:32]
|
||||
reg_la2_oenb = reg_la2_iena = 0x00000000; // [95:64]
|
||||
reg_la3_oenb = reg_la3_iena = 0x00000000; // [127:96]
|
||||
```
|
||||
|
||||
* Then, the firmware writes an initial value to the counter through the LA1 data register. Afte writing the counter value, the LA probes are disabled to prevent the counter write signal from being always set to one.
|
||||
|
||||
```c
|
||||
reg_la1_data = 0x00000000; // Write zero to count register
|
||||
reg_la1_oenb = reg_la1_iena = 0x00000000; // Disable probes
|
||||
```
|
||||
|
||||
* The firmware then waits until the count value exceeds 500 and flags the success of the test by writing `0xAB41` to pads 16 to 31. The firmware reads the count value through the logic analyzer probes `[31:0]`
|
||||
|
||||
```c
|
||||
while (1) {
|
||||
if (reg_la0_data > 0x1F4) { // Read current count value through LA
|
||||
reg_mprj_datal = 0xAB410000; // Flag success of the test
|
||||
break;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Logic Analyzer Test 2
|
||||
|
||||
* This test is meant to verify that we can drive the clock and reset signals for the user project example through the logic analyzer. In the [user_proj_example](verilog/rtl/user_proj_example.v) RTL, the clock can either be supplied from the `wb_clk_i` or from the logic analyzer through bit `[64]`. Similarly, the reset signal can be supplied from the `wb_rst_i` or through `LA[65]`. The firmware configures the clk and reset LA probes as outputs from the management SoC by writing to the LA2 enable register.
|
||||
|
||||
```c
|
||||
reg_la0_oenb = reg_la0_iena = 0x00000000; // [31:0]
|
||||
reg_la1_oenb = reg_la1_iena = 0x00000000; // [63:32]
|
||||
reg_la2_oenb = reg_la2_iena = 0x00000000; // [95:64]
|
||||
reg_la3_oenb = reg_la3_iena = 0x00000000; // [127:96]
|
||||
```
|
||||
|
||||
* Then, the firmware supplies both clock reset signals through LA2 data register. First, both are set to one. Then, reset is driven to zero and the clock is toggled for 6 clock cycles.
|
||||
|
||||
```c
|
||||
reg_la2_data = 0x00000003; // Write one to LA[64] and LA[65]
|
||||
for (i=0; i<11; i=i+1) { // Toggle clk & de-assert reset
|
||||
clk = !clk;
|
||||
reg_la2_data = 0x00000000 | clk;
|
||||
}
|
||||
```
|
||||
* The testbench success criteria is that the firmware reads a count value of five through the LA probes.
|
||||
```c
|
||||
while (1){
|
||||
if (reg_la0_data == 0x05) {
|
||||
reg_mprj_datal = 0xAB610000; // FLag success of the test
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### MPRJ_stimulus
|
||||
|
||||
* This test is meant to verify that we can read data generated from the user project on the gpio outputs. This is done by configuring the LA probes as inputs to the cpu, except for LA probes [63:32] as output from the cpu
|
||||
|
||||
```c
|
||||
reg_la0_oenb = reg_la0_iena = 0x00000000; // [31:0]
|
||||
reg_la1_oenb = reg_la1_iena = 0xFFFFFFFF; // [63:32]
|
||||
reg_la2_oenb = reg_la2_iena = 0x00000000; // [95:64]
|
||||
reg_la3_oenb = reg_la3_iena = 0x00000000; // [127:96]
|
||||
```
|
||||
* Then tests the ability to force data on the gpio through channel 37
|
||||
|
||||
```c
|
||||
reg_mprj_datah = 0x0f0f0fc0;
|
||||
reg_mprj_datah = 0x00000000;
|
||||
reg_mprj_datah = 0x0f0f0fca;
|
||||
reg_mprj_datah = 0x0000000a;
|
||||
reg_mprj_datah = 0x0f0f0fc0;
|
||||
reg_mprj_datah = 0x00000000;
|
||||
reg_mprj_datah = 0x0f0f0fc5;
|
||||
reg_mprj_datah = 0x00000005;
|
||||
```
|
||||
* It then tests the ability to read back the data generated by the user project on the gpio
|
||||
|
||||
```c
|
||||
testval = reg_mprj_datal;
|
||||
reg_mprj_datal = (testval << 16);
|
||||
testval = reg_mprj_datal;
|
||||
reg_mprj_datal = (testval << 16);
|
||||
```
|
||||
|
||||
|
||||
### Wishbone Test
|
||||
|
||||
* This test is meant to verify that we can read and write to the count register through the wishbone port. The firmware writes a value of `0x2710` to the count register, then reads back the count value after some time. The read and write transactions happen through the management SoC wishbone bus and are initiated by either writing or reading from the user project address on the wishbone bus. The ``reg_wb_enable`` needs to be set to 1 in order to enable the wishbone bus.
|
||||
4
verilog/dv/cocotb/.gitignore
vendored
Normal file
4
verilog/dv/cocotb/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
sim/
|
||||
*.log
|
||||
*.vcd
|
||||
*.pyc
|
||||
43
verilog/dv/cocotb/README.md
Normal file
43
verilog/dv/cocotb/README.md
Normal file
@@ -0,0 +1,43 @@
|
||||
Overview
|
||||
========
|
||||
This directory contain tests to verify the example user project 16 bit counter and 2 other simple tests as examples.
|
||||
|
||||
directory hierarchy
|
||||
=====================
|
||||
|
||||
# counter_tests
|
||||
|
||||
contain tests for 16 bit counter for more info refer to [counter_tests](counter_tests/README.md)
|
||||
|
||||
# hello_world
|
||||
|
||||
Example test with empty firmware that only power and reset caravel the print "Hello World"
|
||||
|
||||
# hello_world_uart
|
||||
|
||||
Example test That uses the firmware to send "Hello World" using UART TX
|
||||
|
||||
# cocotb_tests.py
|
||||
|
||||
Module that should import all the tests used to be seen for cocotb as a test
|
||||
|
||||
|
||||
Run tests
|
||||
===========
|
||||
# run hello_world_uart
|
||||
```bash
|
||||
caravel_cocotb -t hello_world_uart -tag hello_world
|
||||
```
|
||||
# run all counter testlist
|
||||
```bash
|
||||
caravel_cocotb -tl counter_tests/counter_tests.yaml -tag counter_tests
|
||||
```
|
||||
# run from different directory
|
||||
```bash
|
||||
caravel_cocotb -t hello_world_uart -tag hello_world -design_info <path to design_info.yaml>
|
||||
```
|
||||
# run with changing the results directory
|
||||
```bash
|
||||
caravel_cocotb -t hello_world_uart -tag hello_world -sim <path to results directory>
|
||||
```
|
||||
|
||||
7
verilog/dv/cocotb/cocotb_tests.py
Normal file
7
verilog/dv/cocotb/cocotb_tests.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from hello_world.hello_world import hello_world
|
||||
from hello_world_uart.hello_world_uart import hello_world_uart
|
||||
from user_proj_tests.counter_wb.counter_wb import counter_wb
|
||||
from user_proj_tests.counter_la.counter_la import counter_la
|
||||
from user_proj_tests.counter_la_reset.counter_la_reset import counter_la_reset
|
||||
from user_proj_tests.counter_la_clk.counter_la_clk import counter_la_clk
|
||||
from gpio_test.gpio_test import gpio_test
|
||||
9
verilog/dv/cocotb/design_info.yaml
Normal file
9
verilog/dv/cocotb/design_info.yaml
Normal file
@@ -0,0 +1,9 @@
|
||||
CARAVEL_ROOT: /usr/caravel_user_project/caravel
|
||||
MCW_ROOT: /usr/caravel_user_project/mgmt_core_wrapper
|
||||
PDK: sky130A
|
||||
PDK_ROOT: /usr/pdk
|
||||
USER_PROJECT_ROOT: /usr/caravel_user_project
|
||||
caravan: false
|
||||
clk: 25
|
||||
emailto:
|
||||
- null
|
||||
30
verilog/dv/cocotb/gpio_test/gpio_test.c
Normal file
30
verilog/dv/cocotb/gpio_test/gpio_test.c
Normal file
@@ -0,0 +1,30 @@
|
||||
// SPDX-FileCopyrightText: 2023 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.
|
||||
|
||||
|
||||
#include <firmware_apis.h> // include required APIs
|
||||
void main(){
|
||||
// Enable managment gpio as output to use as indicator for finishing configuration
|
||||
ManagmentGpio_outputEnable();
|
||||
ManagmentGpio_write(0);
|
||||
enableHkSpi(0); // disable housekeeping spi
|
||||
//GPIOs_configureAll(GPIO_MODE_MGMT_STD_OUT);
|
||||
GPIOs_configureAll(GPIO_MODE_MGMT_STD_OUTPUT);
|
||||
GPIOs_loadConfigs();
|
||||
GPIOs_writeLow(0x8F);
|
||||
ManagmentGpio_write(1); // configuration finished
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
36
verilog/dv/cocotb/gpio_test/gpio_test.py
Normal file
36
verilog/dv/cocotb/gpio_test/gpio_test.py
Normal file
@@ -0,0 +1,36 @@
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
|
||||
from caravel_cocotb.caravel_interfaces import * # import python APIs
|
||||
import cocotb
|
||||
|
||||
@cocotb.test() # cocotb test marker
|
||||
@report_test # wrapper for configure test reporting files
|
||||
async def gpio_test(dut):
|
||||
caravelEnv = await test_configure(dut) #configure, start up and reset caravel
|
||||
#await caravelEnv.release_csb()
|
||||
await caravelEnv.wait_mgmt_gpio(1)
|
||||
gpios_value_str = caravelEnv.monitor_gpio(37, 0).binstr
|
||||
cocotb.log.info (f"All gpios '{gpios_value_str}'")
|
||||
gpio_value_int = caravelEnv.monitor_gpio(37, 0).integer
|
||||
#expected_gpio_value = 0xF8
|
||||
expected_gpio_value = 0x8F
|
||||
if (gpio_value_int == expected_gpio_value):
|
||||
cocotb.log.info (f"[TEST] Pass the gpio value is '{hex(gpio_value_int)}'")
|
||||
else:
|
||||
cocotb.log.error (f"[TEST] Fail the gpio value is :'{hex(gpio_value_int)}' expected {hex(expected_gpio_value)}")
|
||||
|
||||
|
||||
19
verilog/dv/cocotb/hello_world/hello_world.c
Normal file
19
verilog/dv/cocotb/hello_world/hello_world.c
Normal file
@@ -0,0 +1,19 @@
|
||||
// SPDX-FileCopyrightText: 2023 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.
|
||||
|
||||
|
||||
#include <firmware_apis.h>
|
||||
void main(){
|
||||
return;
|
||||
}
|
||||
25
verilog/dv/cocotb/hello_world/hello_world.py
Normal file
25
verilog/dv/cocotb/hello_world/hello_world.py
Normal file
@@ -0,0 +1,25 @@
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
|
||||
from caravel_cocotb.caravel_interfaces import test_configure
|
||||
from caravel_cocotb.caravel_interfaces import report_test
|
||||
import cocotb
|
||||
|
||||
@cocotb.test()
|
||||
@report_test
|
||||
async def hello_world(dut):
|
||||
caravelEnv = await test_configure(dut,timeout_cycles=9373)
|
||||
cocotb.log.info("Hello World")
|
||||
27
verilog/dv/cocotb/hello_world/hello_world.yaml
Normal file
27
verilog/dv/cocotb/hello_world/hello_world.yaml
Normal file
@@ -0,0 +1,27 @@
|
||||
---
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
|
||||
# Yalm file contain general design information that would mostly need to be updated in the first run only
|
||||
# example
|
||||
## tests: [debug,clock_redirect]
|
||||
## sim: [RTL,RTL]
|
||||
Tests:
|
||||
- {name: hello_world, sim: RTL}
|
||||
|
||||
|
||||
|
||||
|
||||
28
verilog/dv/cocotb/hello_world_uart/hello_world_uart.c
Normal file
28
verilog/dv/cocotb/hello_world_uart/hello_world_uart.c
Normal file
@@ -0,0 +1,28 @@
|
||||
// SPDX-FileCopyrightText: 2023 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.
|
||||
|
||||
|
||||
#include <firmware_apis.h>
|
||||
|
||||
void main(){
|
||||
ManagmentGpio_write(0);
|
||||
ManagmentGpio_outputEnable();
|
||||
GPIOs_configure(6,GPIO_MODE_MGMT_STD_OUTPUT);
|
||||
GPIOs_loadConfigs();
|
||||
UART_enableTX(1);
|
||||
ManagmentGpio_write(1); // configuration finished
|
||||
|
||||
print("Hello World\n");
|
||||
return;
|
||||
}
|
||||
38
verilog/dv/cocotb/hello_world_uart/hello_world_uart.py
Normal file
38
verilog/dv/cocotb/hello_world_uart/hello_world_uart.py
Normal file
@@ -0,0 +1,38 @@
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
|
||||
|
||||
from caravel_cocotb.caravel_interfaces import test_configure
|
||||
from caravel_cocotb.caravel_interfaces import report_test
|
||||
import cocotb
|
||||
from caravel_cocotb.caravel_interfaces import UART
|
||||
|
||||
@cocotb.test()
|
||||
@report_test
|
||||
async def hello_world_uart(dut):
|
||||
caravelEnv = await test_configure(dut,timeout_cycles=3346140)
|
||||
|
||||
cocotb.log.info(f"[TEST] Start uart test")
|
||||
expected_msg = "Hello World"
|
||||
uart = UART(caravelEnv)
|
||||
# wait for start of sending
|
||||
await caravelEnv.wait_mgmt_gpio(1)
|
||||
# read the msg sent
|
||||
msg = await uart.get_line()
|
||||
if msg in expected_msg :
|
||||
cocotb.log.info (f"[TEST] Pass recieve the full expected msg '{msg}'")
|
||||
else:
|
||||
cocotb.log.error (f"[TEST] recieved wrong msg from uart msg recieved:'{msg}' expected '{expected_msg}'")
|
||||
24
verilog/dv/cocotb/hello_world_uart/hello_world_uart.yaml
Normal file
24
verilog/dv/cocotb/hello_world_uart/hello_world_uart.yaml
Normal file
@@ -0,0 +1,24 @@
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
|
||||
|
||||
|
||||
# Yalm file contain general design information that would mostly need to be updated in the first run only
|
||||
|
||||
Tests:
|
||||
- {name: hello_world_uart, sim: RTL}
|
||||
|
||||
|
||||
26
verilog/dv/cocotb/user_proj_tests/README.md
Normal file
26
verilog/dv/cocotb/user_proj_tests/README.md
Normal file
@@ -0,0 +1,26 @@
|
||||
|
||||
Tests hierarchy
|
||||
=====================
|
||||
|
||||
# counter_wb
|
||||
|
||||
Test that overwrite the counter value using wishbone interface
|
||||
|
||||
# counter_la
|
||||
|
||||
Test that overwrite the counter value using logic analyzer interface
|
||||
|
||||
# counter_la_clk
|
||||
|
||||
Counter can work by 2 different clocks wishbone clock or clock provided through logic analyzers.
|
||||
By default the wishbone clock is the used one. This test uses the logic analyzers clock
|
||||
|
||||
|
||||
# counter_la_reset
|
||||
|
||||
Counter reset also provided through wishbone or logic analyzers. this test uses the logic analyzers reset
|
||||
|
||||
# counter_tests.yaml
|
||||
|
||||
Testlist contain all counter tests
|
||||
|
||||
39
verilog/dv/cocotb/user_proj_tests/counter_la/counter_la.c
Normal file
39
verilog/dv/cocotb/user_proj_tests/counter_la/counter_la.c
Normal file
@@ -0,0 +1,39 @@
|
||||
// SPDX-FileCopyrightText: 2023 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.
|
||||
|
||||
|
||||
#include <firmware_apis.h>
|
||||
|
||||
void main(){
|
||||
// Enable managment gpio as output to use as indicator for finishing configuration
|
||||
ManagmentGpio_outputEnable();
|
||||
ManagmentGpio_write(0);
|
||||
enableHkSpi(0); // disable housekeeping spi
|
||||
// configure all gpios as user out then chenge gpios from 32 to 37 before loading this configurations
|
||||
GPIOs_configureAll(GPIO_MODE_USER_STD_OUT_MONITORED);
|
||||
GPIOs_configure(32,GPIO_MODE_USER_STD_OUT_MONITORED);
|
||||
GPIOs_configure(33,GPIO_MODE_USER_STD_OUT_MONITORED);
|
||||
GPIOs_configure(34,GPIO_MODE_USER_STD_OUT_MONITORED);
|
||||
GPIOs_configure(35,GPIO_MODE_USER_STD_OUT_MONITORED);
|
||||
GPIOs_configure(36,GPIO_MODE_USER_STD_OUT_MONITORED);
|
||||
GPIOs_configure(37,GPIO_MODE_USER_STD_OUT_MONITORED);
|
||||
GPIOs_loadConfigs(); // load the configuration
|
||||
ManagmentGpio_write(1); // configuration finished
|
||||
// configure la [63:32] as output from cpu
|
||||
LogicAnalyzer_write(1,7<<16);
|
||||
LogicAnalyzer_outputEnable(1,0);
|
||||
ManagmentGpio_write(0); // configuration finished
|
||||
LogicAnalyzer_outputEnable(1,0xFFFFFFFF);
|
||||
return;
|
||||
}
|
||||
53
verilog/dv/cocotb/user_proj_tests/counter_la/counter_la.py
Normal file
53
verilog/dv/cocotb/user_proj_tests/counter_la/counter_la.py
Normal file
@@ -0,0 +1,53 @@
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
|
||||
|
||||
from caravel_cocotb.caravel_interfaces import test_configure
|
||||
from caravel_cocotb.caravel_interfaces import report_test
|
||||
import cocotb
|
||||
|
||||
@cocotb.test()
|
||||
@report_test
|
||||
async def counter_la(dut):
|
||||
caravelEnv = await test_configure(dut, timeout_cycles=59844)
|
||||
|
||||
cocotb.log.info(f"[TEST] Start counter_la test")
|
||||
# wait for start of sending
|
||||
await caravelEnv.release_csb()
|
||||
await caravelEnv.wait_mgmt_gpio(1)
|
||||
cocotb.log.info(f"[TEST] finish configuration")
|
||||
overwrite_val = 7 # value will be written to the counter by la
|
||||
# expect value bigger than 7
|
||||
await caravelEnv.wait_mgmt_gpio(0) # wait until writing 7 through la
|
||||
received_val = int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2)
|
||||
counter = overwrite_val
|
||||
|
||||
if received_val != counter :
|
||||
cocotb.log.fatal(f"LA writing is incorrect: {overwrite_val} receieved: {received_val}")
|
||||
await cocotb.triggers.ClockCycles(caravelEnv.clk,1)
|
||||
|
||||
# wait until the LA writing is disabled
|
||||
while (received_val == counter):
|
||||
await cocotb.triggers.ClockCycles(caravelEnv.clk,1)
|
||||
received_val = int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2)
|
||||
|
||||
counter = received_val
|
||||
for i in range(100):
|
||||
if counter != int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2) :
|
||||
cocotb.log.error(f"counter have wrong value expected = {counter} recieved = {int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2) }")
|
||||
await cocotb.triggers.ClockCycles(caravelEnv.clk,1)
|
||||
counter +=1
|
||||
|
||||
21
verilog/dv/cocotb/user_proj_tests/counter_la/counter_la.yaml
Normal file
21
verilog/dv/cocotb/user_proj_tests/counter_la/counter_la.yaml
Normal file
@@ -0,0 +1,21 @@
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
# Yalm file contain general design information that would mostly need to be updated in the first run only
|
||||
|
||||
Tests:
|
||||
- {name: counter_la, sim: RTL}
|
||||
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
// SPDX-FileCopyrightText: 2023 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.
|
||||
|
||||
|
||||
#include <firmware_apis.h>
|
||||
|
||||
void main(){
|
||||
// Enable managment gpio as output to use as indicator for finishing configuration
|
||||
ManagmentGpio_outputEnable();
|
||||
ManagmentGpio_write(0);
|
||||
enableHkSpi(0); // disable housekeeping spi
|
||||
// configure all gpios as user out then chenge gpios from 32 to 37 before loading this configurations
|
||||
GPIOs_configureAll(GPIO_MODE_USER_STD_OUT_MONITORED);
|
||||
GPIOs_configure(32,GPIO_MODE_MGMT_STD_OUTPUT);
|
||||
GPIOs_configure(33,GPIO_MODE_MGMT_STD_OUTPUT);
|
||||
GPIOs_configure(34,GPIO_MODE_MGMT_STD_OUTPUT);
|
||||
GPIOs_configure(35,GPIO_MODE_MGMT_STD_OUTPUT);
|
||||
GPIOs_configure(36,GPIO_MODE_MGMT_STD_OUTPUT);
|
||||
GPIOs_configure(37,GPIO_MODE_MGMT_STD_OUTPUT);
|
||||
GPIOs_loadConfigs(); // load the configuration
|
||||
// configure la 64 (clk enable by la) as output from cpu
|
||||
// writing 1 in bit 64(first bit in reg 2) to reset
|
||||
LogicAnalyzer_write(2,0);
|
||||
// LogicAnalyzer_inputEnable(2,0x1);
|
||||
LogicAnalyzer_outputEnable(2,0xFFFFFFFC);
|
||||
// reset counter
|
||||
// reset 1
|
||||
LogicAnalyzer_write(2,3); // clk pose edge
|
||||
LogicAnalyzer_write(2,2);// clk pose edge
|
||||
// reset 0
|
||||
LogicAnalyzer_write(2,1); // clk pose edge
|
||||
LogicAnalyzer_write(2,0);// clk pose edge
|
||||
|
||||
ManagmentGpio_write(1); // configuration finished
|
||||
|
||||
for (int i = 0; i < 7; i++){
|
||||
LogicAnalyzer_write(2,1); // clk pose edge
|
||||
ManagmentGpio_write(0);
|
||||
LogicAnalyzer_write(2,0);// clk pose edge
|
||||
ManagmentGpio_write(1);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
|
||||
|
||||
from caravel_cocotb.caravel_interfaces import test_configure
|
||||
from caravel_cocotb.caravel_interfaces import report_test
|
||||
import cocotb
|
||||
|
||||
@cocotb.test()
|
||||
@report_test
|
||||
async def counter_la_clk(dut):
|
||||
caravelEnv = await test_configure(dut,timeout_cycles=61011)
|
||||
|
||||
cocotb.log.info(f"[TEST] Start counter_wb test")
|
||||
# wait for start of sending
|
||||
await caravelEnv.release_csb()
|
||||
await caravelEnv.wait_mgmt_gpio(1)
|
||||
cocotb.log.info(f"[TEST] finish configuration")
|
||||
overwrite_val = 0 # because of the reset
|
||||
# expect value bigger than 7
|
||||
received_val = int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2)
|
||||
counter = received_val
|
||||
|
||||
for i in range(5):
|
||||
if counter != int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2) :
|
||||
cocotb.log.error(f"counter have wrong value expected = {counter} recieved = {int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2) }")
|
||||
await wait_la_clock_cycle(caravelEnv)
|
||||
counter +=1
|
||||
|
||||
|
||||
async def wait_la_clock_cycle(caravelEnv):
|
||||
# clock is synced with mgmt_gpio
|
||||
await caravelEnv.wait_mgmt_gpio(0)
|
||||
await caravelEnv.wait_mgmt_gpio(1)
|
||||
@@ -0,0 +1,21 @@
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
|
||||
# Yalm file contain general design information that would mostly need to be updated in the first run only
|
||||
Tests:
|
||||
- {name: counter_la_clk, sim: RTL}
|
||||
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
// SPDX-FileCopyrightText: 2023 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.
|
||||
|
||||
|
||||
#include <firmware_apis.h>
|
||||
|
||||
void main(){
|
||||
// Enable managment gpio as output to use as indicator for finishing configuration
|
||||
ManagmentGpio_outputEnable();
|
||||
ManagmentGpio_write(0);
|
||||
enableHkSpi(0); // disable housekeeping spi
|
||||
// configure all gpios as user out then chenge gpios from 32 to 37 before loading this configurations
|
||||
GPIOs_configureAll(GPIO_MODE_USER_STD_OUT_MONITORED);
|
||||
GPIOs_configure(32,GPIO_MODE_MGMT_STD_OUTPUT);
|
||||
GPIOs_configure(33,GPIO_MODE_MGMT_STD_OUTPUT);
|
||||
GPIOs_configure(34,GPIO_MODE_MGMT_STD_OUTPUT);
|
||||
GPIOs_configure(35,GPIO_MODE_MGMT_STD_OUTPUT);
|
||||
GPIOs_configure(36,GPIO_MODE_MGMT_STD_OUTPUT);
|
||||
GPIOs_configure(37,GPIO_MODE_MGMT_STD_OUTPUT);
|
||||
GPIOs_loadConfigs(); // load the configuration
|
||||
// reset counter
|
||||
LogicAnalyzer_outputEnable(2,0xFFFFFFFD);
|
||||
LogicAnalyzer_write(2,2);
|
||||
LogicAnalyzer_write(2,0);
|
||||
|
||||
ManagmentGpio_write(1); // configuration finished
|
||||
// configure la 65 (reset enable by la) as output from cpu
|
||||
// writing 1 in bit 65(second bit in reg 2) to reset
|
||||
// asset reset
|
||||
LogicAnalyzer_write(2,2);
|
||||
LogicAnalyzer_inputEnable(2,0x2);
|
||||
LogicAnalyzer_outputEnable(2,0xFFFFFFFD);
|
||||
// deassert reset
|
||||
LogicAnalyzer_inputEnable(2,0);
|
||||
LogicAnalyzer_outputEnable(2,0xFFFFFFFF);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
|
||||
from caravel_cocotb.caravel_interfaces import test_configure
|
||||
from caravel_cocotb.caravel_interfaces import report_test
|
||||
import cocotb
|
||||
|
||||
@cocotb.test()
|
||||
@report_test
|
||||
async def counter_la_reset(dut):
|
||||
caravelEnv = await test_configure(dut,timeout_cycles=1346140)
|
||||
|
||||
cocotb.log.info(f"[TEST] Start counter_wb test")
|
||||
# wait for start of sending
|
||||
await caravelEnv.release_csb()
|
||||
await caravelEnv.wait_mgmt_gpio(1)
|
||||
cocotb.log.info(f"[TEST] finish configuration")
|
||||
overwrite_val = 0 # because of the reset
|
||||
# expect value bigger than 7
|
||||
received_val = int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2)
|
||||
counter = received_val
|
||||
if received_val <= overwrite_val :
|
||||
cocotb.log.error(f"counter started late and value captured after configuration is smaller than overwrite value: {overwrite_val} receieved: {received_val}")
|
||||
await cocotb.triggers.ClockCycles(caravelEnv.clk,1)
|
||||
|
||||
while True: # wait until reset asserted
|
||||
if await get_reset_val(caravelEnv) == 1:
|
||||
cocotb.log.info(f"[TEST] Reset asserted by la")
|
||||
break
|
||||
while True: # wait until reset deasserted
|
||||
if await get_reset_val(caravelEnv) == 0:
|
||||
cocotb.log.info(f"[TEST] Reset deasserted by la")
|
||||
break
|
||||
counter =0
|
||||
|
||||
for i in range(100):
|
||||
if counter != int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2) :
|
||||
cocotb.log.error(f"counter have wrong value expected = {counter} recieved = {int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2) }")
|
||||
await cocotb.triggers.ClockCycles(caravelEnv.clk,1)
|
||||
counter +=1
|
||||
|
||||
async def get_reset_val(caravelEnv):
|
||||
""" get the counter reset value"""
|
||||
await cocotb.triggers.ClockCycles(caravelEnv.clk,1)
|
||||
return caravelEnv.user_hdl.mprj.counter.reset.value
|
||||
@@ -0,0 +1,21 @@
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
|
||||
# Yalm file contain general design information that would mostly need to be updated in the first run only
|
||||
Tests:
|
||||
- {name: counter_la_reset, sim: RTL}
|
||||
|
||||
|
||||
39
verilog/dv/cocotb/user_proj_tests/counter_wb/counter_wb.c
Normal file
39
verilog/dv/cocotb/user_proj_tests/counter_wb/counter_wb.c
Normal file
@@ -0,0 +1,39 @@
|
||||
// SPDX-FileCopyrightText: 2023 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.
|
||||
|
||||
|
||||
#include <firmware_apis.h>
|
||||
|
||||
void main(){
|
||||
// Enable managment gpio as output to use as indicator for finishing configuration
|
||||
ManagmentGpio_outputEnable();
|
||||
ManagmentGpio_write(0);
|
||||
enableHkSpi(0); // disable housekeeping spi
|
||||
// configure all gpios as user out then chenge gpios from 32 to 37 before loading this configurations
|
||||
GPIOs_configureAll(GPIO_MODE_USER_STD_OUT_MONITORED);
|
||||
|
||||
GPIOs_loadConfigs(); // load the configuration
|
||||
User_enableIF(); // this necessary when reading or writing between wishbone and user project if interface isn't enabled no ack would be recieve and the command will be stuck
|
||||
// user la reset and wb clk
|
||||
LogicAnalyzer_outputEnable(2,1);
|
||||
// reset counter
|
||||
LogicAnalyzer_write(2,2);
|
||||
LogicAnalyzer_write(2,0);
|
||||
ManagmentGpio_write(1); // configuration finished
|
||||
// writing to any address inside user project address space would reload the counter value
|
||||
USER_writeWord(0x7,0x88);
|
||||
ManagmentGpio_write(0); // start counting from 0
|
||||
|
||||
return;
|
||||
}
|
||||
63
verilog/dv/cocotb/user_proj_tests/counter_wb/counter_wb.py
Normal file
63
verilog/dv/cocotb/user_proj_tests/counter_wb/counter_wb.py
Normal file
@@ -0,0 +1,63 @@
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
|
||||
|
||||
from caravel_cocotb.caravel_interfaces import test_configure
|
||||
from caravel_cocotb.caravel_interfaces import report_test
|
||||
import cocotb
|
||||
|
||||
@cocotb.test()
|
||||
@report_test
|
||||
async def counter_wb(dut):
|
||||
caravelEnv = await test_configure(dut,timeout_cycles=32620)
|
||||
|
||||
cocotb.log.info(f"[TEST] Start counter_wb test")
|
||||
# wait for start of sending
|
||||
await caravelEnv.release_csb()
|
||||
await caravelEnv.wait_mgmt_gpio(1)
|
||||
cocotb.log.info(f"[TEST] finish configuration")
|
||||
overwrite_val = 7 # value will be written to the counter by wishbone
|
||||
# expect value bigger than 7
|
||||
received_val = int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2)
|
||||
counter = received_val
|
||||
await cocotb.triggers.ClockCycles(caravelEnv.clk,1)
|
||||
|
||||
while True: # wait until the value 1 start counting after the initial
|
||||
received_val = int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2)
|
||||
if counter == 0xFFFF: # rollover
|
||||
counter = 0
|
||||
else:
|
||||
counter +=1
|
||||
if received_val != counter:
|
||||
if received_val == overwrite_val:
|
||||
counter = received_val +1
|
||||
cocotb.log.info(f"Counter value has been overwritten by wishbone to be {received_val}")
|
||||
while True: #wait until the wishbone writing finished and the counter start running again
|
||||
received_val = int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2)
|
||||
if counter == received_val:
|
||||
break
|
||||
await cocotb.triggers.ClockCycles(caravelEnv.clk,1)
|
||||
cocotb.log.info(f"Counter value has been overwritten by wishbone to be {received_val}")
|
||||
break
|
||||
else:
|
||||
cocotb.log.error(f"Counter has wrong value before overwrite happened expected: {counter} received: {received_val}")
|
||||
await cocotb.triggers.ClockCycles(caravelEnv.clk,1)
|
||||
|
||||
for i in range(100):
|
||||
if counter != int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2) :
|
||||
cocotb.log.error(f"Counter have wrong value expected = {counter} recieved = {int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2) }")
|
||||
await cocotb.triggers.ClockCycles(caravelEnv.clk,1)
|
||||
counter +=1
|
||||
21
verilog/dv/cocotb/user_proj_tests/counter_wb/counter_wb.yaml
Normal file
21
verilog/dv/cocotb/user_proj_tests/counter_wb/counter_wb.yaml
Normal file
@@ -0,0 +1,21 @@
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
|
||||
# Yalm file contain general design information that would mostly need to be updated in the first run only
|
||||
Tests:
|
||||
- {name: counter_wb, sim: RTL}
|
||||
|
||||
|
||||
24
verilog/dv/cocotb/user_proj_tests/user_proj_tests.yaml
Normal file
24
verilog/dv/cocotb/user_proj_tests/user_proj_tests.yaml
Normal file
@@ -0,0 +1,24 @@
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
|
||||
# yaml file contain general design information that would mostly need to be updated in the first run only
|
||||
includes:
|
||||
- counter_la/counter_la.yaml
|
||||
- counter_wb/counter_wb.yaml
|
||||
- counter_la_reset/counter_la_reset.yaml
|
||||
- counter_la_clk/counter_la_clk.yaml
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
# yaml file contain general design information that would mostly need to be updated in the first run only
|
||||
Tests:
|
||||
- {name: counter_wb, sim: GL}
|
||||
- {name: counter_la, sim: GL}
|
||||
- {name: counter_la_reset, sim: GL}
|
||||
- {name: counter_la_clk, sim: GL}
|
||||
|
||||
32
verilog/dv/io_ports/Makefile
Normal file
32
verilog/dv/io_ports/Makefile
Normal file
@@ -0,0 +1,32 @@
|
||||
# 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
|
||||
|
||||
|
||||
|
||||
PWDD := $(shell pwd)
|
||||
BLOCKS := $(shell basename $(PWDD))
|
||||
|
||||
# ---- Include Partitioned Makefiles ----
|
||||
|
||||
CONFIG = caravel_user_project
|
||||
|
||||
|
||||
include $(MCW_ROOT)/verilog/dv/make/env.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/var.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/cpu.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/sim.makefile
|
||||
|
||||
|
||||
75
verilog/dv/io_ports/io_ports.c
Normal file
75
verilog/dv/io_ports/io_ports.c
Normal file
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
// This include is relative to $CARAVEL_PATH (see Makefile)
|
||||
#include <defs.h>
|
||||
#include <stub.c>
|
||||
|
||||
/*
|
||||
IO Test:
|
||||
- Configures MPRJ lower 8-IO pins as outputs
|
||||
- Observes counter value through the MPRJ lower 8 IO pins (in the testbench)
|
||||
*/
|
||||
|
||||
void main()
|
||||
{
|
||||
/*
|
||||
IO Control Registers
|
||||
| DM | VTRIP | SLOW | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
|
||||
| 3-bits | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit |
|
||||
|
||||
Output: 0000_0110_0000_1110 (0x1808) = GPIO_MODE_USER_STD_OUTPUT
|
||||
| DM | VTRIP | SLOW | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
|
||||
| 110 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
|
||||
|
||||
|
||||
Input: 0000_0001_0000_1111 (0x0402) = GPIO_MODE_USER_STD_INPUT_NOPULL
|
||||
| DM | VTRIP | SLOW | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
|
||||
| 001 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
|
||||
|
||||
*/
|
||||
|
||||
/* Set up the housekeeping SPI to be connected internally so */
|
||||
/* that external pin changes don't affect it. */
|
||||
|
||||
// reg_spi_enable = 1;
|
||||
// reg_spimaster_cs = 0x10001;
|
||||
// reg_spimaster_control = 0x0801;
|
||||
|
||||
// reg_spimaster_control = 0xa002; // Enable, prescaler = 2,
|
||||
// connect to housekeeping SPI
|
||||
|
||||
// Connect the housekeeping SPI to the SPI master
|
||||
// so that the CSB line is not left floating. This allows
|
||||
// all of the GPIO pins to be used for user functions.
|
||||
|
||||
// Configure lower 8-IOs as user output
|
||||
// Observe counter value in the testbench
|
||||
reg_mprj_io_0 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_1 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_2 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_3 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_4 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_5 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_6 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_7 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
|
||||
/* Apply configuration */
|
||||
reg_mprj_xfer = 1;
|
||||
while (reg_mprj_xfer == 1);
|
||||
}
|
||||
|
||||
267
verilog/dv/io_ports/io_ports_tb.v
Normal file
267
verilog/dv/io_ports/io_ports_tb.v
Normal file
@@ -0,0 +1,267 @@
|
||||
// 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 io_ports_tb;
|
||||
reg clock;
|
||||
reg RSTB;
|
||||
reg CSB;
|
||||
reg power1, power2;
|
||||
reg power3, power4;
|
||||
|
||||
wire gpio;
|
||||
wire [37:0] mprj_io;
|
||||
wire [7:0] mprj_io_0;
|
||||
|
||||
assign mprj_io_0 = mprj_io[7:0];
|
||||
// assign mprj_io_0 = {mprj_io[8:4],mprj_io[2:0]};
|
||||
|
||||
assign mprj_io[3] = (CSB == 1'b1) ? 1'b1 : 1'bz;
|
||||
// assign mprj_io[3] = 1'b1;
|
||||
|
||||
// External clock is used by default. Make this artificially fast for the
|
||||
// simulation. Normally this would be a slow clock and the digital PLL
|
||||
// would be the fast clock.
|
||||
|
||||
always #12.5 clock <= (clock === 1'b0);
|
||||
|
||||
initial begin
|
||||
clock = 0;
|
||||
end
|
||||
|
||||
|
||||
`ifdef ENABLE_SDF
|
||||
initial begin
|
||||
$sdf_annotate("../../../sdf/user_proj_example.sdf", uut.mprj) ;
|
||||
$sdf_annotate("../../../sdf/user_project_wrapper.sdf", uut.mprj.mprj) ;
|
||||
$sdf_annotate("../../../mgmt_core_wrapper/sdf/DFFRAM.sdf", uut.soc.DFFRAM_0) ;
|
||||
$sdf_annotate("../../../mgmt_core_wrapper/sdf/mgmt_core.sdf", uut.soc.core) ;
|
||||
$sdf_annotate("../../../caravel/sdf/housekeeping.sdf", uut.housekeeping) ;
|
||||
$sdf_annotate("../../../caravel/sdf/chip_io.sdf", uut.padframe) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mprj_logic_high.sdf", uut.mgmt_buffers.mprj_logic_high_inst) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mprj2_logic_high.sdf", uut.mgmt_buffers.mprj2_logic_high_inst) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mgmt_protect_hv.sdf", uut.mgmt_buffers.powergood_check) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mgmt_protect.sdf", uut.mgmt_buffers) ;
|
||||
$sdf_annotate("../../../caravel/sdf/caravel_clocking.sdf", uut.clocking) ;
|
||||
$sdf_annotate("../../../caravel/sdf/digital_pll.sdf", uut.pll) ;
|
||||
$sdf_annotate("../../../caravel/sdf/xres_buf.sdf", uut.rstb_level) ;
|
||||
$sdf_annotate("../../../caravel/sdf/user_id_programming.sdf", uut.user_id_value) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_1[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_1[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[6] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[7] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[8] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[9] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[10] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[6] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[7] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[8] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[9] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[10] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[11] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[12] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[13] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[14] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[15] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_0[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_0[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_5) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_6) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_7) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_8) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_9) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_10) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_11) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_12) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_13) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_14) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_15) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_16) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_17) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_18) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_19) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_20) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_21) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_22) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_23) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_24) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_25) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_26) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_27) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_28) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_29) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_30) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_31) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_32) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_33) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_34) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_35) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_36) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_37) ;
|
||||
end
|
||||
`endif
|
||||
|
||||
initial begin
|
||||
$dumpfile("io_ports.vcd");
|
||||
$dumpvars(0, io_ports_tb);
|
||||
|
||||
// Repeat cycles of 1000 clock edges as needed to complete testbench
|
||||
repeat (25) begin
|
||||
repeat (1000) @(posedge clock);
|
||||
// $display("+1000 cycles");
|
||||
end
|
||||
$display("%c[1;31m",27);
|
||||
`ifdef GL
|
||||
$display ("Monitor: Timeout, Test Mega-Project IO Ports (GL) Failed");
|
||||
`else
|
||||
$display ("Monitor: Timeout, Test Mega-Project IO Ports (RTL) Failed");
|
||||
`endif
|
||||
$display("%c[0m",27);
|
||||
$finish;
|
||||
end
|
||||
|
||||
initial begin
|
||||
// Observe Output pins [7:0]
|
||||
wait(mprj_io_0 == 8'h01);
|
||||
wait(mprj_io_0 == 8'h02);
|
||||
wait(mprj_io_0 == 8'h03);
|
||||
wait(mprj_io_0 == 8'h04);
|
||||
wait(mprj_io_0 == 8'h05);
|
||||
wait(mprj_io_0 == 8'h06);
|
||||
wait(mprj_io_0 == 8'h07);
|
||||
wait(mprj_io_0 == 8'h08);
|
||||
wait(mprj_io_0 == 8'h09);
|
||||
wait(mprj_io_0 == 8'h0A);
|
||||
wait(mprj_io_0 == 8'hFF);
|
||||
wait(mprj_io_0 == 8'h00);
|
||||
|
||||
`ifdef GL
|
||||
$display("Monitor: Test 1 Mega-Project IO (GL) Passed");
|
||||
`else
|
||||
$display("Monitor: Test 1 Mega-Project IO (RTL) Passed");
|
||||
`endif
|
||||
$finish;
|
||||
end
|
||||
|
||||
initial begin
|
||||
RSTB <= 1'b0;
|
||||
CSB <= 1'b1; // Force CSB high
|
||||
#2000;
|
||||
RSTB <= 1'b1; // Release reset
|
||||
#3_00_000;
|
||||
CSB = 1'b0; // CSB can be released
|
||||
end
|
||||
|
||||
initial begin // Power-up sequence
|
||||
power1 <= 1'b0;
|
||||
power2 <= 1'b0;
|
||||
power3 <= 1'b0;
|
||||
power4 <= 1'b0;
|
||||
#100;
|
||||
power1 <= 1'b1;
|
||||
#100;
|
||||
power2 <= 1'b1;
|
||||
#100;
|
||||
power3 <= 1'b1;
|
||||
#100;
|
||||
power4 <= 1'b1;
|
||||
end
|
||||
|
||||
always @(mprj_io) begin
|
||||
#1 $display("MPRJ-IO state = %b ", mprj_io[7:0]);
|
||||
end
|
||||
|
||||
wire flash_csb;
|
||||
wire flash_clk;
|
||||
wire flash_io0;
|
||||
wire flash_io1;
|
||||
|
||||
wire VDD3V3;
|
||||
wire VDD1V8;
|
||||
wire VSS;
|
||||
|
||||
assign VDD3V3 = power1;
|
||||
assign VDD1V8 = power2;
|
||||
assign VSS = 1'b0;
|
||||
|
||||
caravel uut (
|
||||
.vddio (VDD3V3),
|
||||
.vddio_2 (VDD3V3),
|
||||
.vssio (VSS),
|
||||
.vssio_2 (VSS),
|
||||
.vdda (VDD3V3),
|
||||
.vssa (VSS),
|
||||
.vccd (VDD1V8),
|
||||
.vssd (VSS),
|
||||
.vdda1 (VDD3V3),
|
||||
.vdda1_2 (VDD3V3),
|
||||
.vdda2 (VDD3V3),
|
||||
.vssa1 (VSS),
|
||||
.vssa1_2 (VSS),
|
||||
.vssa2 (VSS),
|
||||
.vccd1 (VDD1V8),
|
||||
.vccd2 (VDD1V8),
|
||||
.vssd1 (VSS),
|
||||
.vssd2 (VSS),
|
||||
.clock (clock),
|
||||
.gpio (gpio),
|
||||
.mprj_io (mprj_io),
|
||||
.flash_csb(flash_csb),
|
||||
.flash_clk(flash_clk),
|
||||
.flash_io0(flash_io0),
|
||||
.flash_io1(flash_io1),
|
||||
.resetb (RSTB)
|
||||
);
|
||||
|
||||
spiflash #(
|
||||
.FILENAME("io_ports.hex")
|
||||
) spiflash (
|
||||
.csb(flash_csb),
|
||||
.clk(flash_clk),
|
||||
.io0(flash_io0),
|
||||
.io1(flash_io1),
|
||||
.io2(), // not used
|
||||
.io3() // not used
|
||||
);
|
||||
|
||||
endmodule
|
||||
`default_nettype wire
|
||||
32
verilog/dv/la_test1/Makefile
Normal file
32
verilog/dv/la_test1/Makefile
Normal file
@@ -0,0 +1,32 @@
|
||||
# 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
|
||||
|
||||
|
||||
|
||||
PWDD := $(shell pwd)
|
||||
BLOCKS := $(shell basename $(PWDD))
|
||||
|
||||
# ---- Include Partitioned Makefiles ----
|
||||
|
||||
CONFIG = caravel_user_project
|
||||
|
||||
|
||||
include $(MCW_ROOT)/verilog/dv/make/env.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/var.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/cpu.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/sim.makefile
|
||||
|
||||
|
||||
130
verilog/dv/la_test1/la_test1.c
Normal file
130
verilog/dv/la_test1/la_test1.c
Normal file
@@ -0,0 +1,130 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
// This include is relative to $CARAVEL_PATH (see Makefile)
|
||||
#include <defs.h>
|
||||
#include <stub.c>
|
||||
|
||||
// --------------------------------------------------------
|
||||
|
||||
/*
|
||||
MPRJ Logic Analyzer Test:
|
||||
- Observes counter value through LA probes [31:0]
|
||||
- Sets counter initial value through LA probes [63:32]
|
||||
- Flags when counter value exceeds 500 through the management SoC gpio
|
||||
- Outputs message to the UART when the test concludes successfuly
|
||||
*/
|
||||
|
||||
void main()
|
||||
{
|
||||
int j;
|
||||
|
||||
/* Set up the housekeeping SPI to be connected internally so */
|
||||
/* that external pin changes don't affect it. */
|
||||
|
||||
// reg_spi_enable = 1;
|
||||
// reg_spimaster_cs = 0x00000;
|
||||
|
||||
// reg_spimaster_control = 0x0801;
|
||||
|
||||
// reg_spimaster_control = 0xa002; // Enable, prescaler = 2,
|
||||
// connect to housekeeping SPI
|
||||
|
||||
// Connect the housekeeping SPI to the SPI master
|
||||
// so that the CSB line is not left floating. This allows
|
||||
// all of the GPIO pins to be used for user functions.
|
||||
|
||||
// The upper GPIO pins are configured to be output
|
||||
// and accessble to the management SoC.
|
||||
// Used to flad the start/end of a test
|
||||
// The lower GPIO pins are configured to be output
|
||||
// and accessible to the user project. They show
|
||||
// the project count value, although this test is
|
||||
// designed to read the project count through the
|
||||
// logic analyzer probes.
|
||||
// I/O 6 is configured for the UART Tx line
|
||||
|
||||
reg_mprj_io_31 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_30 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_29 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_28 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_27 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_26 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_25 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_24 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_23 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_22 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_21 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_20 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_19 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_18 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_17 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_16 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
|
||||
reg_mprj_io_15 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_14 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_13 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_12 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_11 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_10 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_9 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_8 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_7 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_5 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_4 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_3 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_2 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_1 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_0 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
|
||||
reg_mprj_io_6 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
|
||||
// Set UART clock to 64 kbaud (enable before I/O configuration)
|
||||
// reg_uart_clkdiv = 625;
|
||||
reg_uart_enable = 1;
|
||||
|
||||
// Now, apply the configuration
|
||||
reg_mprj_xfer = 1;
|
||||
while (reg_mprj_xfer == 1);
|
||||
|
||||
// Configure LA probes [31:0], [127:64] as inputs to the cpu
|
||||
// Configure LA probes [63:32] as outputs from the cpu
|
||||
reg_la0_oenb = reg_la0_iena = 0x00000000; // [31:0]
|
||||
reg_la1_oenb = reg_la1_iena = 0xFFFFFFFF; // [63:32]
|
||||
reg_la2_oenb = reg_la2_iena = 0x00000000; // [95:64]
|
||||
reg_la3_oenb = reg_la3_iena = 0x00000000; // [127:96]
|
||||
|
||||
// Flag start of the test
|
||||
reg_mprj_datal = 0xAB400000;
|
||||
|
||||
// Set Counter value to zero through LA probes [63:32]
|
||||
reg_la1_data = 0x00000000;
|
||||
|
||||
// Configure LA probes from [63:32] as inputs to disable counter write
|
||||
reg_la1_oenb = reg_la1_iena = 0x00000000;
|
||||
|
||||
while (1) {
|
||||
if (reg_la0_data_in > 0x1F4) {
|
||||
reg_mprj_datal = 0xAB410000;
|
||||
break;
|
||||
}
|
||||
}
|
||||
print("\n");
|
||||
print("Monitor: Test 1 Passed\n\n"); // Makes simulation very long!
|
||||
reg_mprj_datal = 0xAB510000;
|
||||
}
|
||||
|
||||
247
verilog/dv/la_test1/la_test1_tb.v
Normal file
247
verilog/dv/la_test1/la_test1_tb.v
Normal file
@@ -0,0 +1,247 @@
|
||||
// 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 la_test1_tb;
|
||||
reg clock;
|
||||
reg RSTB;
|
||||
reg CSB;
|
||||
|
||||
reg power1, power2;
|
||||
|
||||
wire gpio;
|
||||
wire uart_tx;
|
||||
wire [37:0] mprj_io;
|
||||
wire [15:0] checkbits;
|
||||
|
||||
assign checkbits = mprj_io[31:16];
|
||||
assign uart_tx = mprj_io[6];
|
||||
|
||||
always #12.5 clock <= (clock === 1'b0);
|
||||
|
||||
initial begin
|
||||
clock = 0;
|
||||
end
|
||||
|
||||
`ifdef ENABLE_SDF
|
||||
initial begin
|
||||
$sdf_annotate("../../../sdf/user_proj_example.sdf", uut.mprj) ;
|
||||
$sdf_annotate("../../../sdf/user_project_wrapper.sdf", uut.mprj.mprj) ;
|
||||
$sdf_annotate("../../../mgmt_core_wrapper/sdf/DFFRAM.sdf", uut.soc.DFFRAM_0) ;
|
||||
$sdf_annotate("../../../mgmt_core_wrapper/sdf/mgmt_core.sdf", uut.soc.core) ;
|
||||
$sdf_annotate("../../../caravel/sdf/housekeeping.sdf", uut.housekeeping) ;
|
||||
$sdf_annotate("../../../caravel/sdf/chip_io.sdf", uut.padframe) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mprj_logic_high.sdf", uut.mgmt_buffers.mprj_logic_high_inst) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mprj2_logic_high.sdf", uut.mgmt_buffers.mprj2_logic_high_inst) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mgmt_protect_hv.sdf", uut.mgmt_buffers.powergood_check) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mgmt_protect.sdf", uut.mgmt_buffers) ;
|
||||
$sdf_annotate("../../../caravel/sdf/caravel_clocking.sdf", uut.clocking) ;
|
||||
$sdf_annotate("../../../caravel/sdf/digital_pll.sdf", uut.pll) ;
|
||||
$sdf_annotate("../../../caravel/sdf/xres_buf.sdf", uut.rstb_level) ;
|
||||
$sdf_annotate("../../../caravel/sdf/user_id_programming.sdf", uut.user_id_value) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_1[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_1[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[6] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[7] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[8] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[9] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[10] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[6] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[7] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[8] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[9] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[10] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[11] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[12] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[13] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[14] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[15] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_0[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_0[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_5) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_6) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_7) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_8) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_9) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_10) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_11) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_12) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_13) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_14) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_15) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_16) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_17) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_18) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_19) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_20) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_21) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_22) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_23) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_24) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_25) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_26) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_27) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_28) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_29) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_30) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_31) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_32) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_33) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_34) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_35) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_36) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_37) ;
|
||||
end
|
||||
`endif
|
||||
|
||||
// assign mprj_io[3] = 1'b1;
|
||||
|
||||
initial begin
|
||||
$dumpfile("la_test1.vcd");
|
||||
$dumpvars(0, la_test1_tb);
|
||||
|
||||
// Repeat cycles of 1000 clock edges as needed to complete testbench
|
||||
repeat (250) begin
|
||||
repeat (1000) @(posedge clock);
|
||||
// $display("+1000 cycles");
|
||||
end
|
||||
$display("%c[1;31m",27);
|
||||
`ifdef GL
|
||||
$display ("Monitor: Timeout, Test LA (GL) Failed");
|
||||
`else
|
||||
$display ("Monitor: Timeout, Test LA (RTL) Failed");
|
||||
`endif
|
||||
$display("%c[0m",27);
|
||||
$finish;
|
||||
end
|
||||
|
||||
initial begin
|
||||
wait(checkbits == 16'hAB40);
|
||||
$display("LA Test 1 started");
|
||||
wait(checkbits == 16'hAB41);
|
||||
wait(checkbits == 16'hAB51);
|
||||
$display("LA Test 2 passed");
|
||||
#10000;
|
||||
$finish;
|
||||
end
|
||||
|
||||
initial begin
|
||||
RSTB <= 1'b0;
|
||||
CSB <= 1'b1; // Force CSB high
|
||||
#2000;
|
||||
RSTB <= 1'b1; // Release reset
|
||||
#170000;
|
||||
CSB = 1'b0; // CSB can be released
|
||||
end
|
||||
|
||||
initial begin // Power-up sequence
|
||||
power1 <= 1'b0;
|
||||
power2 <= 1'b0;
|
||||
#200;
|
||||
power1 <= 1'b1;
|
||||
#200;
|
||||
power2 <= 1'b1;
|
||||
end
|
||||
|
||||
wire flash_csb;
|
||||
wire flash_clk;
|
||||
wire flash_io0;
|
||||
wire flash_io1;
|
||||
|
||||
wire VDD1V8;
|
||||
wire VDD3V3;
|
||||
wire VSS;
|
||||
|
||||
assign VDD3V3 = power1;
|
||||
assign VDD1V8 = power2;
|
||||
assign VSS = 1'b0;
|
||||
|
||||
assign mprj_io[3] = 1; // Force CSB high.
|
||||
assign mprj_io[0] = 0; // Disable debug mode
|
||||
|
||||
caravel uut (
|
||||
.vddio (VDD3V3),
|
||||
.vddio_2 (VDD3V3),
|
||||
.vssio (VSS),
|
||||
.vssio_2 (VSS),
|
||||
.vdda (VDD3V3),
|
||||
.vssa (VSS),
|
||||
.vccd (VDD1V8),
|
||||
.vssd (VSS),
|
||||
.vdda1 (VDD3V3),
|
||||
.vdda1_2 (VDD3V3),
|
||||
.vdda2 (VDD3V3),
|
||||
.vssa1 (VSS),
|
||||
.vssa1_2 (VSS),
|
||||
.vssa2 (VSS),
|
||||
.vccd1 (VDD1V8),
|
||||
.vccd2 (VDD1V8),
|
||||
.vssd1 (VSS),
|
||||
.vssd2 (VSS),
|
||||
.clock (clock),
|
||||
.gpio (gpio),
|
||||
.mprj_io (mprj_io),
|
||||
.flash_csb(flash_csb),
|
||||
.flash_clk(flash_clk),
|
||||
.flash_io0(flash_io0),
|
||||
.flash_io1(flash_io1),
|
||||
.resetb (RSTB)
|
||||
);
|
||||
|
||||
spiflash #(
|
||||
.FILENAME("la_test1.hex")
|
||||
) spiflash (
|
||||
.csb(flash_csb),
|
||||
.clk(flash_clk),
|
||||
.io0(flash_io0),
|
||||
.io1(flash_io1),
|
||||
.io2(), // not used
|
||||
.io3() // not used
|
||||
);
|
||||
|
||||
// Testbench UART
|
||||
tbuart tbuart (
|
||||
.ser_rx(uart_tx)
|
||||
);
|
||||
|
||||
endmodule
|
||||
`default_nettype wire
|
||||
32
verilog/dv/la_test2/Makefile
Normal file
32
verilog/dv/la_test2/Makefile
Normal file
@@ -0,0 +1,32 @@
|
||||
# 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
|
||||
|
||||
|
||||
|
||||
PWDD := $(shell pwd)
|
||||
BLOCKS := $(shell basename $(PWDD))
|
||||
|
||||
# ---- Include Partitioned Makefiles ----
|
||||
|
||||
CONFIG = caravel_user_project
|
||||
|
||||
|
||||
include $(MCW_ROOT)/verilog/dv/make/env.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/var.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/cpu.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/sim.makefile
|
||||
|
||||
|
||||
120
verilog/dv/la_test2/la_test2.c
Normal file
120
verilog/dv/la_test2/la_test2.c
Normal file
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
// This include is relative to $CARAVEL_PATH (see Makefile)
|
||||
#include <defs.h>
|
||||
#include <stub.c>
|
||||
|
||||
/*
|
||||
MPRJ LA Test:
|
||||
- Sets counter clk through LA[64]
|
||||
- Sets counter rst through LA[65]
|
||||
- Observes count value for five clk cycle through LA[31:0]
|
||||
*/
|
||||
|
||||
int clk = 0;
|
||||
int i;
|
||||
|
||||
void main()
|
||||
{
|
||||
/* Set up the housekeeping SPI to be connected internally so */
|
||||
/* that external pin changes don't affect it. */
|
||||
|
||||
// reg_spimaster_config = 0xa002; // Enable, prescaler = 2,
|
||||
reg_spi_enable = 1;
|
||||
// connect to housekeeping SPI
|
||||
|
||||
// Connect the housekeeping SPI to the SPI master
|
||||
// so that the CSB line is not left floating. This allows
|
||||
// all of the GPIO pins to be used for user functions.
|
||||
|
||||
|
||||
// All GPIO pins are configured to be output
|
||||
// Used to flad the start/end of a test
|
||||
|
||||
reg_mprj_io_31 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_30 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_29 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_28 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_27 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_26 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_25 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_24 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_23 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_22 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_21 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_20 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_19 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_18 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_17 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_16 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
|
||||
reg_mprj_io_15 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_14 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_13 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_12 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_11 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_10 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_9 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_8 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_7 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_5 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_4 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_3 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_2 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_1 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
reg_mprj_io_0 = GPIO_MODE_USER_STD_OUTPUT;
|
||||
|
||||
/* Apply configuration */
|
||||
reg_mprj_xfer = 1;
|
||||
while (reg_mprj_xfer == 1);
|
||||
|
||||
// Configure All LA probes as inputs to the cpu
|
||||
reg_la0_oenb = reg_la0_iena = 0x00000000; // [31:0]
|
||||
reg_la1_oenb = reg_la1_iena = 0x00000000; // [63:32]
|
||||
reg_la2_oenb = reg_la2_iena = 0x00000000; // [95:64]
|
||||
reg_la3_oenb = reg_la3_iena = 0x00000000; // [127:96]
|
||||
|
||||
// Flag start of the test
|
||||
reg_mprj_datal = 0xAB600000;
|
||||
|
||||
// Configure LA[64] LA[65] as outputs from the cpu
|
||||
reg_la2_oenb = reg_la2_iena = 0x00000003;
|
||||
|
||||
// Set clk & reset to one
|
||||
reg_la2_data = 0x00000003;
|
||||
|
||||
// DELAY
|
||||
for (i=0; i<5; i=i+1) {}
|
||||
|
||||
// Toggle clk & de-assert reset
|
||||
for (i=0; i<11; i=i+1) {
|
||||
clk = !clk;
|
||||
reg_la2_data = 0x00000000 | clk;
|
||||
}
|
||||
|
||||
// reg_mprj_datal = 0xAB610000;
|
||||
|
||||
while (1){
|
||||
if (reg_la0_data_in >= 0x05) {
|
||||
reg_mprj_datal = 0xAB610000;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
242
verilog/dv/la_test2/la_test2_tb.v
Normal file
242
verilog/dv/la_test2/la_test2_tb.v
Normal file
@@ -0,0 +1,242 @@
|
||||
// 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 la_test2_tb;
|
||||
reg clock;
|
||||
reg RSTB;
|
||||
reg CSB;
|
||||
reg power1, power2;
|
||||
reg power3, power4;
|
||||
|
||||
wire gpio;
|
||||
wire [37:0] mprj_io;
|
||||
wire [15:0] checkbits;
|
||||
|
||||
assign checkbits = mprj_io[31:16];
|
||||
assign mprj_io[3] = (CSB == 1'b1) ? 1'b1 : 1'bz;
|
||||
|
||||
always #15 clock <= (clock === 1'b0);
|
||||
|
||||
initial begin
|
||||
clock = 0;
|
||||
end
|
||||
|
||||
|
||||
`ifdef ENABLE_SDF
|
||||
initial begin
|
||||
$sdf_annotate("../../../sdf/user_proj_example.sdf", uut.mprj) ;
|
||||
$sdf_annotate("../../../sdf/user_project_wrapper.sdf", uut.mprj.mprj) ;
|
||||
$sdf_annotate("../../../mgmt_core_wrapper/sdf/DFFRAM.sdf", uut.soc.DFFRAM_0) ;
|
||||
// these breaks the simulation
|
||||
$sdf_annotate("../../../mgmt_core_wrapper/sdf/mgmt_core.sdf", uut.soc.core) ;
|
||||
$sdf_annotate("../../../caravel/sdf/housekeeping.sdf", uut.housekeeping) ;
|
||||
$sdf_annotate("../../../caravel/sdf/chip_io.sdf", uut.padframe) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mprj_logic_high.sdf", uut.mgmt_buffers.mprj_logic_high_inst) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mprj2_logic_high.sdf", uut.mgmt_buffers.mprj2_logic_high_inst) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mgmt_protect_hv.sdf", uut.mgmt_buffers.powergood_check) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mgmt_protect.sdf", uut.mgmt_buffers) ;
|
||||
$sdf_annotate("../../../caravel/sdf/caravel_clocking.sdf", uut.clocking) ;
|
||||
$sdf_annotate("../../../caravel/sdf/digital_pll.sdf", uut.pll) ;
|
||||
$sdf_annotate("../../../caravel/sdf/xres_buf.sdf", uut.rstb_level) ;
|
||||
$sdf_annotate("../../../caravel/sdf/user_id_programming.sdf", uut.user_id_value) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_1[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_1[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[6] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[7] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[8] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[9] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[10] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[6] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[7] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[8] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[9] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[10] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[11] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[12] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[13] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[14] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[15] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_0[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_0[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_5) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_6) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_7) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_8) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_9) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_10) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_11) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_12) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_13) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_14) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_15) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_16) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_17) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_18) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_19) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_20) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_21) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_22) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_23) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_24) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_25) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_26) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_27) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_28) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_29) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_30) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_31) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_32) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_33) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_34) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_35) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_36) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_37) ;
|
||||
end
|
||||
`endif
|
||||
|
||||
initial begin
|
||||
$dumpfile("la_test2.vcd");
|
||||
$dumpvars(0, la_test2_tb);
|
||||
|
||||
// Repeat cycles of 1000 clock edges as needed to complete testbench
|
||||
repeat (75) begin
|
||||
repeat (1000) @(posedge clock);
|
||||
// $display("+1000 cycles");
|
||||
end
|
||||
$display("%c[1;31m",27);
|
||||
`ifdef GL
|
||||
$display ("Monitor: Timeout, Test Mega-Project IO (GL) Failed");
|
||||
`else
|
||||
$display ("Monitor: Timeout, Test Mega-Project IO (RTL) Failed");
|
||||
`endif
|
||||
$display("%c[0m",27);
|
||||
$finish;
|
||||
end
|
||||
|
||||
initial begin
|
||||
wait(checkbits == 16'hAB60);
|
||||
$display("Monitor: Test 2 MPRJ-Logic Analyzer Started");
|
||||
wait(checkbits == 16'hAB61);
|
||||
$display("Monitor: Test 2 MPRJ-Logic Analyzer Passed");
|
||||
$finish;
|
||||
end
|
||||
|
||||
initial begin
|
||||
RSTB <= 1'b0;
|
||||
CSB <= 1'b1; // Force CSB high
|
||||
#2000;
|
||||
RSTB <= 1'b1; // Release reset
|
||||
#3_000_000;
|
||||
CSB = 1'b0; // CSB can be released
|
||||
end
|
||||
|
||||
initial begin // Power-up sequence
|
||||
power1 <= 1'b0;
|
||||
power2 <= 1'b0;
|
||||
power3 <= 1'b0;
|
||||
power4 <= 1'b0;
|
||||
#100;
|
||||
power1 <= 1'b1;
|
||||
#100;
|
||||
power2 <= 1'b1;
|
||||
#100;
|
||||
power3 <= 1'b1;
|
||||
#100;
|
||||
power4 <= 1'b1;
|
||||
end
|
||||
|
||||
wire flash_csb;
|
||||
wire flash_clk;
|
||||
wire flash_io0;
|
||||
wire flash_io1;
|
||||
|
||||
wire VDD3V3;
|
||||
wire VDD1V8;
|
||||
wire VSS;
|
||||
|
||||
assign VDD3V3 = power1;
|
||||
assign VDD1V8 = power2;
|
||||
assign VSS = 1'b0;
|
||||
|
||||
caravel uut (
|
||||
.vddio (VDD3V3),
|
||||
.vddio_2 (VDD3V3),
|
||||
.vssio (VSS),
|
||||
.vssio_2 (VSS),
|
||||
.vdda (VDD3V3),
|
||||
.vssa (VSS),
|
||||
.vccd (VDD1V8),
|
||||
.vssd (VSS),
|
||||
.vdda1 (VDD3V3),
|
||||
.vdda1_2 (VDD3V3),
|
||||
.vdda2 (VDD3V3),
|
||||
.vssa1 (VSS),
|
||||
.vssa1_2 (VSS),
|
||||
.vssa2 (VSS),
|
||||
.vccd1 (VDD1V8),
|
||||
.vccd2 (VDD1V8),
|
||||
.vssd1 (VSS),
|
||||
.vssd2 (VSS),
|
||||
.clock (clock),
|
||||
.gpio (gpio),
|
||||
.mprj_io (mprj_io),
|
||||
.flash_csb(flash_csb),
|
||||
.flash_clk(flash_clk),
|
||||
.flash_io0(flash_io0),
|
||||
.flash_io1(flash_io1),
|
||||
.resetb (RSTB)
|
||||
);
|
||||
|
||||
spiflash #(
|
||||
.FILENAME("la_test2.hex")
|
||||
) spiflash (
|
||||
.csb(flash_csb),
|
||||
.clk(flash_clk),
|
||||
.io0(flash_io0),
|
||||
.io1(flash_io1),
|
||||
.io2(),
|
||||
.io3()
|
||||
);
|
||||
|
||||
endmodule
|
||||
`default_nettype wire
|
||||
65
verilog/dv/local-install.md
Normal file
65
verilog/dv/local-install.md
Normal file
@@ -0,0 +1,65 @@
|
||||
# Local Installation (Linux)
|
||||
|
||||
Instructions to install the dv setup locally (dockerless install).
|
||||
|
||||
## You will need to fullfil these dependecies:
|
||||
|
||||
* Icarus Verilog (10.2+)
|
||||
* RV32I Toolchain
|
||||
|
||||
Using apt, you can install Icarus Verilog:
|
||||
|
||||
```bash
|
||||
sudo apt-get install iverilog
|
||||
```
|
||||
|
||||
Next, you will need to build the RV32I toolchain. Firstly, export the installation path for the RV32I toolchain,
|
||||
|
||||
```bash
|
||||
export GCC_PATH=<gcc-installation-path>
|
||||
```
|
||||
|
||||
Then, run the following:
|
||||
|
||||
```bash
|
||||
# packages needed:
|
||||
sudo apt-get install autoconf automake autotools-dev curl libmpc-dev \
|
||||
libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo \
|
||||
gperf libtool patchutils bc zlib1g-dev git libexpat1-dev
|
||||
|
||||
sudo mkdir $GCC_PATH
|
||||
sudo chown $USER $GCC_PATH
|
||||
|
||||
git clone https://github.com/riscv/riscv-gnu-toolchain riscv-gnu-toolchain-rv32i
|
||||
cd riscv-gnu-toolchain-rv32i
|
||||
git checkout 411d134
|
||||
git submodule update --init --recursive
|
||||
|
||||
mkdir build; cd build
|
||||
../configure --with-arch=rv32i --prefix=$GCC_PATH
|
||||
make -j$(nproc)
|
||||
```
|
||||
|
||||
# Running Simulation
|
||||
|
||||
You will need to export these environment variables:
|
||||
|
||||
```bash
|
||||
export GCC_PATH=<gcc-installation-path>
|
||||
export PDK_PATH=<pdk-location/sky130A>
|
||||
```
|
||||
|
||||
To run any simulation, you need to be on the top level or caravel_user_project.
|
||||
|
||||
To run RTL simulation for one of the DV tests,
|
||||
|
||||
```bash
|
||||
SIM=RTL make verify-<dv-test>
|
||||
```
|
||||
|
||||
To run gate level simulation for one of the DV tests,
|
||||
|
||||
```bash
|
||||
SIM=GL make verify-<dv-test>
|
||||
```
|
||||
|
||||
32
verilog/dv/mprj_stimulus/Makefile
Normal file
32
verilog/dv/mprj_stimulus/Makefile
Normal file
@@ -0,0 +1,32 @@
|
||||
# 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
|
||||
|
||||
|
||||
|
||||
PWDD := $(shell pwd)
|
||||
BLOCKS := $(shell basename $(PWDD))
|
||||
|
||||
# ---- Include Partitioned Makefiles ----
|
||||
|
||||
CONFIG = caravel_user_project
|
||||
|
||||
|
||||
include $(MCW_ROOT)/verilog/dv/make/env.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/var.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/cpu.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/sim.makefile
|
||||
|
||||
|
||||
136
verilog/dv/mprj_stimulus/mprj_stimulus.c
Normal file
136
verilog/dv/mprj_stimulus/mprj_stimulus.c
Normal file
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
// This include is relative to $CARAVEL_PATH (see Makefile)
|
||||
#include <defs.h>
|
||||
|
||||
// --------------------------------------------------------
|
||||
|
||||
void main()
|
||||
{
|
||||
// The upper GPIO pins are configured to be output
|
||||
// and accessble to the management SoC.
|
||||
// Used to flag the start/end of a test
|
||||
// The lower GPIO pins are configured to be output
|
||||
// and accessible to the user project. They show
|
||||
// the project count value, although this test is
|
||||
// designed to read the project count through the
|
||||
// logic analyzer probes.
|
||||
// I/O 6 is configured for the UART Tx line
|
||||
|
||||
uint32_t testval;
|
||||
|
||||
reg_mprj_datal = 0x00000000;
|
||||
reg_mprj_datah = 0x00000000;
|
||||
|
||||
reg_mprj_io_37 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_36 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_35 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_34 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_33 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_32 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
|
||||
reg_mprj_io_31 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_30 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_29 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_28 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_27 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_26 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_25 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_24 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_23 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_22 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_21 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_20 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_19 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_18 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_17 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_16 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
|
||||
reg_mprj_io_15 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
reg_mprj_io_14 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
reg_mprj_io_13 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
reg_mprj_io_12 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
reg_mprj_io_11 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
reg_mprj_io_10 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
reg_mprj_io_9 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
reg_mprj_io_8 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
reg_mprj_io_7 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
reg_mprj_io_6 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
reg_mprj_io_5 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
reg_mprj_io_4 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
// reg_mprj_io_3 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
reg_mprj_io_2 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
reg_mprj_io_1 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
reg_mprj_io_0 = GPIO_MODE_USER_STD_OUT_MONITORED;
|
||||
|
||||
/* Apply configuration */
|
||||
reg_mprj_xfer = 1;
|
||||
while (reg_mprj_xfer == 1);
|
||||
|
||||
/* TEST: Recast channels 35 to 32 to allow input to user project */
|
||||
/* This is done locally only: Do not run reg_mprj_xfer! */
|
||||
reg_mprj_io_35 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_34 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_33 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_32 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
|
||||
// Configure LA probes [31:0], [127:64] as inputs to the cpu
|
||||
// Configure LA probes [63:32] as outputs from the cpu
|
||||
reg_la0_oenb = reg_la0_iena = 0x00000000; // [31:0]
|
||||
reg_la1_oenb = reg_la1_iena = 0xFFFFFFFF; // [63:32]
|
||||
reg_la2_oenb = reg_la2_iena = 0x00000000; // [95:64]
|
||||
reg_la3_oenb = reg_la3_iena = 0x00000000; // [127:96]
|
||||
|
||||
// Flag start of the test
|
||||
reg_mprj_datal = 0xAB400000;
|
||||
|
||||
// Set Counter value to zero through LA probes [63:32]
|
||||
reg_la1_data = 0x00000000;
|
||||
|
||||
// Configure LA probes from [63:32] as inputs to disable counter write
|
||||
reg_la1_oenb = reg_la1_iena = 0x00000000;
|
||||
|
||||
reg_mprj_datal = 0xAB410000;
|
||||
reg_mprj_datah = 0x00000000;
|
||||
|
||||
// Test ability to force data on channel 37
|
||||
// NOTE: Only the low 6 bits of reg_mprj_datah are meaningful
|
||||
|
||||
reg_mprj_datah = 0x0f0f0fc0;
|
||||
reg_mprj_datah = 0x00000000;
|
||||
reg_mprj_datah = 0x0f0f0fca;
|
||||
reg_mprj_datah = 0x0000000a;
|
||||
reg_mprj_datah = 0x0f0f0fc0;
|
||||
reg_mprj_datah = 0x00000000;
|
||||
reg_mprj_datah = 0x0f0f0fc5;
|
||||
reg_mprj_datah = 0x00000005;
|
||||
|
||||
// Test ability to read back data generated by the user project
|
||||
// on the "monitored" outputs. Read from the lower 16 bits and
|
||||
// copy the value to the upper 16 bits.
|
||||
|
||||
testval = reg_mprj_datal;
|
||||
reg_mprj_datal = (testval << 16);
|
||||
reg_mprj_datah = 0x0000000a;
|
||||
testval = reg_mprj_datal;
|
||||
reg_mprj_datal = (testval << 16);
|
||||
reg_mprj_datah = 0x00000005;
|
||||
|
||||
// Flag end of the test
|
||||
reg_mprj_datal = 0xAB510000;
|
||||
}
|
||||
249
verilog/dv/mprj_stimulus/mprj_stimulus_tb.v
Normal file
249
verilog/dv/mprj_stimulus/mprj_stimulus_tb.v
Normal file
@@ -0,0 +1,249 @@
|
||||
// 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 wire
|
||||
|
||||
`timescale 1 ns / 1 ps
|
||||
|
||||
module mprj_stimulus_tb;
|
||||
// Signals declaration
|
||||
reg clock;
|
||||
reg RSTB;
|
||||
reg power1, power2;
|
||||
reg CSB;
|
||||
wire gpio;
|
||||
wire [37:0] mprj_io;
|
||||
wire [15:0] checkbits;
|
||||
reg [7:0] checkbits_temp;
|
||||
wire [3:0] status;
|
||||
|
||||
// Signals Assignment
|
||||
assign checkbits = mprj_io[31:16];
|
||||
assign status = mprj_io[35:32];
|
||||
|
||||
assign mprj_io[3] = (CSB == 1'b1) ? 1'b1 : 1'bz;
|
||||
|
||||
always #12.5 clock <= (clock === 1'b0);
|
||||
|
||||
initial begin
|
||||
clock = 0;
|
||||
end
|
||||
|
||||
`ifdef ENABLE_SDF
|
||||
initial begin
|
||||
$sdf_annotate("../../../sdf/user_proj_example.sdf", uut.mprj.mprj) ;
|
||||
$sdf_annotate("../../../mgmt_core_wrapper/sdf/DFFRAM.sdf", uut.soc.DFFRAM_0) ;
|
||||
$sdf_annotate("../../../mgmt_core_wrapper/sdf/mgmt_core.sdf", uut.soc.core) ;
|
||||
$sdf_annotate("../../../caravel/sdf/housekeeping.sdf", uut.housekeeping) ;
|
||||
$sdf_annotate("../../../caravel/sdf/chip_io.sdf", uut.padframe) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mprj_logic_high.sdf", uut.mgmt_buffers.mprj_logic_high_inst) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mprj2_logic_high.sdf", uut.mgmt_buffers.mprj2_logic_high_inst) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mgmt_protect_hv.sdf", uut.mgmt_buffers.powergood_check) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mgmt_protect.sdf", uut.mgmt_buffers) ;
|
||||
$sdf_annotate("../../../caravel/sdf/caravel_clocking.sdf", uut.clocking) ;
|
||||
$sdf_annotate("../../../caravel/sdf/digital_pll.sdf", uut.pll) ;
|
||||
$sdf_annotate("../../../caravel/sdf/xres_buf.sdf", uut.rstb_level) ;
|
||||
$sdf_annotate("../../../caravel/sdf/user_id_programming.sdf", uut.user_id_value) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_1[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_1[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[6] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[7] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[8] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[9] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[10] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[6] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[7] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[8] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[9] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[10] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[11] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[12] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[13] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[14] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[15] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_0[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_0[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_5) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_6) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_7) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_8) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_9) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_10) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_11) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_12) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_13) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_14) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_15) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_16) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_17) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_18) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_19) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_20) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_21) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_22) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_23) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_24) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_25) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_26) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_27) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_28) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_29) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_30) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_31) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_32) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_33) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_34) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_35) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_36) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_37) ;
|
||||
end
|
||||
`endif
|
||||
|
||||
initial begin
|
||||
$dumpfile("mprj_stimulus.vcd");
|
||||
$dumpvars(0, mprj_stimulus_tb);
|
||||
|
||||
// Repeat cycles of 1000 clock edges as needed to complete testbench
|
||||
repeat (100) begin
|
||||
repeat (1000) @(posedge clock);
|
||||
end
|
||||
$display("%c[1;31m",27);
|
||||
`ifdef GL
|
||||
$display ("Monitor: Timeout, Test Project IO Stimulus (GL) Failed");
|
||||
`else
|
||||
$display ("Monitor: Timeout, Test Project IO Stimulus (RTL) Failed");
|
||||
`endif
|
||||
$display("%c[0m",27);
|
||||
$finish;
|
||||
end
|
||||
|
||||
initial begin
|
||||
wait(checkbits == 16'hAB40);
|
||||
$display("Monitor: mprj_stimulus test started");
|
||||
wait(status == 4'ha);
|
||||
wait(status == 4'h5);
|
||||
|
||||
// Values reflect copying user-controlled outputs to memory and back
|
||||
// to management-controlled outputs.
|
||||
wait(status == 4'ha);
|
||||
checkbits_temp = checkbits; // store counter value
|
||||
$display("first value = %h",checkbits_temp);
|
||||
wait(status == 4'h5);
|
||||
$display("second value = %h",checkbits[7:0]);
|
||||
if ( checkbits[7:0] == checkbits_temp) begin
|
||||
$display ("Error: counter value doesn't change");
|
||||
$finish;
|
||||
end
|
||||
wait(checkbits == 16'hAB51);
|
||||
$display("Monitor: mprj_stimulus test Passed");
|
||||
#10000;
|
||||
$finish;
|
||||
end
|
||||
|
||||
// Reset Operation
|
||||
initial begin
|
||||
CSB <= 1'b1;
|
||||
RSTB <= 1'b0;
|
||||
#2000;
|
||||
RSTB <= 1'b1; // Release reset
|
||||
#1_300_000;
|
||||
CSB <= 1'b0; // Stop driving CSB
|
||||
end
|
||||
|
||||
initial begin // Power-up sequence
|
||||
power1 <= 1'b0;
|
||||
power2 <= 1'b0;
|
||||
#200;
|
||||
power1 <= 1'b1;
|
||||
#200;
|
||||
power2 <= 1'b1;
|
||||
end
|
||||
|
||||
wire flash_csb;
|
||||
wire flash_clk;
|
||||
wire flash_io0;
|
||||
wire flash_io1;
|
||||
|
||||
wire VDD3V3 = power1;
|
||||
wire VDD1V8 = power2;
|
||||
wire VSS = 1'b0;
|
||||
|
||||
caravel uut (
|
||||
.vddio (VDD3V3),
|
||||
.vddio_2 (VDD3V3),
|
||||
.vssio (VSS),
|
||||
.vssio_2 (VSS),
|
||||
.vdda (VDD3V3),
|
||||
.vssa (VSS),
|
||||
.vccd (VDD1V8),
|
||||
.vssd (VSS),
|
||||
.vdda1 (VDD3V3),
|
||||
.vdda1_2 (VDD3V3),
|
||||
.vdda2 (VDD3V3),
|
||||
.vssa1 (VSS),
|
||||
.vssa1_2 (VSS),
|
||||
.vssa2 (VSS),
|
||||
.vccd1 (VDD1V8),
|
||||
.vccd2 (VDD1V8),
|
||||
.vssd1 (VSS),
|
||||
.vssd2 (VSS),
|
||||
.clock (clock),
|
||||
.gpio (gpio),
|
||||
.mprj_io (mprj_io),
|
||||
.flash_csb(flash_csb),
|
||||
.flash_clk(flash_clk),
|
||||
.flash_io0(flash_io0),
|
||||
.flash_io1(flash_io1),
|
||||
.resetb (RSTB)
|
||||
);
|
||||
|
||||
|
||||
spiflash #(
|
||||
.FILENAME("mprj_stimulus.hex")
|
||||
) spiflash (
|
||||
.csb(flash_csb),
|
||||
.clk(flash_clk),
|
||||
.io0(flash_io0),
|
||||
.io1(flash_io1),
|
||||
.io2(), // not used
|
||||
.io3() // not used
|
||||
);
|
||||
|
||||
endmodule
|
||||
`default_nettype wire
|
||||
50
verilog/dv/setup-cocotb.py
Normal file
50
verilog/dv/setup-cocotb.py
Normal file
@@ -0,0 +1,50 @@
|
||||
# SPDX-FileCopyrightText: 2023 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
|
||||
import click
|
||||
import yaml
|
||||
|
||||
|
||||
@click.command()
|
||||
@click.argument('caravel_root', type=click.Path(exists=True))
|
||||
@click.argument('mcw_root', type=click.Path(exists=True))
|
||||
@click.argument('pdk_root', type=click.Path(exists=True))
|
||||
@click.argument('pdk')
|
||||
@click.argument('user_project_root', type=click.Path(exists=True))
|
||||
def update_design_info(caravel_root, mcw_root, pdk_root, pdk, user_project_root):
|
||||
data = {
|
||||
'CARAVEL_ROOT': caravel_root,
|
||||
'MCW_ROOT': mcw_root,
|
||||
'USER_PROJECT_ROOT': user_project_root,
|
||||
'PDK_ROOT': pdk_root,
|
||||
'PDK': pdk,
|
||||
'clk': 25,
|
||||
'caravan': False,
|
||||
'emailto': [None]
|
||||
}
|
||||
|
||||
with open(f'{user_project_root}/verilog/dv/cocotb/design_info.yaml', 'w') as file:
|
||||
yaml.dump(data, file)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
update_design_info()
|
||||
|
||||
# paths = EnvironmentPaths("/home/rady/caravel/caravel_orginal/caravel/",
|
||||
# "/home/rady/caravel/caravel_orginal/caravel_mgmt_soc_litex/",
|
||||
# "/home/rady/caravel/files4vcs/pdk","sky130A",
|
||||
# "/home/rady/caravel/swift/caravel_user_project/")
|
||||
|
||||
# WriteDesignInfo("/home/Marwan/caravel/swift/caravel-dynamic-sims/cocotb/",paths,Emailto=["mostafa.rady@efabless.com"])
|
||||
32
verilog/dv/wb_port/Makefile
Normal file
32
verilog/dv/wb_port/Makefile
Normal file
@@ -0,0 +1,32 @@
|
||||
# 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
|
||||
|
||||
|
||||
|
||||
PWDD := $(shell pwd)
|
||||
BLOCKS := $(shell basename $(PWDD))
|
||||
|
||||
# ---- Include Partitioned Makefiles ----
|
||||
|
||||
CONFIG = caravel_user_project
|
||||
|
||||
|
||||
include $(MCW_ROOT)/verilog/dv/make/env.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/var.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/cpu.makefile
|
||||
include $(MCW_ROOT)/verilog/dv/make/sim.makefile
|
||||
|
||||
|
||||
90
verilog/dv/wb_port/wb_port.c
Normal file
90
verilog/dv/wb_port/wb_port.c
Normal file
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
// This include is relative to $CARAVEL_PATH (see Makefile)
|
||||
#include <defs.h>
|
||||
#include <stub.c>
|
||||
|
||||
#define reg_mprj_slave (*(volatile uint32_t*)0x30000000)
|
||||
|
||||
/*
|
||||
Wishbone Test:
|
||||
- Configures MPRJ lower 8-IO pins as outputs
|
||||
- Checks counter value through the wishbone port
|
||||
*/
|
||||
|
||||
void main()
|
||||
{
|
||||
|
||||
/*
|
||||
IO Control Registers
|
||||
| DM | VTRIP | SLOW | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
|
||||
| 3-bits | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit | 1-bit |
|
||||
Output: 0000_0110_0000_1110 (0x1808) = GPIO_MODE_USER_STD_OUTPUT
|
||||
| DM | VTRIP | SLOW | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
|
||||
| 110 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
|
||||
|
||||
|
||||
Input: 0000_0001_0000_1111 (0x0402) = GPIO_MODE_USER_STD_INPUT_NOPULL
|
||||
| DM | VTRIP | SLOW | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
|
||||
| 001 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
|
||||
*/
|
||||
|
||||
/* Set up the housekeeping SPI to be connected internally so */
|
||||
/* that external pin changes don't affect it. */
|
||||
|
||||
reg_spi_enable = 1;
|
||||
reg_wb_enable = 1;
|
||||
// reg_spimaster_config = 0xa002; // Enable, prescaler = 2,
|
||||
// connect to housekeeping SPI
|
||||
|
||||
// Connect the housekeeping SPI to the SPI master
|
||||
// so that the CSB line is not left floating. This allows
|
||||
// all of the GPIO pins to be used for user functions.
|
||||
|
||||
reg_mprj_io_31 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_30 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_29 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_28 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_27 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_26 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_25 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_24 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_23 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_22 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_21 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_20 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_19 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_18 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_17 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
reg_mprj_io_16 = GPIO_MODE_MGMT_STD_OUTPUT;
|
||||
|
||||
/* Apply configuration */
|
||||
reg_mprj_xfer = 1;
|
||||
while (reg_mprj_xfer == 1);
|
||||
|
||||
reg_la2_oenb = reg_la2_iena = 0x00000000; // [95:64]
|
||||
|
||||
// Flag start of the test
|
||||
reg_mprj_datal = 0xAB600000;
|
||||
|
||||
reg_mprj_slave = 0x00002710;
|
||||
reg_mprj_datal = 0xAB610000;
|
||||
if (reg_mprj_slave == 0x2B3D) {
|
||||
reg_mprj_datal = 0xAB610000;
|
||||
}
|
||||
}
|
||||
242
verilog/dv/wb_port/wb_port_tb.v
Normal file
242
verilog/dv/wb_port/wb_port_tb.v
Normal file
@@ -0,0 +1,242 @@
|
||||
// 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 wb_port_tb;
|
||||
reg clock;
|
||||
reg RSTB;
|
||||
reg CSB;
|
||||
reg power1, power2;
|
||||
reg power3, power4;
|
||||
|
||||
wire gpio;
|
||||
wire [37:0] mprj_io;
|
||||
wire [7:0] mprj_io_0;
|
||||
wire [15:0] checkbits;
|
||||
|
||||
assign checkbits = mprj_io[31:16];
|
||||
|
||||
assign mprj_io[3] = 1'b1;
|
||||
|
||||
// External clock is used by default. Make this artificially fast for the
|
||||
// simulation. Normally this would be a slow clock and the digital PLL
|
||||
// would be the fast clock.
|
||||
|
||||
always #12.5 clock <= (clock === 1'b0);
|
||||
|
||||
initial begin
|
||||
clock = 0;
|
||||
end
|
||||
|
||||
`ifdef ENABLE_SDF
|
||||
initial begin
|
||||
$sdf_annotate("../../../sdf/user_proj_example.sdf", uut.mprj) ;
|
||||
$sdf_annotate("../../../sdf/user_project_wrapper.sdf", uut.mprj.mprj) ;
|
||||
$sdf_annotate("../../../mgmt_core_wrapper/sdf/DFFRAM.sdf", uut.soc.DFFRAM_0) ;
|
||||
$sdf_annotate("../../../mgmt_core_wrapper/sdf/mgmt_core.sdf", uut.soc.core) ;
|
||||
$sdf_annotate("../../../caravel/sdf/housekeeping.sdf", uut.housekeeping) ;
|
||||
$sdf_annotate("../../../caravel/sdf/chip_io.sdf", uut.padframe) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mprj_logic_high.sdf", uut.mgmt_buffers.mprj_logic_high_inst) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mprj2_logic_high.sdf", uut.mgmt_buffers.mprj2_logic_high_inst) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mgmt_protect_hv.sdf", uut.mgmt_buffers.powergood_check) ;
|
||||
$sdf_annotate("../../../caravel/sdf/mgmt_protect.sdf", uut.mgmt_buffers) ;
|
||||
$sdf_annotate("../../../caravel/sdf/caravel_clocking.sdf", uut.clocking) ;
|
||||
$sdf_annotate("../../../caravel/sdf/digital_pll.sdf", uut.pll) ;
|
||||
$sdf_annotate("../../../caravel/sdf/xres_buf.sdf", uut.rstb_level) ;
|
||||
$sdf_annotate("../../../caravel/sdf/user_id_programming.sdf", uut.user_id_value) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_1[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_1[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_bidir_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[6] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[7] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[8] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[9] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1[10] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_1a[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[3] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[4] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[5] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[6] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[7] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[8] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[9] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[10] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[11] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[12] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[13] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[14] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_control_block.sdf", uut.\gpio_control_in_2[15] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_0[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_0[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[0] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[1] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.\gpio_defaults_block_2[2] ) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_5) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_6) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_7) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_8) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_9) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_10) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_11) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_12) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_13) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_14) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_15) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_16) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_17) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_18) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_19) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_20) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_21) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_22) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_23) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_24) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_25) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_26) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_27) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_28) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_29) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_30) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_31) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_32) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_33) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_34) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_35) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_36) ;
|
||||
$sdf_annotate("../../../caravel/sdf/gpio_defaults_block.sdf", uut.gpio_defaults_block_37) ;
|
||||
end
|
||||
`endif
|
||||
|
||||
initial begin
|
||||
$dumpfile("wb_port.vcd");
|
||||
$dumpvars(0, wb_port_tb);
|
||||
|
||||
// Repeat cycles of 1000 clock edges as needed to complete testbench
|
||||
repeat (70) begin
|
||||
repeat (1000) @(posedge clock);
|
||||
// $display("+1000 cycles");
|
||||
end
|
||||
$display("%c[1;31m",27);
|
||||
`ifdef GL
|
||||
$display ("Monitor: Timeout, Test Mega-Project WB Port (GL) Failed");
|
||||
`else
|
||||
$display ("Monitor: Timeout, Test Mega-Project WB Port (RTL) Failed");
|
||||
`endif
|
||||
$display("%c[0m",27);
|
||||
$finish;
|
||||
end
|
||||
|
||||
initial begin
|
||||
wait(checkbits == 16'hAB60);
|
||||
$display("Monitor: MPRJ-Logic WB Started");
|
||||
wait(checkbits == 16'hAB61);
|
||||
`ifdef GL
|
||||
$display("Monitor: Mega-Project WB (GL) Passed");
|
||||
`else
|
||||
$display("Monitor: Mega-Project WB (RTL) Passed");
|
||||
`endif
|
||||
$finish;
|
||||
end
|
||||
|
||||
initial begin
|
||||
RSTB <= 1'b0;
|
||||
CSB <= 1'b1; // Force CSB high
|
||||
#2000;
|
||||
RSTB <= 1'b1; // Release reset
|
||||
#100000;
|
||||
CSB = 1'b0; // CSB can be released
|
||||
end
|
||||
|
||||
initial begin // Power-up sequence
|
||||
power1 <= 1'b0;
|
||||
power2 <= 1'b0;
|
||||
#200;
|
||||
power1 <= 1'b1;
|
||||
#200;
|
||||
power2 <= 1'b1;
|
||||
end
|
||||
|
||||
wire flash_csb;
|
||||
wire flash_clk;
|
||||
wire flash_io0;
|
||||
wire flash_io1;
|
||||
|
||||
wire VDD3V3 = power1;
|
||||
wire VDD1V8 = power2;
|
||||
wire USER_VDD3V3 = power3;
|
||||
wire USER_VDD1V8 = power4;
|
||||
wire VSS = 1'b0;
|
||||
|
||||
caravel uut (
|
||||
.vddio (VDD3V3),
|
||||
.vddio_2 (VDD3V3),
|
||||
.vssio (VSS),
|
||||
.vssio_2 (VSS),
|
||||
.vdda (VDD3V3),
|
||||
.vssa (VSS),
|
||||
.vccd (VDD1V8),
|
||||
.vssd (VSS),
|
||||
.vdda1 (VDD3V3),
|
||||
.vdda1_2 (VDD3V3),
|
||||
.vdda2 (VDD3V3),
|
||||
.vssa1 (VSS),
|
||||
.vssa1_2 (VSS),
|
||||
.vssa2 (VSS),
|
||||
.vccd1 (VDD1V8),
|
||||
.vccd2 (VDD1V8),
|
||||
.vssd1 (VSS),
|
||||
.vssd2 (VSS),
|
||||
.clock (clock),
|
||||
.gpio (gpio),
|
||||
.mprj_io (mprj_io),
|
||||
.flash_csb(flash_csb),
|
||||
.flash_clk(flash_clk),
|
||||
.flash_io0(flash_io0),
|
||||
.flash_io1(flash_io1),
|
||||
.resetb (RSTB)
|
||||
);
|
||||
|
||||
spiflash #(
|
||||
.FILENAME("wb_port.hex")
|
||||
) spiflash (
|
||||
.csb(flash_csb),
|
||||
.clk(flash_clk),
|
||||
.io0(flash_io0),
|
||||
.io1(flash_io1),
|
||||
.io2(), // not used
|
||||
.io3() // not used
|
||||
);
|
||||
|
||||
endmodule
|
||||
`default_nettype wire
|
||||
Reference in New Issue
Block a user