7.5 KiB
Go Back
Debugging and Unit Testing
This page of the documentation explains the debugging and unit testing of OpenRAM.
Table of Contents
- Unit Tests
- Unit Test Organization
- Running Unit Tests
- Successful Unit Tests
- Debugging Unsuccessful Unit Tests
- Temporary Output Files
Unit Tests
OpenRAM has the set of thorough regression tests implemented with the Python unit test framework:
- Unit tests allow users to add features without worrying about breaking functionality.
- Unit tests guide users when porting to new technologies.
- Every sub-module has its own regression test.
- There are regression tests for memory functionality, library cell verification, timing verification, and technology verification.
Unit Test Organization
00_code_format_test.pydoes basic lint checking.01_library_drc_test.pychecks DRC of all library cells for the technology.02_library_lvs_test.pychecks LVS of all library cells for the technology.03_*_test.pychecks DRC and LVS of wires and transistors classes.04_*_test.pychecks DRC and LVS of parameterized cells.05-19_*_test.pychecks DRC and LVS of module cells (moving upward in hierarchy with numbers)20_*_test.pycheck DRC and LVS of full SRAM layouts with various configurations.21_*_test.pychecks timing of full SRAMs and compares (with tolerance) to precomputed result.Note: These tests may fail using different simulators due to the tolerance level.
22_*_test.pychecks functional simulation of full SRAMs with various configurations.23-25_*_test.pychecks lib, lef, and verilog outputs using diff.30_openram_test.pychecks command-line interface and whether output files are created.
Running Unit Tests
Regression testing performs a number of tests for all modules in OpenRAM. From the unit test directory ($OPENRAM_HOME/tests), use the following command to run all regression tests:
cd OpenRAM/compiler/tests
make -j 3
The -j can run with 3 threads. By default, this will run in all technologies. Note that if you have not run openram, the conda environment will not be installed. You can install it by running OpenRAM/install_conda.sh (see Basic Setup for more details).
To run a specific test in all technologies:
cd OpenRAM/compiler/tests
make 05_bitcell_array_test
To run a specific technology:
cd OpenRAM/compiler/tests
TECHS=scn4m_subm make 05_bitcell_array_test
To increase the verbosity of the test, add one (or more) -v options and pass it as an argument to OpenRAM:
ARGS="-v" make 05_bitcell_array_test
Unit test results are put in a directory:
OpenRAM/compiler/tests/results/<technology>/<test>
If the test fails, there will be a tmp directory with intermediate results. If the test passes, this directory will be deleted to save space. You can view the .out file to see what the output of a test is in either case.
- Tests can be run in the
$OPENRAM_HOME/testsdirectory - Command line arguments
-vfor verbose-tfreepdk45 for tech-dto preserve /tmp results (done automatically if test fails)
- Individual tests
01_library_drc_test.py
- All tests
regress.py
Successful Unit Tests
user@host:/openram/compiler/tests$ ./regress.py
______________________________________________________________________________
|==============================================================================|
|========= Running Test for: =========|
|========= scn4m_subm =========|
|========= ./regress.py =========|
|========= /tmp/openram_mrg_13245_temp/ =========|
|==============================================================================|
runTest (00_code_format_check_test.code_format_test) ... ok
runTest (01_library_drc_test.library_drc_test) ... ok
runTest (02_library_lvs_test.library_lvs_test) ... ok
runTest (03_contact_test.contact_test) ... ok
runTest (03_path_test.path_test) ... ok
.
.
.
user@host:/openram/compiler/tests$ ./03_ptx_1finger_nmos_test.py
______________________________________________________________________________
|==============================================================================|
|========= Running Test for: =========|
|========= scn4m_subm =========|
|========= ./03_ptx_1finger_nmos_test.py =========|
|========= /tmp/openram_mrg_13750_temp/ =========|
|==============================================================================|
.
----------------------------------------------------------------------
Ran 1 test in 0.596s
OK
Debugging Unsuccessful Unit Tests (or sram_compiler.py)
- You will get an ERROR during unit test and see a stack trace
- Examine the temporary output files in the temp directory (/tmp/mydir)
_____________________________________________________________________________
|==============================================================================|
|========= Running Test for: =========|
|========= scn4m_subm =========|
|========= ./04_pinv_10x_test.py =========|
|========= /tmp/mydir =========|
|==============================================================================|
ERROR: file magic.py: line 174: DRC Errors pinv_0 2
F
======================================================================
FAIL: runTest (__main__.pinv_test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "./04_pinv_10x_test.py", line 22, in runTest
self.local_check(tx)
File "/Users/mrg/openram/compiler/tests/testutils.py", line 45, in local_check
self.fail("DRC failed: {}".format(a.name))
AssertionError: DRC failed: pinv_0
----------------------------------------------------------------------
Ran 1 test in 0.609s
FAILED (failures=1)
It didn't finish... where are my files?
- OpenRAM puts all temporary files in a temporary directory named:
/tmp/openram_<user>_<pid>_temp- This allows multiple processes/users to simultaneously run
- This allows /tmp to be mapped to a RAM disk for faster performance
- After a successful run, the directory and contents are deleted
- To preserve the contents, you can run with the
-doption for debugging
OPENRAM_TMPwill override the temporary directory location for debugexport OPENRAM_TMP="/home/myname/debugdir"
Temporary Output Files
- DRC standard output (
*.drc.out), errors (*.drc.err), and results (*.drc.results) - LVS standard output (
*.lvs.out), errors (*.lvs.out), and results (*.lvs.results) - GDS (and Magic) files for intermediate modules (
temp.gds,temp.mag) - SPICE netlist for intermediate module results (
temp.sp) - Extracted layout netlist for intermediate module results (
extracted.sp) - Magic only: Run scripts for DRC (
run_drc.sh) and LVS (run_lvs.sh) - Calibre only: Runset file for DRC (
drc_runset) and LVS (lvs_runset)