diff --git a/.github/workflows/user_project_ci.yml b/.github/workflows/user_project_ci.yml index 87f7d3ee0..f13d5b3c4 100644 --- a/.github/workflows/user_project_ci.yml +++ b/.github/workflows/user_project_ci.yml @@ -42,7 +42,7 @@ jobs: tar -cf /tmp/caravel.tar -C $CARAVEL_ROOT . - name: Upload Caravel Tarball - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: caravel-tarball path: /tmp/caravel.tar @@ -92,7 +92,7 @@ jobs: fi - name: Download caravel Tarball - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: caravel-tarball path: /tmp @@ -118,7 +118,7 @@ jobs: tar -cf /tmp/${{ env.dep_name }}.tar -C ${{ env.dep_root }} . - name: Upload Dependencies Tarball - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ env.dep_name }}-tarball path: /tmp/${{ env.dep_name }}.tar @@ -128,8 +128,8 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - pdk: ["sky130A", "sky130B"] - needs: [download_deps] + pdk: ["sky130A"] + needs: [download_deps, RTL-verification] steps: - uses: actions/checkout@v2 @@ -152,7 +152,7 @@ jobs: echo "MPW_TAG=main" >> $GITHUB_ENV - name: Download PDK Tarball - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: pdk-tarball path: /tmp @@ -164,7 +164,7 @@ jobs: tar -xf /tmp/pdk.tar -C $PDK_ROOT . - name: Download openlane Tarball - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: openlane-tarball path: /tmp @@ -177,6 +177,7 @@ jobs: - name: Harden using Openlane run: | + make setup python3 $GITHUB_WORKSPACE/.github/scripts/get_designs.py --design $GITHUB_WORKSPACE for word in $(cat harden_sequence.txt); do echo "CURRENT_DESIGN=${word}" >> $GITHUB_ENV @@ -201,7 +202,7 @@ jobs: tar -cf /tmp/design_${{ matrix.pdk }}.tar -C $GITHUB_WORKSPACE . - name: Upload Design_${{ matrix.pdk }} Tarball - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: design_${{ matrix.pdk }}-tarball path: /tmp/design_${{ matrix.pdk }}.tar @@ -211,7 +212,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - pdk: ["sky130A", "sky130B"] + pdk: ["sky130A"] needs: [download_deps] steps: - uses: actions/checkout@v2 @@ -235,7 +236,7 @@ jobs: echo "MPW_TAG=main" >> $GITHUB_ENV - name: Download PDK Tarball - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: pdk-tarball path: /tmp @@ -247,7 +248,7 @@ jobs: tar -xf /tmp/pdk.tar -C $PDK_ROOT . - name: Download caravel Tarball - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: caravel-tarball path: /tmp @@ -259,7 +260,7 @@ jobs: tar -xf /tmp/caravel.tar -C $CARAVEL_ROOT . - name: Download mgmt_core_wrapper Tarball - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: mgmt_core_wrapper-tarball path: /tmp @@ -287,7 +288,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - pdk: ["sky130A", "sky130B"] + pdk: ["sky130A"] needs: [hardening] steps: - uses: actions/checkout@v2 @@ -310,7 +311,7 @@ jobs: echo "MPW_TAG=main" >> $GITHUB_ENV - name: Download PDK Tarball - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: pdk-tarball path: /tmp @@ -322,7 +323,7 @@ jobs: tar -xf /tmp/pdk.tar -C $PDK_ROOT . - name: Download precheck Tarball - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: precheck-tarball path: /tmp @@ -334,7 +335,7 @@ jobs: tar -xf /tmp/precheck.tar -C $PRECHECK_ROOT . - name: Download Design_${{ matrix.pdk }} Tarball - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: design_${{ matrix.pdk }}-tarball path: /tmp @@ -388,7 +389,7 @@ jobs: echo "MPW_TAG=main" >> $GITHUB_ENV - name: Download PDK Tarball - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: pdk-tarball path: /tmp @@ -400,7 +401,7 @@ jobs: tar -xf /tmp/pdk.tar -C $PDK_ROOT . - name: Download timing-scripts Tarball - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: timing-scripts-tarball path: /tmp @@ -412,7 +413,7 @@ jobs: tar -xf /tmp/timing-scripts.tar -C $TIMING_ROOT . - name: Download Design_${{ matrix.pdk }} Tarball - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: design_${{ matrix.pdk }}-tarball path: /tmp @@ -424,7 +425,7 @@ jobs: tar -xf /tmp/design_${{ matrix.pdk }}.tar -C $GITHUB_WORKSPACE . - name: Download Caravel Tarball - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: caravel-tarball path: /tmp @@ -436,7 +437,7 @@ jobs: tar -xf /tmp/caravel.tar -C ${{ env.CARAVEL_ROOT }} . - name: Download mgmt_core_wrapper Tarball - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: mgmt_core_wrapper-tarball path: /tmp @@ -470,90 +471,90 @@ jobs: exit 0 fi - # GL-verification: - # timeout-minutes: 720 - # runs-on: ubuntu-latest - # strategy: - # matrix: - # pdk: ["sky130A", "sky130B"] - # needs: [download_deps] - # steps: - # - uses: actions/checkout@v2 - - # - name: Set up QEMU - # uses: docker/setup-qemu-action@v1 - - # - name: Set up Docker Buildx - # uses: docker/setup-buildx-action@v1 - - # - name: Export ENVIRONMENT VARIABLES - # run: | - # echo "PDK=${{ matrix.pdk }}" >> $GITHUB_ENV - # echo "PDKPATH=$GITHUB_WORKSPACE/pdk/${{ matrix.pdk }}" >> $GITHUB_ENV - # echo "PDK_ROOT=$GITHUB_WORKSPACE/pdk" >> $GITHUB_ENV - # echo "OPENLANE_ROOT=$GITHUB_WORKSPACE/openlane_src" >> $GITHUB_ENV - # echo "CARAVEL_ROOT=$GITHUB_WORKSPACE/caravel" >> $GITHUB_ENV - # echo "MCW_ROOT=$GITHUB_WORKSPACE/mgmt_core_wrapper" >> $GITHUB_ENV - # echo "TIMING_ROOT=$GITHUB_WORKSPACE/timing-scripts" >> $GITHUB_ENV - # echo "PRECHECK_ROOT=$GITHUB_WORKSPACE/mpw_precheck" >> $GITHUB_ENV - # echo "MPW_TAG=main" >> $GITHUB_ENV - - # - name: Download PDK Tarball - # uses: actions/download-artifact@v2 - # with: - # name: pdk-tarball - # path: /tmp - - # - name: Unpack PDK Tarball - # run: | - # sudo mkdir -p ${{ env.PDK_ROOT }} - # sudo chown -R $USER:$USER ${{ env.PDK_ROOT }} - # tar -xf /tmp/pdk.tar -C $PDK_ROOT . + GL-verification: + timeout-minutes: 720 + runs-on: ubuntu-latest + strategy: + matrix: + pdk: ["sky130A"] + needs: [download_deps, hardening] + steps: + - uses: actions/checkout@v2 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Export ENVIRONMENT VARIABLES + run: | + echo "PDK=${{ matrix.pdk }}" >> $GITHUB_ENV + echo "PDKPATH=$GITHUB_WORKSPACE/pdk/${{ matrix.pdk }}" >> $GITHUB_ENV + echo "PDK_ROOT=$GITHUB_WORKSPACE/pdk" >> $GITHUB_ENV + echo "OPENLANE_ROOT=$GITHUB_WORKSPACE/openlane_src" >> $GITHUB_ENV + echo "CARAVEL_ROOT=$GITHUB_WORKSPACE/caravel" >> $GITHUB_ENV + echo "MCW_ROOT=$GITHUB_WORKSPACE/mgmt_core_wrapper" >> $GITHUB_ENV + echo "TIMING_ROOT=$GITHUB_WORKSPACE/timing-scripts" >> $GITHUB_ENV + echo "PRECHECK_ROOT=$GITHUB_WORKSPACE/mpw_precheck" >> $GITHUB_ENV + echo "MPW_TAG=main" >> $GITHUB_ENV + + - name: Download PDK Tarball + uses: actions/download-artifact@v3 + with: + name: pdk-tarball + path: /tmp + + - name: Unpack PDK Tarball + run: | + sudo mkdir -p ${{ env.PDK_ROOT }} + sudo chown -R $USER:$USER ${{ env.PDK_ROOT }} + tar -xf /tmp/pdk.tar -C $PDK_ROOT . - # - name: Download caravel Tarball - # uses: actions/download-artifact@v2 - # with: - # name: caravel-tarball - # path: /tmp - - # - name: Unpack caravel Tarball - # run: | - # sudo mkdir -p ${{ env.CARAVEL_ROOT }} - # sudo chown -R $USER:$USER ${{ env.CARAVEL_ROOT }} - # tar -xf /tmp/caravel.tar -C $CARAVEL_ROOT . + - name: Download caravel Tarball + uses: actions/download-artifact@v3 + with: + name: caravel-tarball + path: /tmp + + - name: Unpack caravel Tarball + run: | + sudo mkdir -p ${{ env.CARAVEL_ROOT }} + sudo chown -R $USER:$USER ${{ env.CARAVEL_ROOT }} + tar -xf /tmp/caravel.tar -C $CARAVEL_ROOT . - # - name: Download mgmt_core_wrapper Tarball - # uses: actions/download-artifact@v2 - # with: - # name: mgmt_core_wrapper-tarball - # path: /tmp - - # - name: Unpack mgmt_core_wrapper Tarball - # run: | - # sudo mkdir -p ${{ env.MCW_ROOT }} - # sudo chown -R $USER:$USER ${{ env.MCW_ROOT }} - # tar -xf /tmp/mgmt_core_wrapper.tar -C $MCW_ROOT . - - # # - name: Download Design Tarball - # # uses: actions/download-artifact@v2 - # # with: - # # name: design-tarball - # # path: /tmp - - # # - name: Unpack Design Tarball - # # run: | - # # sudo mkdir -p $GITHUB_WORKSPACE - # # sudo chown -R $USER:$USER $GITHUB_WORKSPACE - # # tar -xf /tmp/design.tar -C $GITHUB_WORKSPACE . - - # - name: install cocotb - # run: | - # make setup-cocotb + - name: Download mgmt_core_wrapper Tarball + uses: actions/download-artifact@v3 + with: + name: mgmt_core_wrapper-tarball + path: /tmp + + - name: Unpack mgmt_core_wrapper Tarball + run: | + sudo mkdir -p ${{ env.MCW_ROOT }} + sudo chown -R $USER:$USER ${{ env.MCW_ROOT }} + tar -xf /tmp/mgmt_core_wrapper.tar -C $MCW_ROOT . + + - name: Download Design_${{ matrix.pdk }} Tarball + uses: actions/download-artifact@v3 + with: + name: design_${{ matrix.pdk }}-tarball + path: /tmp + + - name: Unpack Design_${{ matrix.pdk }} Tarball + run: | + sudo mkdir -p $GITHUB_WORKSPACE + sudo chown -R $USER:$USER $GITHUB_WORKSPACE + tar -xf /tmp/design_${{ matrix.pdk }}.tar -C $GITHUB_WORKSPACE . + + - name: install cocotb + run: | + make setup-cocotb - # - name: run RTL verification - # run: | - # cd $GITHUB_WORKSPACE/verilog/dv/cocotb && $GITHUB_WORKSPACE/venv-cocotb/bin/caravel_cocotb -tl user_proj_tests/user_proj_tests_gl.yaml -verbosity debug --CI -tag gl_verification - # cnt=$(grep -c "failed" "$GITHUB_WORKSPACE/verilog/dv/cocotb/sim/gl_verification/runs.log") - # if ! [[ $cnt ]]; then cnt=0; fi - # if [[ $cnt -eq 1 ]]; then exit 0; fi - # exit 2 + - name: run RTL verification + run: | + cd $GITHUB_WORKSPACE/verilog/dv/cocotb && $GITHUB_WORKSPACE/venv-cocotb/bin/caravel_cocotb -tl user_proj_tests/user_proj_tests_gl.yaml -verbosity debug --CI -tag gl_verification + cnt=$(grep -c "failed" "$GITHUB_WORKSPACE/verilog/dv/cocotb/sim/gl_verification/runs.log") + if ! [[ $cnt ]]; then cnt=0; fi + if [[ $cnt -eq 1 ]]; then exit 0; fi + exit 2 diff --git a/.gitignore b/.gitignore index 162c65e24..bac822270 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,8 @@ *.gtkw /env /venv +/venv-cocotb /caravel /dependencies /mgmt_core_wrapper -/logs \ No newline at end of file +/logs diff --git a/Makefile b/Makefile index 3a874d335..eacaa1785 100644 --- a/Makefile +++ b/Makefile @@ -126,7 +126,7 @@ $(blocks): % : $(MAKE) -C openlane $* dv_patterns=$(shell cd verilog/dv && find * -maxdepth 0 -type d) -cocotb-dv_patterns=$(shell cd verilog/dv/cocotb && find . -name "*.c" | sed -e 's|^.*/||' -e 's/.c//') +cocotb-dv_patterns=$(shell cd verilog/dv/cocotb && find . -name "*.c" | sed -e 's|^.*/||' -e 's/\.c//') dv-targets-rtl=$(dv_patterns:%=verify-%-rtl) cocotb-dv-targets-rtl=$(cocotb-dv_patterns:%=cocotb-verify-%-rtl) dv-targets-gl=$(dv_patterns:%=verify-%-gl) diff --git a/verilog/dv/cocotb/user_proj_tests/counter_wb/counter_wb.py b/verilog/dv/cocotb/user_proj_tests/counter_wb/counter_wb.py index f4539fe2c..17ef4f445 100644 --- a/verilog/dv/cocotb/user_proj_tests/counter_wb/counter_wb.py +++ b/verilog/dv/cocotb/user_proj_tests/counter_wb/counter_wb.py @@ -19,45 +19,54 @@ from caravel_cocotb.caravel_interfaces import report_test import cocotb +# Read the 16-bit counter value from GPIO[37:30,7:0] +def counter_value(caravelEnv): + return int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2) + @cocotb.test() @report_test async def counter_wb(dut): - caravelEnv = await test_configure(dut,timeout_cycles=22620) + caravelEnv = await test_configure(dut,timeout_cycles=27000) - cocotb.log.info(f"[TEST] Start counter_wb test") + cocotb.log.info(f"[TEST] Start counter_wb test") # wait for start of sending await caravelEnv.release_csb() await caravelEnv.wait_mgmt_gpio(1) - cocotb.log.info(f"[TEST] finish configuration") - overwrite_val = 7 # value will be written to the counter by wishbone + cocotb.log.info(f"[TEST] Finished configuration") + overwrite_val = 7 # value will be written to the counter by wishbone (hard-coded in firmware) # expect value bigger than 7 - received_val = int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2) + received_val = counter_value(caravelEnv) counter = received_val await cocotb.triggers.ClockCycles(caravelEnv.clk,1) - while True: # wait until the value 1 start counting after the initial - received_val = int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2) - if counter == 0xFFFF: # rollover + cocotb.log.info(f"[TEST] Testing Wishbone write") + # Track the counter expected vs. actual, until they diverge... + while True: + received_val = counter_value(caravelEnv) + if counter == 0xFFFF: # rollover counter = 0 else: counter +=1 - if received_val != counter: - if received_val == overwrite_val: - counter = received_val +1 - cocotb.log.info(f"Counter value has been overwritten by wishbone to be {received_val}") - while True: #wait until the wishbone writing finished and the counter start running again - received_val = int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2) + if received_val != counter: + # Counter actual has diverged from expected. Verify it was a Wishbone write... + if received_val == overwrite_val: + # Yes, new counter value matches the expected Wishbone overwrite value. + counter = received_val +1 # Counter's next value will increment from this new value. + cocotb.log.info(f"Counter value has been overwritten by Wishbone to be {received_val}") + while True: #wait until the Wishbone writing finished and the counter started running again + received_val = counter_value(caravelEnv) if counter == received_val: break await cocotb.triggers.ClockCycles(caravelEnv.clk,1) - cocotb.log.info(f"Counter value has been overwritten by wishbone to be {received_val}") + cocotb.log.info(f"Counter value is now {received_val}") break else: - cocotb.log.error(f"Counter has wrong value before overwrite happened expected: {counter} received: {received_val}") + cocotb.log.error(f"Counter has wrong value before overwrite. Expected={counter} Received={received_val}") await cocotb.triggers.ClockCycles(caravelEnv.clk,1) + cocotb.log.info(f"[TEST] Testing 100 more counts") for i in range(100): - if counter != int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2) : - cocotb.log.error(f"Counter have wrong value expected = {counter} recieved = {int ((caravelEnv.monitor_gpio(37,30).binstr + caravelEnv.monitor_gpio(7,0).binstr ),2) }") + if counter != counter_value(caravelEnv): + cocotb.log.error(f"Counter has wrong value. Expected={counter} Received={counter_value(caravelEnv)}") await cocotb.triggers.ClockCycles(caravelEnv.clk,1) counter +=1 \ No newline at end of file