dv files updated
diff --git a/verilog/dv/Makefile b/verilog/dv/Makefile
index d87238f..dfbfe51 100644
--- a/verilog/dv/Makefile
+++ b/verilog/dv/Makefile
@@ -19,7 +19,7 @@
.SUFFIXES:
.SILENT: clean all
-PATTERNS = io_ports la_test1 la_test2 wb_port mprj_stimulus
+PATTERNS = fpu_test_add_sub fpu_test_comp fpu_test_div fpu_test_f2i fpu_test_fclass fpu_test_fma fpu_test_i2f fpu_test_min_max fpu_test_multiply fpu_test_sign_inject fpu_test_sqrt io_ports_fpu_test la_test2_fpu
all: ${PATTERNS}
for i in ${PATTERNS}; do \
diff --git a/verilog/dv/README.md b/verilog/dv/README.md
index 1a834f7..4c8da3e 100644
--- a/verilog/dv/README.md
+++ b/verilog/dv/README.md
@@ -16,129 +16,20 @@
# SPDX-License-Identifier: Apache-2.0
-->
-# Simulation Environment Setup
-
-There are two options for setting up the simulation environment:
-
-* Pulling a pre-built docker image
-* Installing the dependecies locally
-
-## 1. 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
-```
-
-## 2. Local Installion (Linux)
-
-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
-
-## Docker
-
-First, you will need to export a number of environment variables:
-
-```bash
-export PDK_PATH=<pdk-location/sky130A>
-export CARAVEL_ROOT=<caravel_root>
-export UPRJ_ROOT=<user_project_root>
-```
-
-Then, run the following command to start the docker container :
-
-```
-docker run -it -v $CARAVEL_ROOT:$CARAVEL_ROOT -v $PDK_PATH:$PDK_PATH -v $UPRJ_ROOT:$UPRJ_ROOT -e CARAVEL_ROOT=$CARAVEL_ROOT -e PDK_PATH=$PDK_PATH -e UPRJ_ROOT=$UPRJ_ROOT -u $(id -u $USER):$(id -g $USER) efabless/dv_setup:latest
-```
-
-Then, navigate to the directory where the DV tests reside :
-
-```bash
-cd $UPRJ_ROOT/verilog/dv/
-```
-
-Then, follow the instructions at [Both](#both) to run RTL/GL simulation.
-
-## Local
-
-You will need to export these environment variables:
-
-```bash
-export GCC_PATH=<gcc-installation-path>
-export PDK_PATH=<pdk-location/sky130A>
-```
-
-Then, follow the instruction at [Both](#both) to run RTL/GL simulation.
-
-## Both
-
-To run RTL simulation for one of the DV tests,
-
-```bash
-cd <dv-test>
-make
-```
-
-To run gate level simulation for one of the DV tests,
-
-```bash
-cd <dv-test>
-SIM=GL make
-```
# User Project Example DV
-The directory includes four tests for the counter user-project example:
+The directory includes multiple tests for the FPU 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:
+* This test is meant to verify that we can configure the pads for the user project area. The firmware configures the lower 32 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_0 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_1 = GPIO_MODE_USER_STD_OUTPUT;
.....
- reg_mprj_io_7 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_32 = 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.
@@ -147,19 +38,16 @@
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:
+* The testbench success criteria is that we can observe the fpu_result output value on the lower 32 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);
+ wait(mprj_io == 32'h00000003); //(in our case result was 0x00000003)
+
```
* If the testbench fails, it will print a timeout message to the terminal.
-### Logic Analyzer Test 1
+### Logic Analyzer Test
* 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.
@@ -173,64 +61,69 @@
while (reg_mprj_xfer == 1);
// Flag start of the test
- reg_mprj_datal = 0xAB400000;
+ reg_mprj_datal = 0xAB600000;
```
- 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.
+ 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'hAB60`, then we know that the test started.
```verilog
- wait(checkbits == 16'hAB40);
- $display("LA Test 1 started");
+ wait(checkbits == 16'hAB60);
+ $display("LA Test 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.
+* Then, the firmware configures the logic analyzer (LA) probes `[31:0]` as inputs to the user project example to send the address value, and configure the logic analyzer probes `[63:32]` as outputs from the management SoC (inputs to the user_proj_example) to set the data value to that particular address set earlier. 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 = 0xFFFFFFFF; // [31:0] inputs to mgmt_soc
- reg_la1_oenb = reg_la1_iena = 0x00000000; // [63:32] outputs from mgmt_soc
+ reg_la0_oenb = reg_la0_iena = 0x00000000;
+ reg_la1_oenb = reg_la1_iena = 0x00000000;
```
-* 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.
+ * In the user_proj_example 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_la1_data = 0x00000000; // Write zero to count register
- reg_la1_oenb = reg_la1_iena = 0xFFFFFFFF; // 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
- 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_la2_oenb = reg_la2_iena = 0xFFFFFFFC; // Configure LA[64] LA[65] as outputs from the cpu
```
-* 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.
+* 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 and it writes the values to the input csrs of fpu at each clock cycle. And then disable probs as inputs to read the result value.
```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
+ for (i=0; i<12; i=i+1) { // Toggle clk & de-assert reset
clk = !clk;
reg_la2_data = 0x00000000 | clk;
+ if(i==0)
+ {reg_la0_data = 0x30000000;
+ reg_la1_data = 0x00000001; }
+ ...
+ ...
+ }
+ ```
+
+ ```c
+
+ reg_la0_oenb = reg_la0_iena = 0xFFFFFFFF; // Disable probes
+ reg_la1_oenb = reg_la1_iena = 0xFFFFFFFF; // Disable probes
+ ```
+
+* The firmware then checks the result value equal to 0x00000003 and flags the success of the test by writing `0xAB461` to pads 16 to 31. The firmware reads the result value through the logic analyzer probes `[31:0]`
+
+ ```c
+ if (reg_la0_data == 0x00000003) { // Read current result value through LA
+ reg_mprj_datal = 0xAB610000; // Flag success of the test
+ break;
}
```
-* The testbench success criteria is that the firmware reads a count value of five through the LA probes.
- ```c
- if (reg_la0_data == 0x05) {
- reg_mprj_datal = 0xAB610000; // FLag success of the test
- }
+
```
-### Wishbone Test
+### Wishbone Tests
-* 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.
+* This test is meant to verify that we can read and write to the fpu registers through the wishbone port. The firmware writes a value to the input csrs which are operands and operation conntrol csr that controls which fpu operation to perform. Then it waits untill the interrupt csr value becomes 1 which indicates the completion of fpu operation. After completion of fpu operation final thing is to read the result and exception csr values and check whether it is according to the expected result depending upon the operaton. 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. These tests starting from fpu_test prefix use the same approach but they target different sub modules of FPU i.e.
+ * fpu_test_add_sub
+ * ...
+ * ...
+ * fpu_test_sqrt
+
+* The defines which target the user project example csrs are defined in dv_defs.h
diff --git a/verilog/dv/dv_defs.h b/verilog/dv/dv_defs.h
new file mode 100644
index 0000000..80f17fb
--- /dev/null
+++ b/verilog/dv/dv_defs.h
@@ -0,0 +1,13 @@
+#include <stdint.h>
+#include <stdbool.h>
+
+#define ups_operand_a (*(volatile uint32_t*)0x30000000)
+#define ups_operand_b (*(volatile uint32_t*)0x30000004)
+#define ups_operand_c (*(volatile uint32_t*)0x30000008)
+#define ups_result (*(volatile uint32_t*)0x3000000c)
+#define ups_operation_completed (*(volatile uint32_t*)0x30000010)
+#define ups_interrupt_generation (*(volatile uint32_t*)0x30000014)
+#define ups_operation (*(volatile uint32_t*)0x3000001c)
+#define ups_fflags (*(volatile uint32_t*)0x30000020)
+#define ups_frm (*(volatile uint32_t*)0x30000024)
+#define ups_fcsr (*(volatile uint32_t*)0x30000028)
diff --git a/verilog/dv/wb_port/Makefile b/verilog/dv/fpu_test_add_sub/Makefile
similarity index 94%
copy from verilog/dv/wb_port/Makefile
copy to verilog/dv/fpu_test_add_sub/Makefile
index 132a1cc..299d4bd 100644
--- a/verilog/dv/wb_port/Makefile
+++ b/verilog/dv/fpu_test_add_sub/Makefile
@@ -37,7 +37,7 @@
.SUFFIXES:
-PATTERN = wb_port
+PATTERN = fpu_test_add_sub
all: ${PATTERN:=.vcd}
@@ -45,12 +45,13 @@
%.vvp: %_tb.v %.hex
ifeq ($(SIM),RTL)
- iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH) \
$< -o $@
+
else
- iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I$(UPRJ_RTL_PATH) -I $(UPRJ_VERILOG_PATH) \
$< -o $@
diff --git a/verilog/dv/fpu_test_add_sub/fpu_test_add_sub.c b/verilog/dv/fpu_test_add_sub/fpu_test_add_sub.c
new file mode 100644
index 0000000..d2804da
--- /dev/null
+++ b/verilog/dv/fpu_test_add_sub/fpu_test_add_sub.c
@@ -0,0 +1,125 @@
+/* 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 "verilog/dv/caravel/defs.h"
+#include "../verilog/dv/dv_defs.h"
+#include "verilog/dv/caravel/stub.c"
+/*
+ Wishbone Test:
+ - Configures MPRJ lower 8-IO pins as outputs
+ - Checks counter value through the wishbone port
+*/
+int i = 0;
+int clk = 0;
+void main()
+{
+ // volatile unit32_t *base_address;
+ /*
+ 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_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 = 0xFFFFFFFF; // [95:64]
+
+ // Flag start of the test1
+ reg_mprj_datal = 0xAB600000;
+
+ //writing into input csrs
+ ups_operand_a = 0x00000001;
+ ups_operand_b = 0x00000002;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000000000100000000;
+
+ while (ups_interrupt_generation != 1); //waiting for the operation to be completed
+ while (ups_operation_completed != 256); //waiting for the operation to be completed
+
+ while (ups_result != 0x00000003);
+ while (ups_fflags != 0x00000000);
+
+
+ reg_mprj_datal = 0xAB610000; //flag end of test1
+
+ // Flag start of the test2
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x7f7fffff;
+ ups_operand_b = 0x00000002;
+ ups_frm = 0x00000001;
+ ups_operation = 0b00000000000000000000000100000000;
+
+
+ while (ups_interrupt_generation != 1); //waiting for the operation to be completed
+ while (ups_operation_completed != 256);
+
+ while (ups_result != 0x7f7fffff);
+ while (ups_fflags != 0x00000001);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test2
+
+ // Flag start of the test3
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x7F000000;
+ ups_operand_b = 0x7F700000;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000000000100000001;
+
+
+ while (ups_interrupt_generation != 1); //waiting for the operation to be completed
+ while (ups_operation_completed != 257);
+
+ while (ups_result != 0xFEE00000);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test3
+
+ reg_mprj_datal = 0xAB620000; //flag end of all test to finish
+
+}
+
+
diff --git a/verilog/dv/fpu_test_add_sub/fpu_test_add_sub_tb.v b/verilog/dv/fpu_test_add_sub/fpu_test_add_sub_tb.v
new file mode 100644
index 0000000..b663c04
--- /dev/null
+++ b/verilog/dv/fpu_test_add_sub/fpu_test_add_sub_tb.v
@@ -0,0 +1,204 @@
+// 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
+//`include "fpu.c"
+`include "uprj_netlists.v"
+`include "caravel_netlists.v"
+`include "spiflash.v"
+
+
+
+/*import "DPI-C" context function void fpu_c (input int a,b,c,roundingMode,
+ input bit add_op,
+ input int COMP_op,MAC_op,min_max_op,signed_conv,
+ input int finalStage_valid,
+ output int result,exceptionFlags );*/
+
+module fpu_test_add_sub_tb;
+ reg clock;
+ reg RSTB;
+ reg CSB;
+
+ reg power1, power2;
+
+ //RAND MEM
+ parameter RAND1 = 8'h00;
+ parameter RAND4 = 8'h04;
+ parameter RAND8 = 8'h08;
+ parameter RANDc = 8'h0c;
+ parameter RANDf = 8'h0f;
+ parameter MEM_BASE_ADR = 32'h a000_0000;
+
+ 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 #12.5 clock <= (clock === 1'b0);
+
+ initial begin
+ clock = 0;
+ end
+
+ initial begin
+ $dumpfile("fpu_test_add_sub.vcd");
+ $dumpvars(0, fpu_test_add_sub_tb);
+
+ // Repeat cycles of 1000 clock edges as needed to complete testbench
+ repeat (30) begin
+ repeat (10000) @(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
+ reg [32:0]i=1;
+ initial begin
+ fork begin
+ forever begin
+ wait(checkbits == 16'h AB60) begin
+ $display("Monitor: Test %0d Started",i);
+ fork
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000000) begin//operand a
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.a)
+ $display("\na NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.a);
+ else
+ $display("\ntime = %0d \n a is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000004) begin//operand b
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.b)
+ $display("\nb NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.b);
+ else
+ $display("\ntime = %0d \n b is correct\n",$time);
+ end
+
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000024) begin//operand rm
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.round_mode)
+ $display("\nrm NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.round_mode);
+ else
+ $display("\ntime = %0d \n rm is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h3000001c) begin //operand operation
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != {19'b0,uut.mprj.mprj.fpu.valid_in,uut.mprj.mprj.fpu.op_in})
+ $display("\noperation NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,{19'b0,uut.mprj.mprj.fpu.valid_in, uut.mprj.mprj.fpu.op_in});
+ else
+ $display("\ntime = %0d \n operation is correct\n",$time );
+ end
+ join
+ wait(checkbits == 16'h AB61) begin
+ $display("Monitor: Test %0d Passed\n",i);
+ i = i+1;
+ end
+ end
+ end
+ end
+ begin
+ wait(checkbits == 16'h AB62)
+ begin
+ $display("Monitor: ALL Test Finished");
+ $finish;
+ //disable fork;
+ end
+ end
+ join
+
+ 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;
+
+ caravel uut (
+ .vddio (VDD3V3),
+ .vssio (VSS),
+ .vdda (VDD3V3),
+ .vssa (VSS),
+ .vccd (VDD1V8),
+ .vssd (VSS),
+ .vdda1 (VDD3V3),
+ .vdda2 (VDD3V3),
+ .vssa1 (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("fpu_test_add_sub.hex")
+ ) spiflash (
+ .csb(flash_csb),
+ .clk(flash_clk),
+ .io0(flash_io0),
+ .io1(flash_io1),
+ .io2(),
+ .io3()
+ );
+
+endmodule
+`default_nettype wire
diff --git a/verilog/dv/wb_port/Makefile b/verilog/dv/fpu_test_comp/Makefile
similarity index 94%
rename from verilog/dv/wb_port/Makefile
rename to verilog/dv/fpu_test_comp/Makefile
index 132a1cc..133a723 100644
--- a/verilog/dv/wb_port/Makefile
+++ b/verilog/dv/fpu_test_comp/Makefile
@@ -37,7 +37,7 @@
.SUFFIXES:
-PATTERN = wb_port
+PATTERN = fpu_test_comp
all: ${PATTERN:=.vcd}
@@ -45,12 +45,13 @@
%.vvp: %_tb.v %.hex
ifeq ($(SIM),RTL)
- iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH) \
$< -o $@
+
else
- iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I$(UPRJ_RTL_PATH) -I $(UPRJ_VERILOG_PATH) \
$< -o $@
diff --git a/verilog/dv/fpu_test_comp/fpu_test_comp.c b/verilog/dv/fpu_test_comp/fpu_test_comp.c
new file mode 100644
index 0000000..ba33f2e
--- /dev/null
+++ b/verilog/dv/fpu_test_comp/fpu_test_comp.c
@@ -0,0 +1,125 @@
+/* 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 "verilog/dv/caravel/defs.h"
+#include "../verilog/dv/dv_defs.h"
+#include "verilog/dv/caravel/stub.c"
+/*
+ Wishbone Test:
+ - Configures MPRJ lower 8-IO pins as outputs
+ - Checks counter value through the wishbone port
+*/
+int i = 0;
+int clk = 0;
+void main()
+{
+ // volatile unit32_t *base_address;
+ /*
+ 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_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 = 0xFFFFFFFF; // [95:64]
+
+ // Flag start of the test1
+ reg_mprj_datal = 0xAB600000;
+
+ //writing into input csrs
+ ups_operand_a = 0x7f700000;
+ ups_operand_b = 0x7f800000;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000000000000010000;
+
+
+ while (ups_interrupt_generation != 1); //waiting for the operation to be completed
+ while (ups_operation_completed != 0x00000010); //waiting for the operation to be completed
+
+ while (ups_result != 0x00000001);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test1
+
+ // Flag start of the test2
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x7f700000;
+ ups_operand_b = 0x7f800000;
+ ups_frm = 0x00000001;
+ ups_operation = 0b00000000000000000000000000010001;
+
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 0x00000011);
+
+ while (ups_result != 0x00000001);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test2
+
+ // Flag start of the test3
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0xff7fffff;
+ ups_operand_b = 0xff7fffff;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000000000000010010;
+
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 0x00000012);
+
+ while (ups_result != 0x00000001);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test3
+
+ reg_mprj_datal = 0xAB620000; //flag end of all test to finish
+
+}
+
+
diff --git a/verilog/dv/fpu_test_comp/fpu_test_comp_tb.v b/verilog/dv/fpu_test_comp/fpu_test_comp_tb.v
new file mode 100644
index 0000000..fd3bf52
--- /dev/null
+++ b/verilog/dv/fpu_test_comp/fpu_test_comp_tb.v
@@ -0,0 +1,192 @@
+// 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
+//`include "fpu.c"
+`include "uprj_netlists.v"
+`include "caravel_netlists.v"
+`include "spiflash.v"
+
+/*import "DPI-C" context function void fpu_c (input int a,b,c,roundingMode,
+ input bit add_op,
+ input int COMP_op,MAC_op,min_max_op,signed_conv,
+ input int finalStage_valid,
+ output int result,exceptionFlags );*/
+
+module fpu_test_comp_tb;
+ reg clock;
+ reg RSTB;
+ reg CSB;
+
+ reg power1, power2;
+
+ 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 #12.5 clock <= (clock === 1'b0);
+
+ initial begin
+ clock = 0;
+ end
+
+ initial begin
+ $dumpfile("fpu_test_comp.vcd");
+ $dumpvars(0, fpu_test_comp_tb);
+
+ // Repeat cycles of 1000 clock edges as needed to complete testbench
+ repeat (30) 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
+ reg [32:0]i=1;
+ initial begin
+ fork begin
+ forever begin
+ wait(checkbits == 16'h AB60) begin
+ $display("Monitor: Test %0d Started",i);
+ fork
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000000) begin//operand a
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.a)
+ $display("\na NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.a);
+ else
+ $display("\ntime = %0d \n a is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000004) begin//operand b
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.b)
+ $display("\nb NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.b);
+ else
+ $display("\ntime = %0d \n b is correct\n",$time);
+ end
+
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000024) begin//operand rm
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.round_mode)
+ $display("\nrm NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.round_mode);
+ else
+ $display("\ntime = %0d \n rm is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h3000001c) begin //operand operation
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != {19'b0,uut.mprj.mprj.fpu.valid_in,uut.mprj.mprj.fpu.op_in})
+ $display("\noperation NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,{19'b0,uut.mprj.mprj.fpu.valid_in, uut.mprj.mprj.fpu.op_in});
+ else
+ $display("\ntime = %0d \n operation is correct\n",$time );
+ end
+ join
+ wait(checkbits == 16'h AB61) begin
+ $display("Monitor: Test %0d Passed\n",i);
+ i = i+1;
+ end
+ end
+ end
+ end
+ begin
+ wait(checkbits == 16'h AB62)
+ begin
+ $display("Monitor: ALL Test Finished");
+ $finish;
+ //disable fork;
+ end
+ end
+ join
+
+ 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;
+
+ caravel uut (
+ .vddio (VDD3V3),
+ .vssio (VSS),
+ .vdda (VDD3V3),
+ .vssa (VSS),
+ .vccd (VDD1V8),
+ .vssd (VSS),
+ .vdda1 (VDD3V3),
+ .vdda2 (VDD3V3),
+ .vssa1 (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("fpu_test_comp.hex")
+ ) spiflash (
+ .csb(flash_csb),
+ .clk(flash_clk),
+ .io0(flash_io0),
+ .io1(flash_io1),
+ .io2(),
+ .io3()
+ );
+
+endmodule
+`default_nettype wire
diff --git a/verilog/dv/wb_port/Makefile b/verilog/dv/fpu_test_div/Makefile
similarity index 94%
copy from verilog/dv/wb_port/Makefile
copy to verilog/dv/fpu_test_div/Makefile
index 132a1cc..24b25e3 100644
--- a/verilog/dv/wb_port/Makefile
+++ b/verilog/dv/fpu_test_div/Makefile
@@ -37,7 +37,7 @@
.SUFFIXES:
-PATTERN = wb_port
+PATTERN = fpu_test_div
all: ${PATTERN:=.vcd}
@@ -45,12 +45,13 @@
%.vvp: %_tb.v %.hex
ifeq ($(SIM),RTL)
- iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH) \
$< -o $@
+
else
- iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I$(UPRJ_RTL_PATH) -I $(UPRJ_VERILOG_PATH) \
$< -o $@
diff --git a/verilog/dv/fpu_test_div/fpu_test_div.c b/verilog/dv/fpu_test_div/fpu_test_div.c
new file mode 100644
index 0000000..710bc51
--- /dev/null
+++ b/verilog/dv/fpu_test_div/fpu_test_div.c
@@ -0,0 +1,127 @@
+/* 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 "verilog/dv/caravel/defs.h"
+#include "../verilog/dv/dv_defs.h"
+#include "verilog/dv/caravel/stub.c"
+/*
+ Wishbone Test:
+ - Configures MPRJ lower 8-IO pins as outputs
+ - Checks counter value through the wishbone port
+*/
+int i = 0;
+int clk = 0;
+void main()
+{
+ // volatile unit32_t *base_address;
+ /*
+ 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_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 = 0xFFFFFFFF; // [95:64]
+
+ // Flag start of the test1
+ reg_mprj_datal = 0xAB600000;
+
+ //writing into input csrs
+ ups_operand_a = 0x00000001;
+ ups_operand_b = 0x00000001;
+ ups_frm = 0x00000000;
+
+ ups_operation = 0b00000000000000000000100000000000;
+
+
+ while (ups_interrupt_generation != 1); //waiting for the operation to be completed
+ while (ups_operation_completed != 0x00000800); //waiting for the operation to be completed
+
+ while (ups_result != 0x3f800000);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test1
+
+ // Flag start of the test2
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x00000001;
+ ups_operand_b = 0x7f7fffff;
+ ups_frm = 0x00000000;
+
+ ups_operation = 0b00000000000000000000100000000000;
+
+
+ while (ups_interrupt_generation != 1); //waiting for the operation to be completed
+ while (ups_operation_completed != 0x00000800);
+
+ while (ups_result != 0);
+ while (ups_fflags != 0x00000003);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test2
+
+ // Flag start of the test3
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x00000001;
+ ups_operand_b = 0x00000000;
+ ups_frm = 0x00000000;
+
+ ups_operation = 0b00000000000000000000100000000000;
+
+ while (ups_interrupt_generation != 1); //waiting for the operation to be completed
+ while (ups_operation_completed != 0x00000800);
+
+ while (ups_result != 0x7f800000);
+ while (ups_fflags != 0x00000008);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test3
+
+ reg_mprj_datal = 0xAB620000; //flag end of all test to finish
+
+}
+
+
diff --git a/verilog/dv/fpu_test_div/fpu_test_div_tb.v b/verilog/dv/fpu_test_div/fpu_test_div_tb.v
new file mode 100644
index 0000000..3f9c72c
--- /dev/null
+++ b/verilog/dv/fpu_test_div/fpu_test_div_tb.v
@@ -0,0 +1,193 @@
+// 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
+//`include "fpu.c"
+`include "uprj_netlists.v"
+`include "caravel_netlists.v"
+`include "spiflash.v"
+
+/*import "DPI-C" context function void fpu_c (input int a,b,c,roundingMode,
+ input bit add_op,
+ input int COMP_op,MAC_op,min_max_op,signed_conv,
+ input int finalStage_valid,
+ output int result,exceptionFlags );*/
+
+module fpu_test_div_tb;
+ reg clock;
+ reg RSTB;
+ reg CSB;
+
+ reg power1, power2;
+
+ 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 #12.5 clock <= (clock === 1'b0);
+
+ initial begin
+ clock = 0;
+ end
+
+ initial begin
+ $dumpfile("fpu_test_div.vcd");
+ $dumpvars(0, fpu_test_div_tb);
+
+ // Repeat cycles of 1000 clock edges as needed to complete testbench
+ repeat (30) 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
+ reg [32:0]i=1;
+ initial begin
+ fork begin
+ forever begin
+ wait(checkbits == 16'h AB60) begin
+ $display("Monitor: Test %0d Started",i);
+ fork
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000000) begin//operand a
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.a)
+ $display("\na NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.a);
+ else
+ $display("\ntime = %0d \n a is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000004) begin//operand b
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.b)
+ $display("\nb NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.b);
+ else
+ $display("\ntime = %0d \n b is correct\n",$time);
+ end
+
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000024) begin//operand rm
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.round_mode)
+ $display("\nrm NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.round_mode);
+ else
+ $display("\ntime = %0d \n rm is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h3000001c) begin //operand operation
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != {19'b0,uut.mprj.mprj.fpu.valid_in,uut.mprj.mprj.fpu.op_in})
+ $display("\noperation NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,{19'b0,uut.mprj.mprj.fpu.valid_in, uut.mprj.mprj.fpu.op_in});
+ else
+ $display("\ntime = %0d \n operation is correct\n",$time );
+ end
+ join
+ wait(checkbits == 16'h AB61) begin
+ $display("Monitor: Test %0d Passed\n",i);
+ i = i+1;
+ end
+ end
+ end
+ end
+ begin
+ wait(checkbits == 16'h AB62)
+ begin
+ $display("Monitor: ALL Test Finished");
+ $finish;
+ //disable fork;
+ end
+ end
+ join
+
+ 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;
+
+ caravel uut (
+ .vddio (VDD3V3),
+ .vssio (VSS),
+ .vdda (VDD3V3),
+ .vssa (VSS),
+ .vccd (VDD1V8),
+ .vssd (VSS),
+ .vdda1 (VDD3V3),
+ .vdda2 (VDD3V3),
+ .vssa1 (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("fpu_test_div.hex")
+ ) spiflash (
+ .csb(flash_csb),
+ .clk(flash_clk),
+ .io0(flash_io0),
+ .io1(flash_io1),
+ .io2(),
+ .io3()
+ );
+
+endmodule
+`default_nettype wire
diff --git a/verilog/dv/wb_port/Makefile b/verilog/dv/fpu_test_f2i/Makefile
similarity index 94%
copy from verilog/dv/wb_port/Makefile
copy to verilog/dv/fpu_test_f2i/Makefile
index 132a1cc..f726e0f 100644
--- a/verilog/dv/wb_port/Makefile
+++ b/verilog/dv/fpu_test_f2i/Makefile
@@ -37,7 +37,7 @@
.SUFFIXES:
-PATTERN = wb_port
+PATTERN = fpu_test_f2i
all: ${PATTERN:=.vcd}
@@ -45,12 +45,13 @@
%.vvp: %_tb.v %.hex
ifeq ($(SIM),RTL)
- iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH) \
$< -o $@
+
else
- iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I$(UPRJ_RTL_PATH) -I $(UPRJ_VERILOG_PATH) \
$< -o $@
diff --git a/verilog/dv/fpu_test_f2i/fpu_test_f2i.c b/verilog/dv/fpu_test_f2i/fpu_test_f2i.c
new file mode 100644
index 0000000..62de2e4
--- /dev/null
+++ b/verilog/dv/fpu_test_f2i/fpu_test_f2i.c
@@ -0,0 +1,125 @@
+/* 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 "verilog/dv/caravel/defs.h"
+#include "../verilog/dv/dv_defs.h"
+#include "verilog/dv/caravel/stub.c"
+/*
+ Wishbone Test:
+ - Configures MPRJ lower 8-IO pins as outputs
+ - Checks counter value through the wishbone port
+*/
+int i = 0;
+int clk = 0;
+void main()
+{
+ // volatile unit32_t *base_address;
+ /*
+ 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_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 = 0xFFFFFFFF; // [95:64]
+
+ // Flag start of the test1
+ reg_mprj_datal = 0xAB600000;
+
+ //writing into input csrs
+ ups_operand_a = 0x7f800000;
+ ups_operand_b = 0x00000002;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000000000010000001;
+
+
+ while (ups_interrupt_generation != 1); //waiting for the operation to be completed
+ while (ups_operation_completed != 0x00000081); //waiting for the operation to be completed
+
+ while (ups_result != 0x7fffffff);
+ while (ups_fflags != 0x00000010);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test1
+
+ // Flag start of the test2
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0xff7fffff;
+ ups_operand_b = 0x00000002;
+ ups_frm = 0x00000001;
+ ups_operation = 0b00000000000000000000000010000001;
+
+
+ while (ups_interrupt_generation != 1); //waiting for the operation to be completed
+ while (ups_operation_completed != 0x00000081);
+
+ while (ups_result != 0x80000000);
+ while (ups_fflags != 0x00000004);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test2
+
+ // Flag start of the test3
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0xff7fffff;
+ ups_operand_b = 0x7F700000;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000000000010000000;
+
+
+ while (ups_interrupt_generation != 1); //waiting for the operation to be completed
+ while (ups_operation_completed != 0x00000080);
+
+ while (ups_result != 0x00000000);
+ while (ups_fflags != 0x00000004);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test3
+
+ reg_mprj_datal = 0xAB620000; //flag end of all test to finish
+
+}
+
+
diff --git a/verilog/dv/fpu_test_f2i/fpu_test_f2i_tb.v b/verilog/dv/fpu_test_f2i/fpu_test_f2i_tb.v
new file mode 100644
index 0000000..7933d3f
--- /dev/null
+++ b/verilog/dv/fpu_test_f2i/fpu_test_f2i_tb.v
@@ -0,0 +1,185 @@
+// 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
+//`include "fpu.c"
+`include "uprj_netlists.v"
+`include "caravel_netlists.v"
+`include "spiflash.v"
+
+/*import "DPI-C" context function void fpu_c (input int a,b,c,roundingMode,
+ input bit add_op,
+ input int COMP_op,MAC_op,min_max_op,signed_conv,
+ input int finalStage_valid,
+ output int result,exceptionFlags );*/
+
+module fpu_test_f2i_tb;
+ reg clock;
+ reg RSTB;
+ reg CSB;
+
+ reg power1, power2;
+
+ 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 #12.5 clock <= (clock === 1'b0);
+
+ initial begin
+ clock = 0;
+ end
+
+ initial begin
+ $dumpfile("fpu_test_f2i.vcd");
+ $dumpvars(0, fpu_test_f2i_tb);
+
+ // Repeat cycles of 1000 clock edges as needed to complete testbench
+ repeat (30) 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
+ reg [32:0]i=1;
+ initial begin
+ fork begin
+ forever begin
+ wait(checkbits == 16'h AB60) begin
+ $display("Monitor: Test %0d Started",i);
+ fork
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000000) begin//operand a
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.a)
+ $display("\na NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.a);
+ else
+ $display("\ntime = %0d \n a is correct\n",$time);
+ end
+
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000024) begin//operand rm
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.round_mode)
+ $display("\nrm NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.round_mode);
+ else
+ $display("\ntime = %0d \n rm is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h3000001c) begin //operand operation
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != {19'b0,uut.mprj.mprj.fpu.valid_in,uut.mprj.mprj.fpu.op_in})
+ $display("\noperation NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,{19'b0,uut.mprj.mprj.fpu.valid_in, uut.mprj.mprj.fpu.op_in});
+ else
+ $display("\ntime = %0d \n operation is correct\n",$time );
+ end
+ join
+ wait(checkbits == 16'h AB61) begin
+ $display("Monitor: Test %0d Passed\n",i);
+ i = i+1;
+ end
+ end
+ end
+ end
+ begin
+ wait(checkbits == 16'h AB62)
+ begin
+ $display("Monitor: ALL Test Finished");
+ $finish;
+ //disable fork;
+ end
+ end
+ join
+
+ 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;
+
+ caravel uut (
+ .vddio (VDD3V3),
+ .vssio (VSS),
+ .vdda (VDD3V3),
+ .vssa (VSS),
+ .vccd (VDD1V8),
+ .vssd (VSS),
+ .vdda1 (VDD3V3),
+ .vdda2 (VDD3V3),
+ .vssa1 (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("fpu_test_f2i.hex")
+ ) spiflash (
+ .csb(flash_csb),
+ .clk(flash_clk),
+ .io0(flash_io0),
+ .io1(flash_io1),
+ .io2(),
+ .io3()
+ );
+
+endmodule
+`default_nettype wire
diff --git a/verilog/dv/wb_port/Makefile b/verilog/dv/fpu_test_fclass/Makefile
similarity index 94%
copy from verilog/dv/wb_port/Makefile
copy to verilog/dv/fpu_test_fclass/Makefile
index 132a1cc..b0f8e94 100644
--- a/verilog/dv/wb_port/Makefile
+++ b/verilog/dv/fpu_test_fclass/Makefile
@@ -37,7 +37,7 @@
.SUFFIXES:
-PATTERN = wb_port
+PATTERN = fpu_test_fclass
all: ${PATTERN:=.vcd}
@@ -45,12 +45,13 @@
%.vvp: %_tb.v %.hex
ifeq ($(SIM),RTL)
- iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH) \
$< -o $@
+
else
- iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I$(UPRJ_RTL_PATH) -I $(UPRJ_VERILOG_PATH) \
$< -o $@
diff --git a/verilog/dv/fpu_test_fclass/fpu_test_fclass.c b/verilog/dv/fpu_test_fclass/fpu_test_fclass.c
new file mode 100644
index 0000000..a7085e6
--- /dev/null
+++ b/verilog/dv/fpu_test_fclass/fpu_test_fclass.c
@@ -0,0 +1,121 @@
+/* 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 "verilog/dv/caravel/defs.h"
+#include "../verilog/dv/dv_defs.h"
+#include "verilog/dv/caravel/stub.c"
+/*
+ Wishbone Test:
+ - Configures MPRJ lower 8-IO pins as outputs
+ - Checks counter value through the wishbone port
+*/
+int i = 0;
+int clk = 0;
+void main()
+{
+ // volatile unit32_t *base_address;
+ /*
+ 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_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 = 0xFFFFFFFF; // [95:64]
+
+ // Flag start of the test1
+ reg_mprj_datal = 0xAB600000;
+
+ //writing into input csrs
+ ups_operand_a = 0xff800000;
+
+ ups_operation = 0b00000000000000000000000000000100;
+
+
+ while (ups_interrupt_generation != 1); //waiting for the operation to be completed
+ while (ups_operation_completed != 4); //waiting for the operation to be completed
+
+ while (ups_result != 0x00000001);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test1
+
+ // Flag start of the test2
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x00000000;
+
+ ups_operation = 0b00000000000000000000000000000100;
+
+
+ while (ups_interrupt_generation != 1); //waiting for the operation to be completed
+ while (ups_operation_completed != 4);
+
+ while (ups_result != 16);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test2
+
+ // Flag start of the test3
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x77770000;
+ ups_operation = 0b00000000000000000000000000000100;
+
+
+ while (ups_interrupt_generation != 1); //waiting for the operation to be completed
+ while (ups_operation_completed != 4);
+
+ while (ups_result != 64);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test3
+
+ reg_mprj_datal = 0xAB620000; //flag end of all test to finish
+
+}
+
+
diff --git a/verilog/dv/fpu_test_fclass/fpu_test_fclass_tb.v b/verilog/dv/fpu_test_fclass/fpu_test_fclass_tb.v
new file mode 100644
index 0000000..44dd75e
--- /dev/null
+++ b/verilog/dv/fpu_test_fclass/fpu_test_fclass_tb.v
@@ -0,0 +1,178 @@
+// 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
+//`include "fpu.c"
+`include "uprj_netlists.v"
+`include "caravel_netlists.v"
+`include "spiflash.v"
+
+/*import "DPI-C" context function void fpu_c (input int a,b,c,roundingMode,
+ input bit add_op,
+ input int COMP_op,MAC_op,min_max_op,signed_conv,
+ input int finalStage_valid,
+ output int result,exceptionFlags );*/
+
+module fpu_test_fclass_tb;
+ reg clock;
+ reg RSTB;
+ reg CSB;
+
+ reg power1, power2;
+
+ 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 #12.5 clock <= (clock === 1'b0);
+
+ initial begin
+ clock = 0;
+ end
+
+ initial begin
+ $dumpfile("fpu_test_fclass.vcd");
+ $dumpvars(0, fpu_test_fclass_tb);
+
+ // Repeat cycles of 1000 clock edges as needed to complete testbench
+ repeat (30) 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
+ reg [32:0]i=1;
+ initial begin
+ fork begin
+ forever begin
+ wait(checkbits == 16'h AB60) begin
+ $display("Monitor: Test %0d Started",i);
+ fork
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000000) begin//operand a
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.a)
+ $display("\na NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.a);
+ else
+ $display("\ntime = %0d \n a is correct\n",$time);
+ end
+
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h3000001c) begin //operand operation
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != {19'b0,uut.mprj.mprj.fpu.valid_in,uut.mprj.mprj.fpu.op_in})
+ $display("\noperation NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,{19'b0,uut.mprj.mprj.fpu.valid_in, uut.mprj.mprj.fpu.op_in});
+ else
+ $display("\ntime = %0d \n operation is correct\n",$time );
+ end
+ join
+ wait(checkbits == 16'h AB61) begin
+ $display("Monitor: Test %0d Passed\n",i);
+ i = i+1;
+ end
+ end
+ end
+ end
+ begin
+ wait(checkbits == 16'h AB62)
+ begin
+ $display("Monitor: ALL Test Finished");
+ $finish;
+ //disable fork;
+ end
+ end
+ join
+
+ 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;
+
+ caravel uut (
+ .vddio (VDD3V3),
+ .vssio (VSS),
+ .vdda (VDD3V3),
+ .vssa (VSS),
+ .vccd (VDD1V8),
+ .vssd (VSS),
+ .vdda1 (VDD3V3),
+ .vdda2 (VDD3V3),
+ .vssa1 (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("fpu_test_fclass.hex")
+ ) spiflash (
+ .csb(flash_csb),
+ .clk(flash_clk),
+ .io0(flash_io0),
+ .io1(flash_io1),
+ .io2(),
+ .io3()
+ );
+
+endmodule
+`default_nettype wire
diff --git a/verilog/dv/wb_port/Makefile b/verilog/dv/fpu_test_fma/Makefile
similarity index 94%
copy from verilog/dv/wb_port/Makefile
copy to verilog/dv/fpu_test_fma/Makefile
index 132a1cc..3f4a30f 100644
--- a/verilog/dv/wb_port/Makefile
+++ b/verilog/dv/fpu_test_fma/Makefile
@@ -37,7 +37,7 @@
.SUFFIXES:
-PATTERN = wb_port
+PATTERN = fpu_test_fma
all: ${PATTERN:=.vcd}
@@ -45,12 +45,13 @@
%.vvp: %_tb.v %.hex
ifeq ($(SIM),RTL)
- iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH) \
$< -o $@
+
else
- iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I$(UPRJ_RTL_PATH) -I $(UPRJ_VERILOG_PATH) \
$< -o $@
diff --git a/verilog/dv/fpu_test_fma/fpu_test_fma.c b/verilog/dv/fpu_test_fma/fpu_test_fma.c
new file mode 100644
index 0000000..3aa32e5
--- /dev/null
+++ b/verilog/dv/fpu_test_fma/fpu_test_fma.c
@@ -0,0 +1,131 @@
+/* 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 "verilog/dv/caravel/defs.h"
+#include "../verilog/dv/dv_defs.h"
+#include "verilog/dv/caravel/stub.c"
+/*
+ Wishbone Test:
+ - Configures MPRJ lower 8-IO pins as outputs
+ - Checks counter value through the wishbone port
+*/
+int i = 0;
+int clk = 0;
+void main()
+{
+ // volatile unit32_t *base_address;
+ /*
+ 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_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 = 0xFFFFFFFF; // [95:64]
+
+ // Flag start of the test1
+ reg_mprj_datal = 0xAB600000;
+
+ //writing into input csrs
+ ups_operand_a = 0x00000001;
+ ups_operand_b = 0x00000002;
+ ups_operand_c = 0x00000003;
+ ups_frm = 0x00000003;
+ ups_operation = 0b00000000000000000000010000000000;
+ //expected_result = 0x00000004;
+ //expected_exception = 0x00000003;
+
+ //waiting for operation to be completed
+ while (ups_interrupt_generation != 1); //waiting for the operation to be completed
+ while (ups_operation_completed != 1024);
+
+ while (ups_result != 0x00000004);
+ while (ups_fflags != 0x00000003);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test1
+
+ // Flag start of the test2
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x7f7fffff;
+ ups_operand_b = 0x00000002;
+ ups_operand_c = 0xf0000002;
+ ups_frm = 0x00000001;
+ ups_operation = 0b00000000000000000000010000000000;
+ //expected_result = 0xf0000001;
+ //expected_exception = 0x00000001;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 1024);
+
+ while (ups_result != 0xf0000001);
+ while (ups_fflags != 0x00000001);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test2
+
+ // Flag start of the test3
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x76000000;
+ ups_operand_b = 0x7F700000;
+ ups_operand_c = 0x78000000;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000000010000000000;
+ //expected_result = 0x7f800000;
+ //expected_exception = 0x00000005;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 1024);
+
+ while (ups_result != 0x7f800000);
+ while (ups_fflags != 0x00000005);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test3
+ reg_mprj_datal = 0xAB620000; //flag end of all test to finish
+
+}
+
+
diff --git a/verilog/dv/fpu_test_fma/fpu_test_fma_tb.v b/verilog/dv/fpu_test_fma/fpu_test_fma_tb.v
new file mode 100644
index 0000000..97c1814
--- /dev/null
+++ b/verilog/dv/fpu_test_fma/fpu_test_fma_tb.v
@@ -0,0 +1,200 @@
+// 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
+//`include "fpu.c"
+`include "uprj_netlists.v"
+`include "caravel_netlists.v"
+`include "spiflash.v"
+
+/*import "DPI-C" context function void fpu_c (input int a,b,c,roundingMode,
+ input bit add_op,
+ input int COMP_op,MAC_op,min_max_op,signed_conv,
+ input int finalStage_valid,
+ output int result,exceptionFlags );*/
+
+module fpu_test_fma_tb;
+ reg clock;
+ reg RSTB;
+ reg CSB;
+
+ reg power1, power2;
+
+ 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 #12.5 clock <= (clock === 1'b0);
+
+ initial begin
+ clock = 0;
+ end
+
+ initial begin
+ $dumpfile("fpu_test_fma.vcd");
+ $dumpvars(0, fpu_test_fma_tb);
+
+ // Repeat cycles of 1000 clock edges as needed to complete testbench
+ repeat (30) 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
+ reg [32:0]i=1;
+ initial begin
+ fork begin
+ forever begin
+ wait(checkbits == 16'h AB60) begin
+ $display("Monitor: Test %0d Started",i);
+ fork
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000000) begin//operand a
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.a)
+ $display("\na NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.a);
+ else
+ $display("\ntime = %0d \n a is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000004) begin//operand b
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.b)
+ $display("\nb NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.b);
+ else
+ $display("\ntime = %0d \n b is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000008) begin//operand c
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.c)
+ $display("\nc NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.c);
+ else
+ $display("\ntime = %0d \n c is correct\n",$time);
+ end
+
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000024) begin//operand rm
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.round_mode)
+ $display("\nrm NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.round_mode);
+ else
+ $display("\ntime = %0d \n rm is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h3000001c) begin //operand operation
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != {19'b0,uut.mprj.mprj.fpu.valid_in,uut.mprj.mprj.fpu.op_in})
+ $display("\noperation NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,{19'b0,uut.mprj.mprj.fpu.valid_in, uut.mprj.mprj.fpu.op_in});
+ else
+ $display("\ntime = %0d \n operation is correct\n",$time );
+ end
+ join
+ wait(checkbits == 16'h AB61) begin
+ $display("Monitor: Test %0d Passed\n",i);
+ i = i+1;
+ end
+ end
+ end
+ end
+ begin
+ wait(checkbits == 16'h AB62)
+ begin
+ $display("Monitor: ALL Test Finished");
+ $finish;
+ //disable fork;
+ end
+ end
+ join
+
+ 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;
+
+ caravel uut (
+ .vddio (VDD3V3),
+ .vssio (VSS),
+ .vdda (VDD3V3),
+ .vssa (VSS),
+ .vccd (VDD1V8),
+ .vssd (VSS),
+ .vdda1 (VDD3V3),
+ .vdda2 (VDD3V3),
+ .vssa1 (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("fpu_test_fma.hex")
+ ) spiflash (
+ .csb(flash_csb),
+ .clk(flash_clk),
+ .io0(flash_io0),
+ .io1(flash_io1),
+ .io2(),
+ .io3()
+ );
+
+endmodule
+`default_nettype wire
diff --git a/verilog/dv/wb_port/Makefile b/verilog/dv/fpu_test_i2f/Makefile
similarity index 94%
copy from verilog/dv/wb_port/Makefile
copy to verilog/dv/fpu_test_i2f/Makefile
index 132a1cc..b552747 100644
--- a/verilog/dv/wb_port/Makefile
+++ b/verilog/dv/fpu_test_i2f/Makefile
@@ -37,7 +37,7 @@
.SUFFIXES:
-PATTERN = wb_port
+PATTERN = fpu_test_i2f
all: ${PATTERN:=.vcd}
@@ -45,12 +45,13 @@
%.vvp: %_tb.v %.hex
ifeq ($(SIM),RTL)
- iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH) \
$< -o $@
+
else
- iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I$(UPRJ_RTL_PATH) -I $(UPRJ_VERILOG_PATH) \
$< -o $@
diff --git a/verilog/dv/fpu_test_i2f/fpu_test_i2f.c b/verilog/dv/fpu_test_i2f/fpu_test_i2f.c
new file mode 100644
index 0000000..f0817bf
--- /dev/null
+++ b/verilog/dv/fpu_test_i2f/fpu_test_i2f.c
@@ -0,0 +1,128 @@
+/* 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 "verilog/dv/caravel/defs.h"
+#include "../verilog/dv/dv_defs.h"
+#include "verilog/dv/caravel/stub.c"
+/*
+ Wishbone Test:
+ - Configures MPRJ lower 8-IO pins as outputs
+ - Checks counter value through the wishbone port
+*/
+int i = 0;
+int clk = 0;
+void main()
+{
+ // volatile unit32_t *base_address;
+ /*
+ 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_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 = 0xFFFFFFFF; // [95:64]
+
+ // Flag start of the test1
+ reg_mprj_datal = 0xAB600000;
+
+ //writing into input csrs
+ ups_operand_a = 0x7f800000;
+ ups_operand_b = 0x00000002;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000000000001000001;
+ //expected_result = 0x4eff0000;
+ //expected_exception = 0x00000000;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 0x00000041); //waiting for the operation to be completed
+
+ while (ups_result != 0x4eff0000);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test1
+
+ // Flag start of the test2
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0xff7fffff;
+ ups_operand_b = 0x00000002;
+ ups_frm = 0x00000001;
+ ups_operation = 0b00000000000000000000000001000001;
+ //expected_result = 0xcb000001;
+ //expected_exception = 0x00000000;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 0x00000041); //waiting for the operation to be completed
+
+ while (ups_result != 0xcb000001);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test2
+
+ // Flag start of the test3
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0xff7fffff;
+ ups_operand_b = 0x7F700000;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000000000001000000;
+ //expected_result = 0x4f7f8000;
+ //expected_exception = 0x00000001;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 0x00000040); //waiting for the operation to be completed
+
+ while (ups_result != 0x4f7f8000);
+ while (ups_fflags != 0x00000001);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test3
+
+ reg_mprj_datal = 0xAB620000; //flag end of all test to finish
+
+}
+
+
diff --git a/verilog/dv/fpu_test_i2f/fpu_test_i2f_tb.v b/verilog/dv/fpu_test_i2f/fpu_test_i2f_tb.v
new file mode 100644
index 0000000..38a7f32
--- /dev/null
+++ b/verilog/dv/fpu_test_i2f/fpu_test_i2f_tb.v
@@ -0,0 +1,185 @@
+// 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
+//`include "fpu.c"
+`include "uprj_netlists.v"
+`include "caravel_netlists.v"
+`include "spiflash.v"
+
+/*import "DPI-C" context function void fpu_c (input int a,b,c,roundingMode,
+ input bit add_op,
+ input int COMP_op,MAC_op,min_max_op,signed_conv,
+ input int finalStage_valid,
+ output int result,exceptionFlags );*/
+
+module fpu_test_i2f_tb;
+ reg clock;
+ reg RSTB;
+ reg CSB;
+
+ reg power1, power2;
+
+ 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 #12.5 clock <= (clock === 1'b0);
+
+ initial begin
+ clock = 0;
+ end
+
+ initial begin
+ $dumpfile("fpu_test_i2f.vcd");
+ $dumpvars(0, fpu_test_i2f_tb);
+
+ // Repeat cycles of 1000 clock edges as needed to complete testbench
+ repeat (30) 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
+ reg [32:0]i=1;
+ initial begin
+ fork begin
+ forever begin
+ wait(checkbits == 16'h AB60) begin
+ $display("Monitor: Test %0d Started",i);
+ fork
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000000) begin//operand a
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.a)
+ $display("\na NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.a);
+ else
+ $display("\ntime = %0d \n a is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000024) begin//operand rm
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.round_mode)
+ $display("\nrm NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.round_mode);
+ else
+ $display("\ntime = %0d \n rm is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h3000001c) begin //operand operation
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != {19'b0,uut.mprj.mprj.fpu.valid_in,uut.mprj.mprj.fpu.op_in})
+ $display("\noperation NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,{19'b0,uut.mprj.mprj.fpu.valid_in, uut.mprj.mprj.fpu.op_in});
+ else
+ $display("\ntime = %0d \n operation is correct\n",$time );
+ end
+ join
+ wait(checkbits == 16'h AB61) begin
+ $display("Monitor: Test %0d Passed\n",i);
+ i = i+1;
+ end
+ end
+ end
+ end
+ begin
+ wait(checkbits == 16'h AB62)
+ begin
+ $display("Monitor: ALL Test Finished");
+ $finish;
+ //disable fork;
+ end
+ end
+ join
+
+ 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;
+
+ caravel uut (
+ .vddio (VDD3V3),
+ .vssio (VSS),
+ .vdda (VDD3V3),
+ .vssa (VSS),
+ .vccd (VDD1V8),
+ .vssd (VSS),
+ .vdda1 (VDD3V3),
+ .vdda2 (VDD3V3),
+ .vssa1 (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("fpu_test_i2f.hex")
+ ) spiflash (
+ .csb(flash_csb),
+ .clk(flash_clk),
+ .io0(flash_io0),
+ .io1(flash_io1),
+ .io2(),
+ .io3()
+ );
+
+endmodule
+`default_nettype wire
diff --git a/verilog/dv/wb_port/Makefile b/verilog/dv/fpu_test_min_max/Makefile
similarity index 94%
copy from verilog/dv/wb_port/Makefile
copy to verilog/dv/fpu_test_min_max/Makefile
index 132a1cc..47c4e75 100644
--- a/verilog/dv/wb_port/Makefile
+++ b/verilog/dv/fpu_test_min_max/Makefile
@@ -37,7 +37,7 @@
.SUFFIXES:
-PATTERN = wb_port
+PATTERN = fpu_test_min_max
all: ${PATTERN:=.vcd}
@@ -45,12 +45,13 @@
%.vvp: %_tb.v %.hex
ifeq ($(SIM),RTL)
- iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH) \
$< -o $@
+
else
- iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I$(UPRJ_RTL_PATH) -I $(UPRJ_VERILOG_PATH) \
$< -o $@
diff --git a/verilog/dv/fpu_test_min_max/fpu_test_min_max.c b/verilog/dv/fpu_test_min_max/fpu_test_min_max.c
new file mode 100644
index 0000000..8e43f35
--- /dev/null
+++ b/verilog/dv/fpu_test_min_max/fpu_test_min_max.c
@@ -0,0 +1,126 @@
+/* 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 "verilog/dv/caravel/defs.h"
+#include "../verilog/dv/dv_defs.h"
+#include "verilog/dv/caravel/stub.c"
+/*
+ Wishbone Test:
+ - Configures MPRJ lower 8-IO pins as outputs
+ - Checks counter value through the wishbone port
+*/
+int i = 0;
+int clk = 0;
+void main()
+{
+ // volatile unit32_t *base_address;
+ /*
+ 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_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 = 0xFFFFFFFF; // [95:64]
+
+ // Flag start of the test1
+ reg_mprj_datal = 0xAB600000;
+
+ //writing into input csrs
+ ups_operand_a = 0x7f700000;
+ ups_operand_b = 0x7f800000;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000000000000100000;
+ //expected_result = 0x7f700000;
+ //expected_exception = 0x00000000;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 0x00000020); //waiting for the operation to be completed
+
+ while (ups_result != 0x7f700000);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test1
+
+ // Flag start of the test2
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x7f700000;
+ ups_operand_b = 0x7f800000;
+ ups_frm = 0x00000001;
+ ups_operation = 0b00000000000000000000000000100001;
+ //expected_result = 0x7f800000;
+ //expected_exception = 0x00000000;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 0x00000021);
+
+ while (ups_result != 0x7f800000);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test2
+
+ // Flag start of the test3
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0xff7fffff;
+ ups_operand_b = 0xff7fffff;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000000000000100000;
+ //expected_result = 0xff7fffff;
+ //expected_exception = 0x00000000;
+
+ while (ups_operation_completed != 0x00000020);
+
+ while (ups_result != 0xff7fffff);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test3
+ reg_mprj_datal = 0xAB620000; //flag end of all test to finish
+
+}
+
+
diff --git a/verilog/dv/fpu_test_min_max/fpu_test_min_max_tb.v b/verilog/dv/fpu_test_min_max/fpu_test_min_max_tb.v
new file mode 100644
index 0000000..4c9b84c
--- /dev/null
+++ b/verilog/dv/fpu_test_min_max/fpu_test_min_max_tb.v
@@ -0,0 +1,193 @@
+// 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
+//`include "fpu.c"
+`include "uprj_netlists.v"
+`include "caravel_netlists.v"
+`include "spiflash.v"
+
+/*import "DPI-C" context function void fpu_c (input int a,b,c,roundingMode,
+ input bit add_op,
+ input int COMP_op,MAC_op,min_max_op,signed_conv,
+ input int finalStage_valid,
+ output int result,exceptionFlags );*/
+
+module fpu_test_min_max_tb;
+ reg clock;
+ reg RSTB;
+ reg CSB;
+
+ reg power1, power2;
+
+ 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 #12.5 clock <= (clock === 1'b0);
+
+ initial begin
+ clock = 0;
+ end
+
+ initial begin
+ $dumpfile("fpu_test_min_max.vcd");
+ $dumpvars(0, fpu_test_min_max_tb);
+
+ // Repeat cycles of 1000 clock edges as needed to complete testbench
+ repeat (30) 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
+ reg [32:0]i=1;
+ initial begin
+ fork begin
+ forever begin
+ wait(checkbits == 16'h AB60) begin
+ $display("Monitor: Test %0d Started",i);
+ fork
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000000) begin//operand a
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.a)
+ $display("\na NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.a);
+ else
+ $display("\ntime = %0d \n a is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000004) begin//operand b
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.b)
+ $display("\nb NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.b);
+ else
+ $display("\ntime = %0d \n b is correct\n",$time);
+ end
+
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000024) begin//operand rm
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.round_mode)
+ $display("\nrm NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.round_mode);
+ else
+ $display("\ntime = %0d \n rm is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h3000001c) begin //operand operation
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != {19'b0,uut.mprj.mprj.fpu.valid_in,uut.mprj.mprj.fpu.op_in})
+ $display("\noperation NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,{19'b0,uut.mprj.mprj.fpu.valid_in, uut.mprj.mprj.fpu.op_in});
+ else
+ $display("\ntime = %0d \n operation is correct\n",$time );
+ end
+ join
+ wait(checkbits == 16'h AB61) begin
+ $display("Monitor: Test %0d Passed\n",i);
+ i = i+1;
+ end
+ end
+ end
+ end
+ begin
+ wait(checkbits == 16'h AB62)
+ begin
+ $display("Monitor: ALL Test Finished");
+ $finish;
+ //disable fork;
+ end
+ end
+ join
+
+ 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;
+
+ caravel uut (
+ .vddio (VDD3V3),
+ .vssio (VSS),
+ .vdda (VDD3V3),
+ .vssa (VSS),
+ .vccd (VDD1V8),
+ .vssd (VSS),
+ .vdda1 (VDD3V3),
+ .vdda2 (VDD3V3),
+ .vssa1 (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("fpu_test_min_max.hex")
+ ) spiflash (
+ .csb(flash_csb),
+ .clk(flash_clk),
+ .io0(flash_io0),
+ .io1(flash_io1),
+ .io2(),
+ .io3()
+ );
+
+endmodule
+`default_nettype wire
diff --git a/verilog/dv/wb_port/Makefile b/verilog/dv/fpu_test_multiply/Makefile
similarity index 94%
copy from verilog/dv/wb_port/Makefile
copy to verilog/dv/fpu_test_multiply/Makefile
index 132a1cc..bc2572b 100644
--- a/verilog/dv/wb_port/Makefile
+++ b/verilog/dv/fpu_test_multiply/Makefile
@@ -37,7 +37,7 @@
.SUFFIXES:
-PATTERN = wb_port
+PATTERN = fpu_test_multiply
all: ${PATTERN:=.vcd}
@@ -45,12 +45,13 @@
%.vvp: %_tb.v %.hex
ifeq ($(SIM),RTL)
- iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH) \
$< -o $@
+
else
- iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I$(UPRJ_RTL_PATH) -I $(UPRJ_VERILOG_PATH) \
$< -o $@
diff --git a/verilog/dv/fpu_test_multiply/fpu_test_multiply.c b/verilog/dv/fpu_test_multiply/fpu_test_multiply.c
new file mode 100644
index 0000000..2bedcbf
--- /dev/null
+++ b/verilog/dv/fpu_test_multiply/fpu_test_multiply.c
@@ -0,0 +1,128 @@
+/* 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 "verilog/dv/caravel/defs.h"
+#include "../verilog/dv/dv_defs.h"
+#include "verilog/dv/caravel/stub.c"
+/*
+ Wishbone Test:
+ - Configures MPRJ lower 8-IO pins as outputs
+ - Checks counter value through the wishbone port
+*/
+int i = 0;
+int clk = 0;
+void main()
+{
+ // volatile unit32_t *base_address;
+ /*
+ 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_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 = 0xFFFFFFFF; // [95:64]
+
+ // Flag start of the test1
+ reg_mprj_datal = 0xAB600000;
+
+ //writing into input csrs
+ ups_operand_a = 0x00000001;
+ ups_operand_b = 0x00000002;
+ ups_frm = 0x00000003;
+ ups_operation = 0b00000000000000000000001000000000;
+ //expected_result = 0x00000001;
+ //expected_exception = 0x00000003;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 512); //waiting for the operation to be completed
+
+ while (ups_result != 0x00000001);
+ while (ups_fflags != 0x00000003);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test1
+
+ // Flag start of the test2
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x7f7fffff;
+ ups_operand_b = 0x00000002;
+ ups_frm = 0x00000001;
+ ups_operation = 0b00000000000000000000001000000000;
+ //expected_result = 0x357fffff;
+ //expected_exception = 0x00000000;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 512); //waiting for the operation to be completed
+
+ while (ups_result != 0x357fffff);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test2
+
+ // Flag start of the test3
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x7F000000;
+ ups_operand_b = 0x7F700000;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000000001000000000;
+ //expected_result = 0x7f800000;
+ //expected_exception = 0x00000005;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 512); //waiting for the operation to be completed
+
+ while (ups_result != 0x7f800000);
+ while (ups_fflags != 0x00000005);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test3
+
+ reg_mprj_datal = 0xAB620000; //flag end of all test to finish
+
+}
+
+
diff --git a/verilog/dv/fpu_test_multiply/fpu_test_multiply_tb.v b/verilog/dv/fpu_test_multiply/fpu_test_multiply_tb.v
new file mode 100644
index 0000000..79d8de5
--- /dev/null
+++ b/verilog/dv/fpu_test_multiply/fpu_test_multiply_tb.v
@@ -0,0 +1,193 @@
+// 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
+//`include "fpu.c"
+`include "uprj_netlists.v"
+`include "caravel_netlists.v"
+`include "spiflash.v"
+
+/*import "DPI-C" context function void fpu_c (input int a,b,c,roundingMode,
+ input bit add_op,
+ input int COMP_op,MAC_op,min_max_op,signed_conv,
+ input int finalStage_valid,
+ output int result,exceptionFlags );*/
+
+module fpu_test_multiply_tb;
+ reg clock;
+ reg RSTB;
+ reg CSB;
+
+ reg power1, power2;
+
+ 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 #12.5 clock <= (clock === 1'b0);
+
+ initial begin
+ clock = 0;
+ end
+
+ initial begin
+ $dumpfile("fpu_test_multiply.vcd");
+ $dumpvars(0, fpu_test_multiply_tb);
+
+ // Repeat cycles of 1000 clock edges as needed to complete testbench
+ repeat (30) 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
+ reg [32:0]i=1;
+ initial begin
+ fork begin
+ forever begin
+ wait(checkbits == 16'h AB60) begin
+ $display("Monitor: Test %0d Started",i);
+ fork
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000000) begin//operand a
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.a)
+ $display("\na NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.a);
+ else
+ $display("\ntime = %0d \n a is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000004) begin//operand b
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.b)
+ $display("\nb NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.b);
+ else
+ $display("\ntime = %0d \n b is correct\n",$time);
+ end
+
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000024) begin//operand rm
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.round_mode)
+ $display("\nrm NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.round_mode);
+ else
+ $display("\ntime = %0d \n rm is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h3000001c) begin //operand operation
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != {19'b0,uut.mprj.mprj.fpu.valid_in,uut.mprj.mprj.fpu.op_in})
+ $display("\noperation NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,{19'b0,uut.mprj.mprj.fpu.valid_in, uut.mprj.mprj.fpu.op_in});
+ else
+ $display("\ntime = %0d \n operation is correct\n",$time );
+ end
+ join
+ wait(checkbits == 16'h AB61) begin
+ $display("Monitor: Test %0d Passed\n",i);
+ i = i+1;
+ end
+ end
+ end
+ end
+ begin
+ wait(checkbits == 16'h AB62)
+ begin
+ $display("Monitor: ALL Test Finished");
+ $finish;
+ //disable fork;
+ end
+ end
+ join
+
+ 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;
+
+ caravel uut (
+ .vddio (VDD3V3),
+ .vssio (VSS),
+ .vdda (VDD3V3),
+ .vssa (VSS),
+ .vccd (VDD1V8),
+ .vssd (VSS),
+ .vdda1 (VDD3V3),
+ .vdda2 (VDD3V3),
+ .vssa1 (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("fpu_test_multiply.hex")
+ ) spiflash (
+ .csb(flash_csb),
+ .clk(flash_clk),
+ .io0(flash_io0),
+ .io1(flash_io1),
+ .io2(),
+ .io3()
+ );
+
+endmodule
+`default_nettype wire
diff --git a/verilog/dv/wb_port/Makefile b/verilog/dv/fpu_test_sign_inject/Makefile
similarity index 94%
copy from verilog/dv/wb_port/Makefile
copy to verilog/dv/fpu_test_sign_inject/Makefile
index 132a1cc..3888b89 100644
--- a/verilog/dv/wb_port/Makefile
+++ b/verilog/dv/fpu_test_sign_inject/Makefile
@@ -37,7 +37,7 @@
.SUFFIXES:
-PATTERN = wb_port
+PATTERN = fpu_test_sign_inject
all: ${PATTERN:=.vcd}
@@ -45,12 +45,13 @@
%.vvp: %_tb.v %.hex
ifeq ($(SIM),RTL)
- iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH) \
$< -o $@
+
else
- iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I$(UPRJ_RTL_PATH) -I $(UPRJ_VERILOG_PATH) \
$< -o $@
diff --git a/verilog/dv/fpu_test_sign_inject/fpu_test_sign_inject.c b/verilog/dv/fpu_test_sign_inject/fpu_test_sign_inject.c
new file mode 100644
index 0000000..d8af9f8
--- /dev/null
+++ b/verilog/dv/fpu_test_sign_inject/fpu_test_sign_inject.c
@@ -0,0 +1,127 @@
+/* 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 "verilog/dv/caravel/defs.h"
+#include "../verilog/dv/dv_defs.h"
+#include "verilog/dv/caravel/stub.c"
+/*
+ Wishbone Test:
+ - Configures MPRJ lower 8-IO pins as outputs
+ - Checks counter value through the wishbone port
+*/
+int i = 0;
+int clk = 0;
+void main()
+{
+ // volatile unit32_t *base_address;
+ /*
+ 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_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 = 0xFFFFFFFF; // [95:64]
+
+ // Flag start of the test1
+ reg_mprj_datal = 0xAB600000;
+
+ //writing into input csrs
+ ups_operand_a = 0x7f800000;
+ ups_operand_b = 0xff800770;
+
+ ups_operation = 0b00000000000000000000000000001000;
+ //expected_result = 0xff800000;
+ //expected_exception = 0x00000000;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 8); //waiting for the operation to be completed
+
+ while (ups_result != 0xff800000);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test1
+
+ // Flag start of the test2
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x7f800000;
+ ups_operand_b = 0xff800770;
+
+ ups_operation = 0b00000000000000000000000000001001;
+ //expected_result = 0x7f800000;
+ //expected_exception = 0x00000000;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 9); //waiting for the operation to be completed
+
+ while (ups_result != 0x7f800000);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test2
+
+ // Flag start of the test3
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x7f800000;
+ ups_operand_b = 0xff800770;
+ ups_operation = 0b00000000000000000000000000001010;
+ //expected_result = 0xff800000;
+ //expected_exception = 0x00000000;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 10); //waiting for the operation to be completed
+
+ while (ups_result != 0xff800000);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test3
+
+ reg_mprj_datal = 0xAB620000; //flag end of all test to finish
+
+}
+
+
diff --git a/verilog/dv/fpu_test_sign_inject/fpu_test_sign_inject_tb.v b/verilog/dv/fpu_test_sign_inject/fpu_test_sign_inject_tb.v
new file mode 100644
index 0000000..1fcf107
--- /dev/null
+++ b/verilog/dv/fpu_test_sign_inject/fpu_test_sign_inject_tb.v
@@ -0,0 +1,186 @@
+// 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
+//`include "fpu.c"
+`include "uprj_netlists.v"
+`include "caravel_netlists.v"
+`include "spiflash.v"
+
+/*import "DPI-C" context function void fpu_c (input int a,b,c,roundingMode,
+ input bit add_op,
+ input int COMP_op,MAC_op,min_max_op,signed_conv,
+ input int finalStage_valid,
+ output int result,exceptionFlags );*/
+
+module fpu_test_sign_inject_tb;
+ reg clock;
+ reg RSTB;
+ reg CSB;
+
+ reg power1, power2;
+
+ 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 #12.5 clock <= (clock === 1'b0);
+
+ initial begin
+ clock = 0;
+ end
+
+ initial begin
+ $dumpfile("fpu_test_sign_inject.vcd");
+ $dumpvars(0, fpu_test_sign_inject_tb);
+
+ // Repeat cycles of 1000 clock edges as needed to complete testbench
+ repeat (30) 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
+ reg [32:0]i=1;
+initial begin
+ fork begin
+ forever begin
+ wait(checkbits == 16'h AB60) begin
+ $display("Monitor: Test %0d Started",i);
+ fork
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000000) begin//operand a
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.a)
+ $display("\na NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.a);
+ else
+ $display("\ntime = %0d \n a is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000004) begin//operand b
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.b)
+ $display("\nb NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.b);
+ else
+ $display("\ntime = %0d \n b is correct\n",$time);
+ end
+
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h3000001c) begin //operand operation
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != {19'b0,uut.mprj.mprj.fpu.valid_in,uut.mprj.mprj.fpu.op_in})
+ $display("\noperation NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,{19'b0,uut.mprj.mprj.fpu.valid_in, uut.mprj.mprj.fpu.op_in});
+ else
+ $display("\ntime = %0d \n operation is correct\n",$time );
+ end
+ join
+ wait(checkbits == 16'h AB61) begin
+ $display("Monitor: Test %0d Passed\n",i);
+ i = i+1;
+ end
+ end
+ end
+ end
+ begin
+ wait(checkbits == 16'h AB62)
+ begin
+ $display("Monitor: ALL Test Finished");
+ $finish;
+ //disable fork;
+ end
+ end
+ join
+
+ 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;
+
+ caravel uut (
+ .vddio (VDD3V3),
+ .vssio (VSS),
+ .vdda (VDD3V3),
+ .vssa (VSS),
+ .vccd (VDD1V8),
+ .vssd (VSS),
+ .vdda1 (VDD3V3),
+ .vdda2 (VDD3V3),
+ .vssa1 (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("fpu_test_sign_inject.hex")
+ ) spiflash (
+ .csb(flash_csb),
+ .clk(flash_clk),
+ .io0(flash_io0),
+ .io1(flash_io1),
+ .io2(),
+ .io3()
+ );
+
+endmodule
+`default_nettype wire
diff --git a/verilog/dv/wb_port/Makefile b/verilog/dv/fpu_test_sqrt/Makefile
similarity index 94%
copy from verilog/dv/wb_port/Makefile
copy to verilog/dv/fpu_test_sqrt/Makefile
index 132a1cc..c1f5d99 100644
--- a/verilog/dv/wb_port/Makefile
+++ b/verilog/dv/fpu_test_sqrt/Makefile
@@ -37,7 +37,7 @@
.SUFFIXES:
-PATTERN = wb_port
+PATTERN = fpu_test_sqrt
all: ${PATTERN:=.vcd}
@@ -45,12 +45,13 @@
%.vvp: %_tb.v %.hex
ifeq ($(SIM),RTL)
- iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH) \
$< -o $@
+
else
- iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
+ iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
-I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \
-I $(UPRJ_BEHAVIOURAL_MODELS) -I$(UPRJ_RTL_PATH) -I $(UPRJ_VERILOG_PATH) \
$< -o $@
diff --git a/verilog/dv/fpu_test_sqrt/fpu_test_sqrt.c b/verilog/dv/fpu_test_sqrt/fpu_test_sqrt.c
new file mode 100644
index 0000000..9962221
--- /dev/null
+++ b/verilog/dv/fpu_test_sqrt/fpu_test_sqrt.c
@@ -0,0 +1,128 @@
+/* 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 "verilog/dv/caravel/defs.h"
+#include "../verilog/dv/dv_defs.h"
+#include "verilog/dv/caravel/stub.c"
+/*
+ Wishbone Test:
+ - Configures MPRJ lower 8-IO pins as outputs
+ - Checks counter value through the wishbone port
+*/
+int i = 0;
+int clk = 0;
+void main()
+{
+ // volatile unit32_t *base_address;
+ /*
+ 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_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 = 0xFFFFFFFF; // [95:64]
+
+ // Flag start of the test1
+ reg_mprj_datal = 0xAB600000;
+
+ //writing into input csrs
+ ups_operand_a = 0x00000001;
+ ups_operand_b = 0x00000001;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000001000000000000;
+ //expected_result = 0x1a3504f3;
+ //expected_exception = 0x00000001;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 0x00001000); //waiting for the operation to be completed
+
+ while (ups_result != 0x1a3504f3);
+ while (ups_fflags != 0x00000001);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test1
+
+ // Flag start of the test2
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x00800000;
+ ups_operand_b = 0x7f7fffff;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000001000000000000;
+ //expected_result = 0x20000000;
+ //expected_exception = 0x00000000;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 0x00001000); //waiting for the operation to be completed
+
+ while (ups_result != 0x20000000);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test2
+
+ // Flag start of the test3
+ reg_mprj_datal = 0xAB600000;
+
+ ups_operand_a = 0x7f800000;
+ ups_operand_b = 0x00000000;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000001000000000000;
+ //expected_result = 0x7f800000;
+ //expected_exception = 0x00000000;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 0x00001000); //waiting for the operation to be completed
+
+ while (ups_result != 0x7f800000);
+ while (ups_fflags != 0x00000000);
+
+ reg_mprj_datal = 0xAB610000; //flag end of test3
+
+ reg_mprj_datal = 0xAB620000; //flag end of all test to finish
+
+}
+
+
diff --git a/verilog/dv/fpu_test_sqrt/fpu_test_sqrt_tb.v b/verilog/dv/fpu_test_sqrt/fpu_test_sqrt_tb.v
new file mode 100644
index 0000000..dfb4a06
--- /dev/null
+++ b/verilog/dv/fpu_test_sqrt/fpu_test_sqrt_tb.v
@@ -0,0 +1,193 @@
+// 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
+//`include "fpu.c"
+`include "uprj_netlists.v"
+`include "caravel_netlists.v"
+`include "spiflash.v"
+
+/*import "DPI-C" context function void fpu_c (input int a,b,c,roundingMode,
+ input bit add_op,
+ input int COMP_op,MAC_op,min_max_op,signed_conv,
+ input int finalStage_valid,
+ output int result,exceptionFlags );*/
+
+module fpu_test_sqrt_tb;
+ reg clock;
+ reg RSTB;
+ reg CSB;
+
+ reg power1, power2;
+
+ 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 #12.5 clock <= (clock === 1'b0);
+
+ initial begin
+ clock = 0;
+ end
+
+ initial begin
+ $dumpfile("fpu_test_sqrt.vcd");
+ $dumpvars(0, fpu_test_sqrt_tb);
+
+ // Repeat cycles of 1000 clock edges as needed to complete testbench
+ repeat (30) 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
+ reg [32:0]i=1;
+ initial begin
+ fork begin
+ forever begin
+ wait(checkbits == 16'h AB60) begin
+ $display("Monitor: Test %0d Started",i);
+ fork
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000000) begin//operand a
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.a)
+ $display("\na NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.a);
+ else
+ $display("\ntime = %0d \n a is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000004) begin//operand b
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.b)
+ $display("\nb NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.b);
+ else
+ $display("\ntime = %0d \n b is correct\n",$time);
+ end
+
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h30000024) begin//operand rm
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != uut.mprj.mprj.fpu.round_mode)
+ $display("\nrm NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,uut.mprj.mprj.fpu.round_mode);
+ else
+ $display("\ntime = %0d \n rm is correct\n",$time);
+ end
+ wait(uut.mprj.mprj.wbs_adr_i == 32'h3000001c) begin //operand operation
+ repeat(2)@(negedge uut.mprj.mprj.wb_clk_i);
+ if(uut.mprj.mprj.wbs_dat_i != {19'b0,uut.mprj.mprj.fpu.valid_in,uut.mprj.mprj.fpu.op_in})
+ $display("\noperation NOT CORRECT \ntime = %0d\tactual = 32'h%0h\ expected = 32'h%0h",$time,uut.mprj.mprj.wbs_dat_i,{19'b0,uut.mprj.mprj.fpu.valid_in, uut.mprj.mprj.fpu.op_in});
+ else
+ $display("\ntime = %0d \n operation is correct\n",$time );
+ end
+ join
+ wait(checkbits == 16'h AB61) begin
+ $display("Monitor: Test %0d Passed\n",i);
+ i = i+1;
+ end
+ end
+ end
+ end
+ begin
+ wait(checkbits == 16'h AB62)
+ begin
+ $display("Monitor: ALL Test Finished");
+ $finish;
+ //disable fork;
+ end
+ end
+ join
+
+ 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;
+
+ caravel uut (
+ .vddio (VDD3V3),
+ .vssio (VSS),
+ .vdda (VDD3V3),
+ .vssa (VSS),
+ .vccd (VDD1V8),
+ .vssd (VSS),
+ .vdda1 (VDD3V3),
+ .vdda2 (VDD3V3),
+ .vssa1 (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("fpu_test_sqrt.hex")
+ ) spiflash (
+ .csb(flash_csb),
+ .clk(flash_clk),
+ .io0(flash_io0),
+ .io1(flash_io1),
+ .io2(),
+ .io3()
+ );
+
+endmodule
+`default_nettype wire
diff --git a/verilog/dv/io_ports/io_ports.c b/verilog/dv/io_ports/io_ports.c
deleted file mode 100644
index 0b23571..0000000
--- a/verilog/dv/io_ports/io_ports.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2020 Efabless Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * SPDX-License-Identifier: Apache-2.0
- */
-
-// This include is relative to $CARAVEL_PATH (see Makefile)
-#include "verilog/dv/caravel/defs.h"
-#include "verilog/dv/caravel/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_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.
-
- // 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);
-
-}
-
diff --git a/verilog/dv/io_ports/Makefile b/verilog/dv/io_ports_fpu_test/Makefile
similarity index 100%
rename from verilog/dv/io_ports/Makefile
rename to verilog/dv/io_ports_fpu_test/Makefile
diff --git a/verilog/dv/io_ports_fpu_test/io_ports.c b/verilog/dv/io_ports_fpu_test/io_ports.c
new file mode 100644
index 0000000..950e3ec
--- /dev/null
+++ b/verilog/dv/io_ports_fpu_test/io_ports.c
@@ -0,0 +1,118 @@
+/*
+ * 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 "verilog/dv/caravel/defs.h"
+#include "../verilog/dv/dv_defs.h"
+#include "verilog/dv/caravel/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_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.
+
+ // 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;
+ reg_mprj_io_8 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_9 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_10 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_11 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_12 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_13 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_14 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_15 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_16 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_17 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_18 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_19 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_20 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_21 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_22 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_23 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_24 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_25 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_26 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_27 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_28 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_29 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_30 = GPIO_MODE_USER_STD_OUTPUT;
+ reg_mprj_io_31 = GPIO_MODE_USER_STD_OUTPUT;
+/*
+ reg_mprj_io_32 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_33 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_34 = GPIO_MODE_MGMT_STD_OUTPUT;
+ reg_mprj_io_35 = GPIO_MODE_MGMT_STD_OUTPUT;
+*/
+ /* Apply configuration */
+ reg_mprj_xfer = 1;
+ while (reg_mprj_xfer == 1);
+ //reg_la2_oenb = reg_la2_iena = 0xFFFFFFFF; // [95:64]
+
+ // Flag start of the test1
+ //reg_mprj_datah = 0xAB600001;
+
+ //writing into input csrs
+ ups_operand_a = 0x00000001;
+ ups_operand_b = 0x00000002;
+ ups_frm = 0x00000000;
+ ups_operation = 0b00000000000000000000000100000000;
+
+ while (ups_interrupt_generation != 1);
+ while (ups_operation_completed != 256); //waiting for the operation to be completed
+
+ while (ups_result != 0x00000003);
+ while (ups_fflags != 0x00000000);
+
+}
+
diff --git a/verilog/dv/io_ports/io_ports_tb.v b/verilog/dv/io_ports_fpu_test/io_ports_tb.v
similarity index 87%
rename from verilog/dv/io_ports/io_ports_tb.v
rename to verilog/dv/io_ports_fpu_test/io_ports_tb.v
index f7628bc..e292ccc 100644
--- a/verilog/dv/io_ports/io_ports_tb.v
+++ b/verilog/dv/io_ports_fpu_test/io_ports_tb.v
@@ -30,9 +30,9 @@
wire gpio;
wire [37:0] mprj_io;
- wire [7:0] mprj_io_0;
+ wire [31:0] mprj_io_0;
- assign mprj_io_0 = mprj_io[7:0];
+ assign mprj_io_0 = mprj_io[31:0];
// assign mprj_io_0 = {mprj_io[8:4],mprj_io[2:0]};
assign mprj_io[3] = (CSB == 1'b1) ? 1'b1 : 1'bz;
@@ -54,7 +54,7 @@
// Repeat cycles of 1000 clock edges as needed to complete testbench
repeat (25) begin
- repeat (1000) @(posedge clock);
+ repeat (5000) @(posedge clock);
// $display("+1000 cycles");
end
$display("%c[1;31m",27);
@@ -69,24 +69,14 @@
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);
+ wait(mprj_io_0 == 32'h00000003);
`ifdef GL
$display("Monitor: Test 1 Mega-Project IO (GL) Passed");
`else
$display("Monitor: Test 1 Mega-Project IO (RTL) Passed");
`endif
+ #100;
$finish;
end
diff --git a/verilog/dv/la_test1/Makefile b/verilog/dv/la_test1/Makefile
deleted file mode 100644
index b23075d..0000000
--- a/verilog/dv/la_test1/Makefile
+++ /dev/null
@@ -1,78 +0,0 @@
-# SPDX-FileCopyrightText: 2020 Efabless Corporation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-## Caravel Pointers
-CARAVEL_ROOT ?= ../../../caravel
-CARAVEL_PATH ?= $(CARAVEL_ROOT)
-CARAVEL_FIRMWARE_PATH = $(CARAVEL_PATH)/verilog/dv/caravel
-CARAVEL_VERILOG_PATH = $(CARAVEL_PATH)/verilog
-CARAVEL_RTL_PATH = $(CARAVEL_VERILOG_PATH)/rtl
-CARAVEL_BEHAVIOURAL_MODELS = $(CARAVEL_VERILOG_PATH)/dv/caravel
-
-## User Project Pointers
-UPRJ_VERILOG_PATH ?= ../../../verilog
-UPRJ_RTL_PATH = $(UPRJ_VERILOG_PATH)/rtl
-UPRJ_BEHAVIOURAL_MODELS = ../
-
-## RISCV GCC
-GCC_PATH?=/ef/apps/bin
-GCC_PREFIX?=riscv32-unknown-elf
-PDK_PATH?=/ef/tech/SW/sky130A
-
-## Simulation mode: RTL/GL
-SIM?=RTL
-
-.SUFFIXES:
-
-PATTERN = la_test1
-
-all: ${PATTERN:=.vcd}
-
-hex: ${PATTERN:=.hex}
-
-%.vvp: %_tb.v %.hex
-ifeq ($(SIM),RTL)
- iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
- -I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \
- -I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH) \
- $< -o $@
-else
- iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
- -I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \
- -I $(UPRJ_BEHAVIOURAL_MODELS) -I$(UPRJ_RTL_PATH) -I $(UPRJ_VERILOG_PATH) \
- $< -o $@
-endif
-
-%.vcd: %.vvp
- vvp $<
-
-%.elf: %.c $(CARAVEL_FIRMWARE_PATH)/sections.lds $(CARAVEL_FIRMWARE_PATH)/start.s
- ${GCC_PATH}/${GCC_PREFIX}-gcc -I $(CARAVEL_PATH) -march=rv32imc -mabi=ilp32 -Wl,-Bstatic,-T,$(CARAVEL_FIRMWARE_PATH)/sections.lds,--strip-debug -ffreestanding -nostdlib -o $@ $(CARAVEL_FIRMWARE_PATH)/start.s $<
-
-%.hex: %.elf
- ${GCC_PATH}/${GCC_PREFIX}-objcopy -O verilog $< $@
- # to fix flash base address
- sed -i 's/@10000000/@00000000/g' $@
-
-%.bin: %.elf
- ${GCC_PATH}/${GCC_PREFIX}-objcopy -O binary $< /dev/stdout | tail -c +1048577 > $@
-
-# ---- Clean ----
-
-clean:
- rm -f *.elf *.hex *.bin *.vvp *.vcd *.log
-
-.PHONY: clean hex all
diff --git a/verilog/dv/la_test1/la_test1.c b/verilog/dv/la_test1/la_test1.c
deleted file mode 100644
index 220bdfe..0000000
--- a/verilog/dv/la_test1/la_test1.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2020 Efabless Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * SPDX-License-Identifier: Apache-2.0
- */
-
-// This include is relative to $CARAVEL_PATH (see Makefile)
-#include "verilog/dv/caravel/defs.h"
-#include "verilog/dv/caravel/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()
-{
-
- /* 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,
- // 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;
-
- /* Apply 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 = 0xFFFFFFFF; // [31:0]
- reg_la1_oenb = reg_la1_iena = 0x00000000; // [63:32]
- reg_la2_oenb = reg_la2_iena = 0xFFFFFFFF; // [95:64]
- reg_la3_oenb = reg_la3_iena = 0xFFFFFFFF; // [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 = 0xFFFFFFFF;
-
- while (1) {
- if (reg_la0_data > 0x1F4) {
- reg_mprj_datal = 0xAB410000;
- break;
- }
- }
- print("\n");
- print("Monitor: Test 2 Passed\n\n"); // Makes simulation very long!
- reg_mprj_datal = 0xAB510000;
-}
-
diff --git a/verilog/dv/la_test1/la_test1_tb.v b/verilog/dv/la_test1/la_test1_tb.v
deleted file mode 100644
index 626e390..0000000
--- a/verilog/dv/la_test1/la_test1_tb.v
+++ /dev/null
@@ -1,149 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-
-`timescale 1 ns / 1 ps
-
-`include "uprj_netlists.v"
-`include "caravel_netlists.v"
-`include "spiflash.v"
-`include "tbuart.v"
-
-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
-
- assign mprj_io[3] = (CSB == 1'b1) ? 1'b1 : 1'bz;
-
- initial begin
- // $dumpfile("la_test1.vcd");
- // $dumpvars(0, la_test1_tb);
-
- // Repeat cycles of 1000 clock edges as needed to complete testbench
- repeat (200) 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);
- #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;
-
- caravel uut (
- .vddio (VDD3V3),
- .vssio (VSS),
- .vdda (VDD3V3),
- .vssa (VSS),
- .vccd (VDD1V8),
- .vssd (VSS),
- .vdda1 (VDD3V3),
- .vdda2 (VDD3V3),
- .vssa1 (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
diff --git a/verilog/dv/la_test2/Makefile b/verilog/dv/la_test2_fpu/Makefile
similarity index 100%
rename from verilog/dv/la_test2/Makefile
rename to verilog/dv/la_test2_fpu/Makefile
diff --git a/verilog/dv/la_test2/la_test2.c b/verilog/dv/la_test2_fpu/la_test2.c
similarity index 68%
rename from verilog/dv/la_test2/la_test2.c
rename to verilog/dv/la_test2_fpu/la_test2.c
index f9a293c..4233337 100644
--- a/verilog/dv/la_test2/la_test2.c
+++ b/verilog/dv/la_test2_fpu/la_test2.c
@@ -81,12 +81,12 @@
/* Apply configuration */
reg_mprj_xfer = 1;
while (reg_mprj_xfer == 1);
-
+ reg_la2_data = 0x00000000;
// Configure All LA probes as inputs to the cpu
- reg_la0_oenb = reg_la0_iena = 0xFFFFFFFF; // [31:0]
- reg_la1_oenb = reg_la1_iena = 0xFFFFFFFF; // [63:32]
- reg_la2_oenb = reg_la2_iena = 0xFFFFFFFF; // [95:64]
- reg_la3_oenb = reg_la3_iena = 0xFFFFFFFF; // [127:96]
+ reg_la0_oenb = reg_la0_iena = 0x00000000; // [31:0] //output
+ reg_la1_oenb = reg_la1_iena = 0x00000000; // [63:32] //output
+ reg_la2_oenb = reg_la2_iena = 0xFFFFFFFF; // [95:64] //input
+ reg_la3_oenb = reg_la3_iena = 0xFFFFFFFF; // [127:96] //input
// Flag start of the test
reg_mprj_datal = 0xAB600000;
@@ -98,13 +98,51 @@
reg_la2_data = 0x00000003;
// Toggle clk & de-assert reset
- for (i=0; i<11; i=i+1) {
+ for (i=0; i<12; i=i+1) {
clk = !clk;
reg_la2_data = 0x00000000 | clk;
- }
+ if(i==0)
+ {reg_la0_data = 0x30000000;
+ reg_la1_data = 0x00000001; }
+ else if(i==2)
+ {reg_la0_data = 0x30000004;
+ reg_la1_data = 0x00000002; }
+ else if(i==4)
+ {reg_la0_data = 0x30000024;
+ reg_la1_data = 0x00000003; }
+ else if(i==6)
+ {
+ reg_la0_data = 0x3000001c;
+ reg_la1_data = 0x00000100;
+ }
+ else if(i==8)
+ {
+ reg_la0_data = 0x30000010;
+
+ }
+ else if(i>=10)
+ {
+ if(reg_la1_data = 0x00000100)
+ {
+
+ reg_la1_oenb = reg_la1_iena = 0xFFFFFFFF;
+ reg_la0_oenb = reg_la0_iena = 0xFFFFFFFF;
- if (reg_la0_data == 0x05) {
- reg_mprj_datal = 0xAB610000;
+ }
+
+
+ }
+
+
+
+ }
+ reg_la1_oenb = reg_la1_iena = 0xFFFFFFFF;
+ reg_la0_oenb = reg_la0_iena = 0xFFFFFFFF;
+
+
+ if (reg_la0_data == 0x00000003) {
+ reg_mprj_datal = 0xAB610000;
+ reg_mprj_datal = 0xAB610000;
}
}
diff --git a/verilog/dv/la_test2/la_test2_tb.v b/verilog/dv/la_test2_fpu/la_test2_tb.v
similarity index 98%
rename from verilog/dv/la_test2/la_test2_tb.v
rename to verilog/dv/la_test2_fpu/la_test2_tb.v
index e09905e..ee676b4 100644
--- a/verilog/dv/la_test2/la_test2_tb.v
+++ b/verilog/dv/la_test2_fpu/la_test2_tb.v
@@ -47,7 +47,7 @@
// Repeat cycles of 1000 clock edges as needed to complete testbench
repeat (30) begin
- repeat (1000) @(posedge clock);
+ repeat (5500) @(posedge clock);
// $display("+1000 cycles");
end
$display("%c[1;31m",27);
diff --git a/verilog/dv/mprj_stimulus/Makefile b/verilog/dv/mprj_stimulus/Makefile
deleted file mode 100644
index 304d32c..0000000
--- a/verilog/dv/mprj_stimulus/Makefile
+++ /dev/null
@@ -1,78 +0,0 @@
-# SPDX-FileCopyrightText: 2020 Efabless Corporation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-## Caravel Pointers
-CARAVEL_ROOT ?= ../../../caravel
-CARAVEL_PATH ?= $(CARAVEL_ROOT)
-CARAVEL_FIRMWARE_PATH = $(CARAVEL_PATH)/verilog/dv/caravel
-CARAVEL_VERILOG_PATH = $(CARAVEL_PATH)/verilog
-CARAVEL_RTL_PATH = $(CARAVEL_VERILOG_PATH)/rtl
-CARAVEL_BEHAVIOURAL_MODELS = $(CARAVEL_VERILOG_PATH)/dv/caravel
-
-## User Project Pointers
-UPRJ_VERILOG_PATH ?= ../../../verilog
-UPRJ_RTL_PATH = $(UPRJ_VERILOG_PATH)/rtl
-UPRJ_BEHAVIOURAL_MODELS = ../
-
-## RISCV GCC
-GCC_PATH?=/ef/apps/bin
-GCC_PREFIX?=riscv32-unknown-elf
-PDK_PATH?=/ef/tech/SW/sky130A
-
-## Simulation mode: RTL/GL
-SIM?=RTL
-
-.SUFFIXES:
-
-PATTERN = mprj_stimulus
-
-all: ${PATTERN:=.vcd}
-
-hex: ${PATTERN:=.hex}
-
-%.vvp: %_tb.v %.hex
-ifeq ($(SIM),RTL)
- iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
- -I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \
- -I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH) \
- $< -o $@
-else
- iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
- -I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \
- -I $(UPRJ_BEHAVIOURAL_MODELS) -I$(UPRJ_RTL_PATH) -I $(UPRJ_VERILOG_PATH) \
- $< -o $@
-endif
-
-%.vcd: %.vvp
- vvp $<
-
-%.elf: %.c $(CARAVEL_FIRMWARE_PATH)/sections.lds $(CARAVEL_FIRMWARE_PATH)/start.s
- ${GCC_PATH}/${GCC_PREFIX}-gcc -I $(CARAVEL_PATH) -march=rv32imc -mabi=ilp32 -Wl,-Bstatic,-T,$(CARAVEL_FIRMWARE_PATH)/sections.lds,--strip-debug -ffreestanding -nostdlib -o $@ $(CARAVEL_FIRMWARE_PATH)/start.s $<
-
-%.hex: %.elf
- ${GCC_PATH}/${GCC_PREFIX}-objcopy -O verilog $< $@
- # to fix flash base address
- sed -i 's/@10000000/@00000000/g' $@
-
-%.bin: %.elf
- ${GCC_PATH}/${GCC_PREFIX}-objcopy -O binary $< /dev/stdout | tail -c +1048577 > $@
-
-# ---- Clean ----
-
-clean:
- rm -f *.elf *.hex *.bin *.vvp *.vcd *.log
-
-.PHONY: clean hex all
diff --git a/verilog/dv/mprj_stimulus/mprj_stimulus.c b/verilog/dv/mprj_stimulus/mprj_stimulus.c
deleted file mode 100644
index e4d0a2d..0000000
--- a/verilog/dv/mprj_stimulus/mprj_stimulus.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2020 Efabless Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * SPDX-License-Identifier: Apache-2.0
- */
-
-// This include is relative to $CARAVEL_PATH (see Makefile)
-#include "verilog/dv/caravel/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_spimaster_config = 0xa002; // Enable, prescaler = 2
-
- 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_BIDIRECTIONAL;
- reg_mprj_io_34 = GPIO_MODE_MGMT_STD_BIDIRECTIONAL;
- reg_mprj_io_33 = GPIO_MODE_MGMT_STD_BIDIRECTIONAL;
- reg_mprj_io_32 = GPIO_MODE_MGMT_STD_BIDIRECTIONAL;
-
- 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_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;
-
- /* 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 = 0xFFFFFFFF; // [31:0]
- reg_la1_oenb = reg_la1_iena = 0x00000000; // [63:32]
- reg_la2_oenb = reg_la2_iena = 0xFFFFFFFF; // [95:64]
- reg_la3_oenb = reg_la3_iena = 0xFFFFFFFF; // [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 = 0xFFFFFFFF;
-
- 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 = 0xffffffca;
- reg_mprj_datah = 0x00000000;
- reg_mprj_datah = 0x0f0f0fc5;
- reg_mprj_datah = 0x00000000;
-
- // 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 & 0xff8) << 9) & 0xffff0000;
-
- // Flag end of the test
- reg_mprj_datal = 0xAB510000;
-}
-
diff --git a/verilog/dv/mprj_stimulus/mprj_stimulus_tb.v b/verilog/dv/mprj_stimulus/mprj_stimulus_tb.v
deleted file mode 100644
index 1409015..0000000
--- a/verilog/dv/mprj_stimulus/mprj_stimulus_tb.v
+++ /dev/null
@@ -1,157 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype wire
-
-`timescale 1 ns / 1 ps
-
-`include "uprj_netlists.v"
-`include "caravel_netlists.v"
-`include "spiflash.v"
-`include "tbuart.v"
-
-module mprj_stimulus_tb;
- // Signals declaration
- reg clock;
- reg RSTB;
- reg CSB;
- reg power1, power2;
- reg power3, power4;
-
- wire HIGH;
- wire LOW;
- wire TRI;
- assign HIGH = 1'b1;
- assign LOW = 1'b0;
- assign TRI = 1'bz;
-
- wire gpio;
- wire uart_tx;
- wire [37:0] mprj_io;
- wire [15:0] checkbits;
- wire [3:0] status;
-
- // Signals Assignment
- assign checkbits = mprj_io[31:16];
- assign status = mprj_io[35:32];
- assign uart_tx = mprj_io[6];
- assign mprj_io[3] = (CSB == 1'b1) ? 1'b1 : 1'bz;
-
- always #12.5 clock <= (clock === 1'b0);
-
- initial begin
- clock = 0;
- end
-
- initial begin
- $dumpfile("mprj_stimulus.vcd");
- $dumpvars(0, mprj_stimulus_tb);
-
- // Repeat cycles of 1000 clock edges as needed to complete testbench
- repeat (150) begin
- repeat (1000) @(posedge clock);
- end
- $display("%c[1;31m",27);
- $display ("Monitor: Timeout, Test Project IO Stimulus (RTL) Failed");
- $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);
- // Value 0009 reflects copying user-controlled outputs to memory and back
- // to management-controlled outputs.
- wait(checkbits == 16'h0009);
- wait(checkbits == 16'hAB51);
- $display("Monitor: mprj_stimulus test Passed");
- #10000;
- $finish;
- end
-
- // Reset Operation
- 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 VDD3V3 = power1;
- wire VDD1V8 = power2;
- wire VSS = 1'b0;
-
- caravel uut (
- .vddio (VDD3V3),
- .vssio (VSS),
- .vdda (VDD3V3),
- .vssa (VSS),
- .vccd (VDD1V8),
- .vssd (VSS),
- .vdda1 (VDD3V3),
- .vdda2 (VDD3V3),
- .vssa1 (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
- );
-
- // Testbench UART
- tbuart tbuart (
- .ser_rx(uart_tx)
- );
-
-endmodule
-`default_nettype wire
diff --git a/verilog/dv/wb_port/wb_port.c b/verilog/dv/wb_port/wb_port.c
deleted file mode 100644
index 425c115..0000000
--- a/verilog/dv/wb_port/wb_port.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2020 Efabless Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * SPDX-License-Identifier: Apache-2.0
- */
-
-// This include is relative to $CARAVEL_PATH (see Makefile)
-#include "verilog/dv/caravel/defs.h"
-#include "verilog/dv/caravel/stub.c"
-
-/*
- Wishbone Test:
- - Configures MPRJ lower 8-IO pins as outputs
- - Checks counter value through the wishbone port
-*/
-int i = 0;
-int clk = 0;
-
-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_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 = 0xFFFFFFFF; // [95:64]
-
- // Flag start of the test
- reg_mprj_datal = 0xAB600000;
-
- reg_mprj_slave = 0x00002710;
- if (reg_mprj_slave == 0x2752) {
- reg_mprj_datal = 0xAB610000;
- } else {
- reg_mprj_datal = 0xAB600000;
- }
-}
diff --git a/verilog/dv/wb_port/wb_port_tb.v b/verilog/dv/wb_port/wb_port_tb.v
deleted file mode 100644
index b32f900..0000000
--- a/verilog/dv/wb_port/wb_port_tb.v
+++ /dev/null
@@ -1,157 +0,0 @@
-// SPDX-FileCopyrightText: 2020 Efabless Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-
-`timescale 1 ns / 1 ps
-
-`include "uprj_netlists.v"
-`include "caravel_netlists.v"
-`include "spiflash.v"
-
-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] = (CSB == 1'b1) ? 1'b1 : 1'bz;
-
- // 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
-
- initial begin
- $dumpfile("wb_port.vcd");
- $dumpvars(0, wb_port_tb);
-
- // Repeat cycles of 1000 clock edges as needed to complete testbench
- repeat (30) 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'h AB60);
- $display("Monitor: MPRJ-Logic WB Started");
- wait(checkbits == 16'h AB61);
- `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
- #170000;
- 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 = power1;
- wire VDD1V8 = power2;
- wire USER_VDD3V3 = power3;
- wire USER_VDD1V8 = power4;
- wire VSS = 1'b0;
-
- caravel uut (
- .vddio (VDD3V3),
- .vssio (VSS),
- .vdda (VDD3V3),
- .vssa (VSS),
- .vccd (VDD1V8),
- .vssd (VSS),
- .vdda1 (USER_VDD3V3),
- .vdda2 (USER_VDD3V3),
- .vssa1 (VSS),
- .vssa2 (VSS),
- .vccd1 (USER_VDD1V8),
- .vccd2 (USER_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
\ No newline at end of file