This repository documents a practical logic synthesis study on the picorv32a RISC-V core using Synopsys Design Compiler (Academic version) with SAED32 libraries.
The work is organized into two chapters:
- Chapter 1: NLDM vs CCS (model comparison across the standard synthesis flow)
- Chapter 2: SDC with CLK Period < 0.5 (NLDM-only setup worst-case and hold best-case analysis with a new constraint file)
This README is structured to be easy to follow as both a runbook and a report summary.
- RTL design:
picorv32a(open-source RISC-V core) - Technology node: 32nm
- Tool: Synopsys Design Compiler (
dc_shell, Academic version) - Library families used: SAED32
RVT,LVT,HVT
A required setup directory named rm_setup is used by the flow (not included in this repository).
rm_setup/common_setup.tclis mandatory- Additional setup files in
rm_setupare also required target_libraryandlink_libraryare updated there before each experiment
- Synthesis scripts:
Picorv32a/Scripts/ - Constraint files:
Picorv32a/CONSTRAINTS/ - Reports:
Picorv32a/Reports/
After compilation, reports are extracted individually from dc_shell:
report_timing
report_area
report_power
report_cell
report_reference
report_qorTo get the total hierarchical cell count:
sizeof_collection [get_cells -hierarchical]A mapped gate-level netlist is generated after compilation (for example: picorv32a.mapped.v in the results output).
This chapter compares synthesis behavior between NLDM and CCS libraries to observe timing, area, power, and cell-count differences under the same compile mode.
- Delay model comparison:
NLDMvsCCS - Compile focus in summary table:
compile_ultra - Constraint reference used in this chapter:
Picorv32a/CONSTRAINTS/picorv32a.sdc - VT coverage represented in table rows:
RVT,LVT,HVT
A configurable path variable is used:
set PDKPATH "./ref/saed32"Typical structure:
ref/
└── saed32/
├── nldm/
│ └── tt0p78vn40c/
│ ├── rvt/
│ ├── lvt/
│ └── hvt/
└── ccs/
└── tt0p78vn40c/
├── rvt/
├── lvt/
└── hvt/
- Setup timing
- Hold timing
- Area
- Total power
- Total cell count
- Supporting reports: QoR, reference, clock tree, wire load, VT group
Use this compact table to compare compile_ultra runs for NLDM and CCS with RVT, LVT, and HVT.
| Delay Model | Compile Mode | VT Type | Constraint File | Setup WNS (ns) | Hold WNS (ns) | Area (um^2) | Total Power (uW) | Total Cell Count |
|---|---|---|---|---|---|---|---|---|
| NLDM | compile_ultra | RVT,LVT,HVT | Picorv32a/CONSTRAINTS/picorv32a.sdc |
0.00 | 0.21 | 47053.661412 | 1.6858E+03 | 11010 |
| CCS | compile_ultra | RVT,LVT,HVT | Picorv32a/CONSTRAINTS/picorv32a.sdc |
0.01 | 0.18 | 43790.645626 | 2.6698E+03 | 9219 |
In this run, CCS shows a small setup improvement (0.00 -> 0.01 ns) with lower area and cell count. Area drops by about 6.93% and total cells drop by about 16.27% (11010 -> 9219). The tradeoff is power, which increases by about 58.37% (1.6858E+03 -> 2.6698E+03 uW), while hold slack is slightly lower (0.21 -> 0.18 ns).
This chapter focuses on a new constraint-driven analysis to explicitly capture:
- Worst-case setup behavior (maximum path delay stress)
- Best-case hold behavior (minimum delay stress)
This chapter uses NLDM libraries only.
Picorv32a/CONSTRAINTS/picorv32a_new.sdc
Used to catch maximum path delay violations.
Corner options:
ss_vmin_125c.db ss_vnom_125c.db tt_vmin_125c.db
Full NLDM library set used:
$PDK_PATH/lib/stdcell_rvt/db_nldm/saed32rvt_ss0p7v125c.db \
$PDK_PATH/lib/stdcell_rvt/db_nldm/saed32rvt_ss0p7v125c.db \
$PDK_PATH/lib/stdcell_rvt/db_nldm/saed32rvt_tt0p78v125c.db \
$PDK_PATH/lib/stdcell_lvt/db_nldm/saed32lvt_ss0p7v125c.db \
$PDK_PATH/lib/stdcell_lvt/db_nldm/saed32lvt_ss0p75v125c.db \
$PDK_PATH/lib/stdcell_lvt/db_nldm/saed32lvt_tt0p78v125c.db \
$PDK_PATH/lib/stdcell_hvt/db_nldm/saed32hvt_ss0p7v125c.db \
$PDK_PATH/lib/stdcell_hvt/db_nldm/saed32hvt_ss0p75v125c.db \
$PDK_PATH/lib/stdcell_hvt/db_nldm/saed32hvt_tt0p78v125c.dbUsed to evaluate hold under fastest corner tendency.
Corner options:
ff_vmax_m40c.db ff_vnom_m40c.db tt_vmax_m40c.db
Full NLDM library set used:
$PDK_PATH/lib/stdcell_rvt/db_nldm/saed32rvt_ff1p16vn40c.db \
$PDK_PATH/lib/stdcell_rvt/db_nldm/saed32rvt_ff0p95vn40c.db \
$PDK_PATH/lib/stdcell_rvt/db_nldm/saed32rvt_tt1p05vn40c.db \
$PDK_PATH/lib/stdcell_lvt/db_nldm/saed32lvt_ff1p16vn40c.db \
$PDK_PATH/lib/stdcell_lvt/db_nldm/saed32lvt_ff0p95vn40c.db \
$PDK_PATH/lib/stdcell_lvt/db_nldm/saed32lvt_tt1p05vn40c.db \
$PDK_PATH/lib/stdcell_hvt/db_nldm/saed32hvt_ff1p16vn40c.db \
$PDK_PATH/lib/stdcell_hvt/db_nldm/saed32hvt_ff0p95vn40c.db \
$PDK_PATH/lib/stdcell_hvt/db_nldm/saed32hvt_tt1p05vn40c.db- Apply
picorv32a_new.sdc - Update NLDM target/link library setup in
rm_setup/common_setup.tcland related setup files - Run synthesis (
compile/compile_ultra) and extract setup, hold, area, power, QoR, and cell reports
You also ran additional NLDM experiments for RVT, LVT, and HVT using different constraints. Use this template:
| Delay Model | Mode | VT Type | Constraint File | Setup WNS (ns) | Hold WNS (ns) | Total Cell Count |
|---|---|---|---|---|---|---|
| NLDM | Worst Setup | RVT,LVT,HVT | Picorv32a/CONSTRAINTS/picorv32a_new.sdc |
-2.17 | - | 12509 |
| NLDM | Best Hold | RVT,LVT,HVT | Picorv32a/CONSTRAINTS/picorv32a_new.sdc |
- | 0.05 | 14980 |
This table reflects the expected corner split: worst-case setup is strongly stressed (-2.17 ns), while best-case hold remains positive (0.05 ns). Comparing these two conditions, the cell count increases by about 19.75% (12509 -> 14980). This indicates extra implementation overhead in the hold-focused condition, so setup and hold closure should be evaluated together before final sign-off.
- Clone and enter the project:
git clone <repository_link>
cd Git-Repo-Logic-Synthesis/Picorv32a- Ensure
.dblibraries are available for the selected model/corners/VTs. - Open DC shell:
dc_shell- Source the required scripts based on the experiment:
source Picorv32a/Scripts/run_compile_nldm.tcl
source Picorv32a/Scripts/run_ultra_nldm.tcl
source Picorv32a/Scripts/run_compile_ccs.tcl
source Picorv32a/Scripts/run_ultra_ccs.tcl
source Picorv32a/Scripts/run_new_sdc.tcl- Before each run, update:
rm_setup/common_setup.tcland related setup files- Constraint file selection (
picorv32a.sdcorpicorv32a_new.sdc)
.
├── Picorv32a/
│ ├── rtl/ # picorv32a RTL
│ ├── CONSTRAINTS/ # SDC files (including added constraint files)
│ ├── Scripts/ # DC synthesis scripts
│ ├── ref/ # SAED32 libraries (NLDM/CCS, VT groups)
│ └── Reports/ # timing/area/power and other run reports
├── rm_setup/ # required setup (not included in this repo)
├── README.md
└── LICENSE
The objective is to understand how delay-model choice and constraint strategy impact timing, area, power, and cell usage for picorv32a in a practical synthesis flow.
All standard-cell libraries in this project are educational/anonymized representations. No proprietary, NDA-restricted, or foundry-confidential data is included.
Sampath Voonna
Electronics and Communication Engineering
Interested in VLSI Physical Design, STA, and Logic Synthesis