Digital Design Flow: Tutorial For EDA Tools
Digital Design Flow: Tutorial For EDA Tools
This document describes the top-down design flow of the implementation a SoC design. Starting from
an example HDL description the designer is guided through all the design steps to tapeout GDS2 layout
description.
This tutorial is derived from "Top-Down digital design flow" version 3.1 (November 2006) by Alain Va-
choux, Microelectronic Systems Lab EPFL, Lausanne, Switzerland.
i
Contents
1 Introduction 1
1.1 Top-down design flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Design project organization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 VHDL example: FIR-Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Design flow steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3 Logic synthesis 15
3.1 Loading and checking the design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2 Constraining the design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.3 Mapping and Optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.4 Generating reports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.5 Check design and generate output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
ii
CONTENTS iii
A VHDL Netlists 42
A.1 File: filter.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
A.2 File: filter_top.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
A.3 File: filter_soc.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
A.4 File: filter_soc_tb.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
B Tool Scripts 55
B.1 Synopsys: Design Compiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
B.1.1 setup.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
B.1.2 load_design.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
B.1.3 constraints.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
B.1.4 compile.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
B.1.5 check_save.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
B.1.6 syn.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
B.2 Cadence: INNOVUS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
B.2.1 setup.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
B.2.2 importDesign.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
B.2.3 floorplan.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
B.2.4 powerplan.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
B.2.5 placement.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
B.2.6 cts.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
B.2.7 route.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
B.2.8 verify.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
B.2.9 results.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
B.2.10 par.tcl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Chapter 1
Introduction
This document details the typical steps of a top-down digital VHDL/Verilog design flow with the help of a
simple design example.
The following tools are considered in this document:
• Modelsim v10.6 or higher, from Mentor Graphics.
1
CHAPTER 1. INTRODUCTION 2
Figure 1.1 illustrates the top-down flow that includes the following steps:
is implemented in several gates to accommodate several fan-out capabilities or drive strengths. The
gate library is described in a tool-specific format that defines, for each gate, its function, its area, its
timing and power characteristics and its environmental constraints.
The synthesis step generates several outputs: a gate-level VHDL net-list, a Verilog gate-level net-list,
and a SDF description. The first netlist is typically used for post-synthesis simulation, while the
second netlist is better suited as input to the place&route step. The SDF description includes delay
information for simulation. Note that considered delays are at this step correct for the gates but only
estimated for the interconnections.
System-level integration
The layout description is then integrated as a block in the designed system. This step is not covered
in this document.
Now close the current terminal window and start a new terminal. Then add the DesignLab script directory
to our PATH by:
source /opt/eds/DesignLab/bin/dlab.csh
CHAPTER 1. INTRODUCTION 4
Given the number of EDA tools and files used in the flow, it is strongly recommended to organize the
working environment in a proper way. To that end, the create_eda_project script can be used to create a
directory structure in which design files will be stored.
The use of the script is as follows:
create_eda_project <project-name>
where <project-name> is the name of the top-level directory that will host all design files for the projects.
For example, to create the project directory called ’filter_umc65’ that will be used to do the tasks presented
in the rest of this document, execute the following command:
create_eda_project filter_umc65
cd filter_umc65
The filter_umc65 top-level directory hosts the configuration files for logic simulation (Modelsim), logic
synthesis (Synopsys DC) and standard cell place and route (Cadence SoC INNOVUS). As a consequence,
it is required that the tools are always started from that point.
Figure 1.2 shows the proposed directory structure and the role of each subdirectory. The actual use of the
subdirectories and files will be explained while going throughout the tutorial in this document.
In order to use the EDA tools and IMEC design kit, a script file called edadk.csh with the necessary PATHs
to the tools exists in the directory from which the tools are launched (the top-level project directory).
For information on the IMEC design kits, find the IMEC documentation in:
/opt/eds/DesignKits/IMEC-UMC65/_G-01-LOGIC_MIXED_MODE65N-LL_LOW_K_UMC-IP/doc.
Listing 1.1 shows the entity declaration of the VHDL model of a generic 128 tap FIR-Filter. You will
find the complete VHDL model including the testbench in Appendix A.1-3. We will call this model the
Core.
entity filter_soc is
generic (
CWIDTH : integer := 16;
CAW : integer := 7;
DWIDTH : integer := 16;
DAW : integer := 7
);
port (
ClkxCI : in std_logic ;
ResetxRBI : in std_logic ;
DataInxDI : in std_logic_vector ( DWIDTH -1 downto 0) ;
DataInReqxSI : in std_logic ;
DataInAckxSO : out std_logic ;
DataOutxDO : out std_logic_vector ( DWIDTH -1 downto 0) ;
DataOutReqxSO : out std_logic ;
DataOutAckxSI : in std_logic
);
end filter_soc ;
CHAPTER 1. INTRODUCTION 6
Figure 1.3 shows the hierarchy of the filter design. The chiplevel entity named filter_soc consists of compo-
nents IO-padcells and the toplevel filter design filter_top. Filter top consists of instances of the components
coeff, dataRam and filter. The IO-padcells connect the port signals to the outside world.
Filter_soc
Filter_top
Filter
Listing ?? shows the testbench for the RTL model (file filter_soc_tb.vhd). The testbench for the mapped
netlist (file filter_soc_mapped_tb.vhd) can also be used for simulation of both the placed and routed Verilog
netlist. The file filter_top.io defines the positions of the IO-padcells for place and route.
The file filter_soc_syn.tcl in directory SYN/BIN is a Tcl script that performs synthesis of the VHDL model
in batch mode. The file filter_top_par.tcl in directory PAR/BIN is a Tcl script that performs the placement
and routing of the synthesized Verilog netlist in batch mode.
2.1 Compilation of the RTL VHDL model and related testbench [2.2]
2.2 Simulation of the RTL VHDL model
Step 2) Logic synthesis (tool: Synopsys Design Compiler)
3.1 RTL VHDL model analysis
3.2 Design elaboration (generic synthesis)
3.3 Design environment definition (operating conditions, wire load model)
3.4 Design constraint definitions (area, clock, timings) [3.2]
CHAPTER 1. INTRODUCTION 7
This chapter presents the main steps to perform the logic simulation of VHDL and Verilog models with the
Modelsim tool.
8
CHAPTER 2. VHDL AND VERILOG SIMULATION 9
The modelsim.ini file actually defines the mapping between logical design libraries and their physical
locations. Note that the Help menu on the top right allows one to access the complete documentation of
the tool. After having started the vsim GUI you have to compile all the VHDL source of your design into
the simulation library work. Now you have two options to simulate your model, either interactively or by
executing the following convenience scripts (see directory SIM/BIN) on the VSIM command line:
wave.do To start a wave window with the ports of the top level module.
start_far[_mapped | _routed ].do To start up the simulation of the particular module.
run_far[_mapped | _routed ].do To load the filter coefficients into the coefficient ROM and runs the sim-
ulation for 300 us.
or alternatively execute the shell script compile_msim.sh from the CSH command line:
sh compile_msim.sh
The second way is to left-click on the Compile icon , to select the files to compile in the HDL/RTL
and HDL/TBENCH directories, click on Compile
and finally close the window (click Done). The
compiled modules are stored in the logical library
WORK which is mapped to the physical location
LIB/MSIM/work. Once VHDL (or Verilog) mod-
els have been successfully compiled in the design
library, it is possible to create a make file that can
be used to recompile only the required files. The
vmake command can only be run from a Unix shell
and creates the make file:
vmake > Makefile
The created file Makefile now defines the design unit dependencies and the compilation commands to
recompile only those source files that have been modified or that depend on modified files. To rebuild the
library, run the make command in the Unix shell
2. Select from library work the architecture of the testbench and a resolution of 1ns.
CHAPTER 2. VHDL AND VERILOG SIMULATION 10
or to click on the Run icon in the main window or in the wave window.
The signal waveforms are then visible in the wave window. To change the radix of the displayed signals,
select the signals (press shift left-click for multiple selection), then select the wave menu item
Format ⇒ Radix ⇒ Unsigned.
Note that the command run -all runs the simulation until there is no more pending event in the simulation
queue. This could lead to never ending simulation when the model, like the testbench loaded here, has a
continuously switching signal such as the clock signal clk. It is however possible to stop the current simu-
lation by clicking the Break icon in the main window or in the wave window.
Run the simulation interactively as described in the previous section or run the following scripts
(See SIM/BIN) from the VSIM command line.
VSIM 7> do SIM/BIN/start_far.do
VSIM 8> do SIM/BIN/wave.do
VSIM 9> do SIM/BIN/run_far.do
If you make any modification to the VHDL source, you need to recompile the sources (manually or using the
vmake command described earlier in this section), and then restart the simulation in the same environment
(e.g., the same displayed waveforms or the same simulation breakpoints) with the restart -f command.
CHAPTER 2. VHDL AND VERILOG SIMULATION 12
1. Select the main menu item Simulate ⇒ Start simulation... to get the simulation dialog window.
2. Select from library mapped the architecture of the testbench and a resolution of 100ps.
3. Click the Libraries tab to add the gate library umc65_generic_core
CHAPTER 2. VHDL AND VERILOG SIMULATION 13
4. Then click the SDF tab. In the SDF dialog window, add the file SYN/TIM/filter_soc_mapped.sdf and
specify the region dut, which is the label of the instance in the testbench that will be annotated with
timing data. Note that the Reduce SDF errors to warnings box must be checked. This is required to
avoid the simulation to stop prematurely due to errors such as "Failed to find port ´a(7)´". These are
not really errors here as they are related to interconnect delay data in the SDF file that are not used in
the simulation (they are actually all set to zero).
Then click OK in the remaining Start Simulation dialog box to load the mapped netlist. Clock to output
delays of the order of 100ps to 1ns should be visible in the wave window.
Run the simulation interactively as described in the previous section or run the following scripts
(See SIM/BIN) from the VSIM command line.
VSIM 7> do SIM/BIN/start_msim_mapped.do
VSIM 8> do SIM/BIN/wave.do
VSIM 9> do SIM/BIN/run_msim_mapped.do
CHAPTER 2. VHDL AND VERILOG SIMULATION 14
3. Then click the Libraries tab to add the gate library umc65_generic_core
4. Load the SDF timing file PAR/TIM/filter_soc_routed.sdf.
Note that the Reduce SDF errors to warnings box must be checked. This is required to avoid the sim-
ulation to stop prematurely due to errors such as “Failed to find matching specify timing constraint”.
These are not really errors here as they are related to removal (asynchronous) timing constraints
generated by INNOVUS that are not supported in the Verilog models of the gates.
Run the simulation interactively or run the following scripts (See SIM/BIN) from the VSIM command line.
VSIM 7> do SIM/BIN/start_msim_routed.do
VSIM 8> do SIM/BIN/wave.do
VSIM 9> do SIM/BIN/run_msim_routed.do
Chapter 3
Logic synthesis
This chapter presents the main steps to perform the logic synthesis of the VHDL RTL model with the
Synopsys Design Compiler tool. Design Compiler(DC) supports Tcl scripts. Scripts are useful to capture
the intermediate steps in the synthesis flow and make the flow reproducable. All scripts for synthesis are
found in the directory SYN/BIN.
The command line is also echoed in the terminal shell from which the tool has been started, so
it is possible to enter DC commands from there as well. It is still possible to execute some Unix
commands from here.
15
CHAPTER 3. LOGIC SYNTHESIS 16
The analysis phase compiles the VHDL model and checks that the VHDL code is synthesizable.
The elaboration phase performs a generic pre-synthesis of the analyzed model. It essentially identifies
the registers that will be inferred.
The console now displays the inferred registers and the kind of reset
(here asynchronous reset - AR: Y).
It is possible to display the elaborated schematic by selecting the entity i_filter_top in the hierarchy
window and then clicking the Create Schematic button. You can the browse the hierarchy with the
the up/down buttons in the top menu. . Note that the symbols merely indicate generic components
that do not yet represent any real logic gate.
It is common practice to save the result of intermediate steps into a database restore file so next steps can
be taken up from such restore point. Here the result after elaboration is stored into file:
SYN/DB/filter_soc_elab.ddc
source SYN/BIN/compile.tcl
The mapped design schematic includes instances of the coefficient rom, data ram and the filter circuit. Also,
the cells are now real gates from the cell library.
The mapped design will be saved into file SYN/DB/filter_soc_mapped.ddc.
****************************************
Report : timing
- path full
- delay max
- max_paths 1
- sort_by group
Design : filter_soc
Version : M -2016.12
Date : Tue Jul 10 14:34:13 2018
****************************************
Startpoint : DataInReqxSI
( input port clocked by ClkxCI )
Endpoint : i_filter_top / i_filter / RamWritexDO_reg [0]
( rising edge - triggered flip - flop clocked by ClkxCI )
Path Group : ClkxCI
Path Type : max
All times are expressed in ns (the time unit is defined in the cell library). The slack defines the time margin
from the clock period. A positive slack means that the latest arriving signal in the path still arrives before
the end of the clock period. A negative slack means that the timing constraint imposed by the clock is
violated.
The timing delays that are accounted for are the internal gate delays (from the cell library) and the estimated
interconnect delays (from the cell library and the wire load model in use).
CHAPTER 3. LOGIC SYNTHESIS 20
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
R e p o r t : power
− a n a l y s i s _ e f f o r t low
Design : f i l t e r _ s o c
V e r s i o n : M−2016.12
Date : Tue J u l 10 1 4 : 3 4 : 1 3 2018
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
L i b r a r y ( s ) Used :
u k 6 5 l s c l l m v b b r _ 1 0 8 c 1 2 5 _ w c ( F i l e : / o p t / e d s / D e s i g n K i t s / IMEC−UMC65 / _G−01−
LOGIC_MIXED_MODE65N−LL_LOW_K_UMC−I P / s y n o p s y s / u k 6 5 l s c l l m v b b r _ 1 0 8 c 1 2 5 _ w c . db )
SYKA65_128X16X1CM2_BC ( F i l e : / o p t / e d s / D e s i g n K i t s / IMEC−UMC65 / Memories /
SYKA65_128X16X1CM2 / SYKA65_128X16X1CM2_BC . db )
SPKA65_512X16BM1A_BC ( F i l e : / o p t / e d s / D e s i g n K i t s / IMEC−UMC65 / Memories /
SPKA65_512X16BM1A / SPKA65_512X16BM1A_BC . db )
u 0 6 5 g i o l l 2 5 m v i r _ 2 5 _ w c ( F i l e : / o p t / e d s / D e s i g n K i t s / IMEC−UMC65 / _G−01−
LOGIC_MIXED_MODE65N−LL_LOW_K_UMC−I P / s y n o p s y s / u 0 6 5 g i o l l 2 5 m v i r _ 2 5 _ w c . db )
C e l l I n t e r n a l Power = 6 9 8 . 0 4 9 7 uW (61%)
Net S w i t c h i n g Power = 4 4 0 . 4 0 8 8 uW (39%)
−−−−−−−−−
T o t a l Dynamic Power = 1 . 1 3 8 5 mW (100%)
C e l l L e a k a g e Power = 3 . 9 8 6 3 uW
Total 0 . 6 9 8 0 mW 0 . 4 4 0 4 mW 3 . 9 8 6 3 e +06 pW 1 . 1 4 2 4 mW
1
CHAPTER 3. LOGIC SYNTHESIS 21
It is much more convenient to use scripts and to run the synthesis tool in batch mode when the design
complexity increases. Scripts also conveniently capture the synthesis flow and make it reusable. Synopsys
Design Compiler supports the Tcl language for building scripts.
An example of such a script for the synthesis of the filter_soc design has been installed in the directory
SYN/BIN The script has to run from the project top directory and it assumes a directory organization as
described in section 1.2. To run the Tcl script, execute the following command in a Unix shell:
dc_shell -f SYN/BIN/syn.tcl
When the script finishes executing, the dc_shell environment is still active so you can enter other dc_shell
commands. Enter quit or exit to return to the Unix shell.
Chapter 4
This chapter presents the main steps to perform the placement and the routing of the synthesized gate-
level netlist using standard cells from the IMEC design kit. The tool used here is Cadence Innovus. Each
subsection describes a particular step in the place and route process, first by how to do this manually then
by using a TCL script.
If the -overwrite switch is not used, both log and command files are incremented at each new session. The
Unix shell from which the tool is started is called the Innovus console. The console displays the innovus>
prompt. This is where you can enter all Innovus text commands and where the tool displays messages. If
you use the console for other actions, e.g., Unix commands, the Innovus session suspends until you finish
the action.
The first action to perform is loading a setup script that contains statements to set several global variables
and definitions of the used grid.
source PAR/BIN/setup.tcl
Design libraries and files. This includes information on the technological process and the cell library in
the LEF (Layout Exchange Format) format. LEF files provides information such as metal and via
layers and via generate rules which is used for routing tasks. They also provide the minimum infor-
mation on cell layouts for placement and routing.
Gate-level netlist. This relates to the synthesized (Verilog) netlist to be placed and routed.
Timing libraries. This includes information on the cell timings (delays, setup/hold times, etc.).
22
CHAPTER 4. STANDARD CELL PLACEMENT AND ROUTING 23
Loading the file umc65_init.globals set the Verilog source file to "filter_soc_mapped.v".
The imported design contains two core macro’s (coeff, ram) on the right side of the
chip. The main window includes three different design views that you can toggle during
a session: the Floorplan view, the Amoeba view, and the Physical view.
The Floorplan view displays the hierarchical module and block guides, connection flight lines, and floorplan
objects, including block placement, and power/ground nets. The Amoeba view displays the outline of the
modules and submodules after placement, showing physical locality of the module. The Physical view
displays the detailed placements of the module’s blocks, standard cells, nets, and interconnects.
The main window includes a satellite window, which identifies the location of the current view in the design
display area, relative to the entire design. The chip area is identified by a yellow box, the satellite view is
identified by the pink crossbox. When you display an entire chip in the design display area, the satellite
crossbox encompasses the chip area yellow box.
When you zoom and pan through the chip in the design display area, the satellite crossbox identifies where
you are relative to the entire chip.
• To move to an area in the design display area, click and drag on the satellite crossbox.
CHAPTER 4. STANDARD CELL PLACEMENT AND ROUTING 24
• To select a new area in the design display area, click and drag on the satellite crossbox.
• To resize an area in the satellite window, click with the Shift key and drag a corner of the crossbox.
• To define a chip area in the satellite window, right-click and drag on an area.
There are a number of binding keys available (hit the key when the Innovus GUI is active):
b display the list of binding keys
d (de)select or delete objects
q display the object attribute editor form for the selected object; click the left-button mouse to select an
object, Shift-click to select or deselect an object
u undo last command
U redo last command
z zoom-in 2x
Z zoom-out 2x
Arrows pan the display.
Hit CTRL-R to refresh the display. The alternative way instead of using the interactive environment is
loading the following script in the console window.
source PAR/BIN/designImport.tcl
CHAPTER 4. STANDARD CELL PLACEMENT AND ROUTING 25
Click OK
Now you can place the macros on the right side of the chip by hand through selecting the red-circle item on
the menu bar and drag the particular macro into the core area.
Floorplan ⇒ Automatic Floorplan ⇒ Plan Design... In TAB "Set Plan Design Mode"
Uncheck Boundary Place
Click OK
Floorplan ⇒ Edit Floorplan ⇒ Edit Floorplan... halo’s around the macro cell can be specified to pre-
vent placement of standardcells to close to the macro cells. Specify here a halo width of 28 um and
leave everything else default.
Floorplan ⇒ Clear Floorplan... allows you to delete all or parts of the floorplan objects.
Now the gaps between the IO cells must be filled with IO-filler cells. Execute the fillperi.tcl script by the
following command on the command line:
source PAR/BIN/fillperi.tcl
CHAPTER 4. STANDARD CELL PLACEMENT AND ROUTING 26
The display design area pane now shows the defined floorplan with the required number of rows.
It is a good idea to save the design at that stage to allow restarting here quickly without needing to redo all
the previous steps.
Select:
Check innovus in de popup-menu and save the current state in the file PAR/DB/filter_soc-fplan1
The data are actually saved in the directory PAR/DB/filter_soc-fplan1.dat
To restore design data, select File ⇒ Restore Design... in the main menu and select the particular design
file to restore from the PAR/DB directory. The following script performs all the above steps:
source PAR/BIN/floorplan.tcl
The left pane (Connection List) is initially empty. For each VDD and VSS net do:
In the Connect field check Pin and enter at Pin Name(s) (Here VDD or VSS).
In the Scope field check Apply All
Fill in the To Global Net field either VDD or VSS.
Click on Add to List. The left pane now includes the related global net connection.
Repeat these actions with Tie High checked and finally with Tie Low checked.
Click on Apply and close the window by Cancel.
Or execute the script:
source PAR/BIN/global_nets.tcl
CHAPTER 4. STANDARD CELL PLACEMENT AND ROUTING 28
The Net(s) field defines the number and the kinds of rings from the core. In our case, there will be first a
ground ring around the core and a VDD ring around the ground ring. The net names should be consistent
with the power net names in the cell LEF file.
In the field Ring Type: Check Core ring(s) contouring.
In the filed Ring Configuration: Specify ring widths of 2.8 µm spaced by 2.8 µm with offset of 28 µm.
The rings can be placed either at a particular offset as specified in our case or in the center of the channel
between the core and the chip boundary (or the IO pads, if any) by checking Offset: Center in channel.
It is possible to extend the ring segments to reach the core boundary.
Click on the Advanced tab and click on the segments you’d like to extend.
Other power and ground side trunks can be defined by selecting only horizontal or vertical segments.
Click OK to generate the rings.
To add block rings around the macro blocks, select Power ⇒ Power Planning ⇒ Add Rings... in the main
menu.
It is recommended to save the new stage of the design. Select File ⇒ Save Design... in the main menu and
save the current state in the file PAR/DB/filter_soc-pplan.
The alternative to execute the above powerplan steps manually is to execute the script:
source PAR/BIN/powerplan.tcl
CHAPTER 4. STANDARD CELL PLACEMENT AND ROUTING 30
The Timing Driven Placement Mode option will optimize the placement of the cells that are on the critical
path. Some cell instances may be replaced with cells having lower driving capabilities (downsizing) or
stronger driving capabilities (upsizing). Buffers may be also added or deleted. The Innovus console notifies
such changes.
Click OK to do the placement. It may take some time to complete, especially when the placement is timing
driven and a high effort level is used .
The placement should then look like below:
It is recommended to save the new stage of the design. Select File ⇒ Save Design... in the main menu and
save the current state in the file PAR/DB/filter_soc-placed. The alternative way is by running the tcl script:
source PAR/BIN/placement.tcl
CHAPTER 4. STANDARD CELL PLACEMENT AND ROUTING 31
In the Innovus console window you get a summary of the timing analysis:
# ##############################################################
# Generated by: Cadence I n n o v u s 17 .11−s080_1
# OS: L i n u x x86_64 ( H o s t ID s a l s a )
# Generated on: Wed J u l 4 13 : 3 2 : 4 0 2018
# Design: filter_soc
# Command: t i m e D e s i g n −preCTS − p a t h R e p o r t s − d r v R e p o r t s − s l a c k R e p o r t s −numPaths 50 − p r e f i x
f i l t e r _ s o c _ p r e C T S −outDir PAR / RPT
# ##############################################################
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
t i m e D e s i g n Summary
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
+−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−+−−−−−−−−−+−−−−−−−−−+
| S e t u p mode | all | reg2reg | default |
+−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−+−−−−−−−−−+−−−−−−−−−+
| WNS ( n s ) : | −0.109 | 1 . 2 1 5 | −0.109 |
| TNS ( n s ) : | −1.616 | 0 . 0 0 0 | −1.616 |
| Violating Paths: | 17 | 0 | 17 |
| All Paths: | 113 | 95 | 36 |
+−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−+−−−−−−−−−+−−−−−−−−−+
+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−+
| | Real | Total |
| DRVs +−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−|
| | Nr n e t s ( t e r m s ) | Worst Vio | Nr n e t s ( t e r m s ) |
+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−+
| max_cap | 24 ( 2 4 ) | −0.126 | 25 ( 2 5 ) |
| max_tran | 24 ( 1 3 5 ) | −3.097 | 24 ( 1 3 5 ) |
| max_fanout | 0 (0) | 0 | 0 (0) |
| max_length | 0 (0) | 0 | 0 (0) |
+−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−+
D e n s i t y : 0 . 3 8 3%
R o u t i n g O v e r f l o w : 0 . 0 0% H and 0 . 0 0% V
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
CHAPTER 4. STANDARD CELL PLACEMENT AND ROUTING 32
The design is critical as the worst negative slack (WNS) is negative (-0.109 ns).
To get more details on the critical path execute the following commands in the Innovus console:
report_timing > PAR/RPT/filter_soc_preCTS-reportTiming
Filler cells will fill remaining holes in the rows and ensure the continuity of power/ground rails and N+/P+
wells in the rows. To fill the holes with filler cells, select:
Another way to add the filler cells is by executing the tcl script "fillcore.tcl":
source PAR/BIN/fillcore.tcl
CHAPTER 4. STANDARD CELL PLACEMENT AND ROUTING 34
Select:
File ⇒ Report ⇒ Gate Count... gives the following output in the console:
==============================
General Design Information
==============================
Design Status: Routed
Design Name: filter_soc
# Instances: 24810
# Hard Macros: 2
CHAPTER 4. STANDARD CELL PLACEMENT AND ROUTING 38
------------------------------
Macro Cells in Netlist
------------------------------
Macro Name Instance Count Area ( um ^2) Area Percentage in Core
SPKA65_512X16BM1A 1 5288 .000 1 .027 %
SYKA65_128X16X1CM2 1 4722 .633 0 .918 %
# Std Cells: 24052
------------------------------
Standard Cells in Netlist
------------------------------
Cell Type Instance Count Area ( um ^2)
XNR3M1R 2 12 .2400
XNR2M1RA 1 3 .6000
OAI22M1R 9 22 .6800
OAI21M2R 1 2 .1600
OAI21M1R 17 36 .7200
OAI211M2R 2 5 .0400
OAI211M1R 1 2 .5200
OA21M1RA 3 7 .5600
NR3M1R 6 12 .9600
NR3B1M1R 2 5 .0400
NR2M1R 30 43 .2000
ND3M8RA 1 6 .1200
ND3M1R 3 6 .4800
ND2M4R 1 2 .5200
ND2M1R 39 56 .1600
ND2B1M1R 2 4 .3200
MXB2M1RA 15 43 .2000
MUX2M1RA 1 3 .6000
MAOI22M1RA 13 37 .4400
MAOI222M1RA 1 2 .8800
INVM2R 1 1 .0800
INVM1R 65 70 .2000
DFRM1RA 1 8 .6400
DFQRM1RA 63 498 .9600
CKXOR2M1RA 7 25 .2000
CKMUX2M2R 16 57 .6000
CKINVM2R 1 1 .0800
AOI22M1R 55 138 .6000
AOI221M1R 48 155 .5200
AOI21M1R 16 34 .5600
AOI21B20M1R 3 7 .5600
AO21M1RA 3 7 .5600
AN3M1R 1 2 .5200
AN2M1R 2 4 .3200
ADFM1RA 70 529 .2000
NR3M2W 1 2 .1600
NR2M4W 1 2 .5200
NR2M2W 3 4 .3200
NR2B1M2W 1 2 .1600
ND3M2W 1 2 .1600
ND2M4W 1 2 .5200
FIL8W 224 645 .1200
FIL64W 21066 485360 .6400
FIL4W 400 576 .0000
FIL32W 210 2419 .2000
FIL2W 650 468 .0000
FIL1W 677 243 .7200
FIL16W 257 1480 .3200
CKINVM8W 1 2 .5200
CKINVM48W 2 20 .8800
CKINVM40W 1 9 .0000
CKINVM20W 3 15 .1200
CKBUFM6W 2 5 .0400
CKBUFM48W 4 54 .7200
CKBUFM40W 3 34 .5600
BUFM8W 4 12 .9600
BUFM6W 4 10 .0800
BUFM48WA 12 181 .4400
BUFM40WA 3 37 .8000
BUFM2W 10 14 .4000
BUFM26WA 1 8 .6400
BUFM18W 1 6 .1200
BUFM10W 7 27 .7200
CHAPTER 4. STANDARD CELL PLACEMENT AND ROUTING 39
# Pads: 756
------------------------------
IO Cells in Netlist
------------------------------
I/O Name Instance Count
IVSSIO 8
IVSS 1
IVDDIO 8
IVDD 1
IUMB 18
IUMA 20
IFILLER5 57
IFILLER10 301
IFILLER1 112
IFILLER0 226
ICORNER 4
The parasitics must be first extracted. Therefore set the extraction mode:
Select Options ⇒ Set Mode ⇒ Specify RC Extraction Mode... in the main menu.
Check PostRoute, EffortLevel: Low, Extraction Type: Coupled RC
And extract the netlist:
Select Timing ⇒ Extract RC... in the main menu.
The generated Cap file includes the wired capacitance, pin capacitance, total capacitance, net length, wire
cap per unit length and the fanout of each net in the design. The generated SPEF (Standard Parasitics
Exchange Format) file includes RC values in a SPICE-like format.
The SDF file may be then generated by selecting
Timing ⇒ Write SDF... in the main menu. The checked Ideal Clock switch means that flip-flops are
considered as having 0ps rising and falling transition times.
CHAPTER 4. STANDARD CELL PLACEMENT AND ROUTING 40
Select File ⇒ Save ⇒ Netlist... in the main menu. Do not select Include Leaf Cell Definition as they are
provided in a separate library.
The generated file should go into the HDL/GATE directory.
CHAPTER 4. STANDARD CELL PLACEMENT AND ROUTING 41
The script par.tcl given below calls TCL subscripts, one for each design step. During an interactive session
of Innovus you can source the scriptsi the proper sequence at the innovus command prompt. This allows
for checking the result after each Place&Route step. By modifying parameters in a particular design step
script you can define design information and to control the flow to some extent.
Note that a configuration file must exist before running the script. The configuration file name is in the
PAR/CONF directory and its name is defined in the script.
Appendix A
VHDL Netlists
entity filter is
generic (
CWIDTH : integer := 16;
CAW : integer := 7;
DWIDTH : integer := 32;
DAW : integer := 7
);
port (
ClkxCI : in std_logic ;
ResetxRBI : in std_logic ;
DataInxDI : in std_logic_vector ( DWIDTH -1 downto 0) ;
DataInReqxSI : in std_logic ;
DataInAckxSO : out std_logic ;
DataOutxDO : out std_logic_vector ( DWIDTH -1 downto 0) ;
DataOutReqxSO : out std_logic ;
DataOutAckxSI : in std_logic ;
LutAddrxDO : out std_logic_vector (CAW -1 downto 0) ;
LutReadxDI : in std_logic_vector ( CWIDTH -1 downto 0) ;
RamWriteEnxSO : out std_logic ;
RamAddrxDO : out std_logic_vector (DAW -1 downto 0) ;
RamReadxDI : in std_logic_vector ( DWIDTH -1 downto 0) ;
RamWritexDO : out std_logic_vector ( DWIDTH -1 downto 0)
);
end filter ;
-- Registers
signal RamWriteEnxS : std_logic ;
42
APPENDIX A. VHDL NETLISTS 43
-- Counters
signal OffsetDecxS : std_logic ;
signal OffsetxDP , OffsetxDN : unsigned (DAW -1 downto 0) ;
signal CounterIncxS : std_logic ;
signal CounterxDP , CounterxDN : unsigned (CAW -1 downto 0) ;
-- Counters
signal RamAddrxD : std_logic_vector (DAW -1 downto 0) ;
signal LutAddrxD : std_logic_vector (CAW -1 downto 0) ;
-- ALU signals
signal SumxD : signed (( DWIDTH + CWIDTH ) -1 downto 0) ;
signal SumStdxD : std_logic_vector (( DWIDTH + CWIDTH ) -1 downto 0) ;
signal RamReadxD : std_logic_vector ( DWIDTH -1 downto 0) ;
signal RamSignedxD : signed ( DWIDTH -1 downto 0) ;
signal LutReadxD : std_logic_vector ( CWIDTH -1 downto 0) ;
signal LutSignedxD : signed ( CWIDTH -1 downto 0) ;
signal MultxD : signed (( DWIDTH + CWIDTH ) -1 downto 0) ;
-- Registers
signal AccuClrxS : std_logic ;
signal AccuxDP , AccuxDN : signed (( DWIDTH + CWIDTH ) -1 downto 0) ;
-- Registers
signal OutRegEnxS : std_logic ;
signal OutRegxDP , OutRegxDN : std_logic_vector ( DWIDTH -1 downto 0) ;
begin
--RamWriteEnxSO <= RamWriteEnxS;
------------------------------------------------------------
-- Input register
------------------------------------------------------------
InRegxDN <= DataInxDI ;
p_inreg : process ( ClkxCI , ResetxRBI )
begin
if ResetxRBI = ’0 ’ then
RamWritexDO <= (others => ’0 ’);
elsif ClkxCI ’ event and ClkxCI = ’1 ’ then
if InRegEnxS = ’1’ then
RamWritexDO <= InRegxDN ;
end if;
end if;
end process p_inreg ;
------------------------------------------------------------
-- Counters
------------------------------------------------------------
p_data : process ( OffsetxDP , OffsetDecxS )
begin
OffsetxDN <= OffsetxDP ;
if OffsetDecxS = ’1’ then
OffsetxDN <= OffsetxDP - " 0000001 ";
end if;
end process p_data ;
------------------------------------------------------------
-- Counters
------------------------------------------------------------
-- two similar registers combined in one process
p_adrclk : process ( ClkxCI , ResetxRBI )
begin
if ResetxRBI = ’0 ’ then
CounterxDP <= (others => ’0 ’);
OffsetxDP <= (others => ’0 ’);
elsif ClkxCI ’ event and ClkxCI = ’1 ’ then
CounterxDP <= CounterxDN ;
OffsetxDP <= OffsetxDN ;
end if;
end process p_adrclk ;
------------------------------------------------------
-- ALU
------------------------------------------------------
-- type conversion
RamSignedxD <= signed ( RamReadxDI );
LutSignedxD <= signed ( LutReadxDI );
-- signed operations
MultxD <= RamSignedxD * LutSignedxD ;
SumxD <= MultxD + AccuxDP ;
--type conversion
SumStdxD <= std_logic_vector ( SumxD );
-- simple truncate
--OutRegxDN<= SumStdxD((DWIDTH+CWIDTH)-1 downto CWIDTH);
OutRegxDN <= SumStdxD ( DWIDTH -1 downto 0) ;
------------------------------------------------------
-- ALU
------------------------------------------------------
-- Accumulator next state
AccuxDN <= SumxD when AccuClrxS = ’0’ else (others => ’0 ’);
-------------------------------------------------------
-- Output register
-------------------------------------------------------
p_outreg : process ( ClkxCI , ResetxRBI )
begin
if ResetxRBI = ’0’ then
OutRegxDP <= (others => ’0 ’);
elsif ClkxCI ’ event and ClkxCI = ’1 ’ then
if OutRegEnxS = ’1’ then
APPENDIX A. VHDL NETLISTS 45
-------------------------------------------------------
-- Control FSM
-------------------------------------------------------
p_fsm : process( StatexDP , DataInReqxSI ,
DataOutAckxSI , CounterxDP )
begin
--defaults
InRegEnxS <= ’0 ’;
OutRegEnxS <= ’0 ’;
AccuClrxS <= ’0 ’;
OffsetDecxS <= ’0 ’;
CounterIncxS <= ’0 ’;
RamWriteEnxSO <= ’0 ’;
DataInAckxSO <= ’0 ’;
DataOutReqxSO <= ’0 ’;
StatexDN <= StatexDP ;
--case statements
case StatexDP is
when idle =>
if DataInReqxSI = ’1’ then
InRegEnxS <= ’1 ’;
StatexDN <= new_data ;
end if;
when new_data =>
AccuClrxS <= ’1 ’;
RamWriteEnxSO <= ’1 ’;
DataInAckxSO <= ’1 ’;
StatexDN <= run ;
when run =>
CounterIncxS <= ’1 ’;
if CounterxDP = " 1111111 " then
OutRegEnxS <= ’1 ’;
OffsetDecxS <= ’1 ’;
StatexDN <= data_out ;
end if;
when data_out =>
DataOutReqxSO <= ’1 ’;
if DataOutAckxSI = ’1’ then
StatexDN <= idle ;
end if;
when others => null;
end case;
end process p_fsm ;
end rtl ;
APPENDIX A. VHDL NETLISTS 46
entity filter_top is
generic (
CWIDTH : integer := 16;
CAW : integer := 7;
DWIDTH : integer := 16;
DAW : integer := 7
);
port (
ClkxCI : in std_logic ;
ResetxRBI : in std_logic ;
DataInxDI : in std_logic_vector ( DWIDTH -1 downto 0) ;
DataInReqxSI : in std_logic ;
DataInAckxSO : out std_logic ;
DataOutxDO : out std_logic_vector ( DWIDTH -1 downto 0) ;
DataOutReqxSO : out std_logic ;
DataOutAckxSI : in std_logic
);
end filter_top ;
component dataRAM
generic (
DWIDTH : integer ;
DAW : integer );
port (
CS : IN std_logic ;
AddrxDI : in std_logic_vector (DAW -1 downto 0) ;
WExSI : in std_logic ;
WClkxCI : in std_logic ;
DinxDI : in std_logic_vector ( DWIDTH -1 downto 0) ;
DoutxDO : out std_logic_vector ( DWIDTH -1 downto 0) );
end component;
component filter
generic (
DWIDTH : integer ;
DAW : integer );
port (
ClkxCI : in std_logic ;
ResetxRBI : in std_logic ;
DataInxDI : in std_logic_vector ( DWIDTH -1 downto 0) ;
APPENDIX A. VHDL NETLISTS 47
DataInReqxSI : in std_logic ;
DataInAckxSO : out std_logic ;
DataOutxDO : out std_logic_vector ( DWIDTH -1 downto 0) ;
DataOutReqxSO : out std_logic ;
DataOutAckxSI : in std_logic ;
LutAddrxDO : out std_logic_vector (CAW -1 downto 0) ;
LutReadxDI : in std_logic_vector ( CWIDTH -1 downto 0) ;
RamWriteEnxSO : out std_logic ;
RamAddrxDO : out std_logic_vector (DAW -1 downto 0) ;
RamReadxDI : in std_logic_vector ( DWIDTH -1 downto 0) ;
RamWritexDO : out std_logic_vector ( DWIDTH -1 downto 0) );
end component;
begin
------------------------------------------------------------
-- Component Instantiations
------------------------------------------------------------
ClkxCBI <= not ClkxCI ;
i_coeff : coeff
generic map (
CWIDTH => CWIDTH ,
CAW => CAW )
port map (
ClkxCI => ClkxCI ,
AddrxDI => LutAddrxD ,
DataxDO => LutReadxD );
i_dataRAM : dataRAM
generic map (
DWIDTH => DWIDTH ,
DAW => DAW )
port map (
CS => ResetxRBI ,
AddrxDI => RamAddrxD ,
WExSI => RamWriteEnxS ,
WClkxCI => ClkxCI ,
DinxDI => RamWritexD ,
DoutxDO => RamReadxD );
i_filter : filter
generic map (
DWIDTH => DWIDTH ,
DAW => DAW )
port map (
ClkxCI => ClkxCI ,
ResetxRBI => ResetxRBI ,
DataInxDI => DataInxDI ,
DataInReqxSI => DataInReqxSI ,
DataInAckxSO => DataInAckxSO ,
DataOutxDO => DataOutxDO ,
DataOutReqxSO => DataOutReqxSO ,
DataOutAckxSI => DataOutAckxSI ,
LutAddrxDO => LutAddrxD ,
APPENDIX A. VHDL NETLISTS 48
end rtl ;
--library techmap;
--use techmap.gencomp.all;
entity filter_soc is
generic (
CWIDTH : integer := 16;
CAW : integer := 7;
DWIDTH : integer := 16;
DAW : integer := 7
);
port (
ClkxCI : in std_logic ;
ResetxRBI : in std_logic ;
DataInxDI : in std_logic_vector ( DWIDTH -1 downto 0) ;
DataInReqxSI : in std_logic ;
DataInAckxSO : out std_logic ;
DataOutxDO : out std_logic_vector ( DWIDTH -1 downto 0) ;
DataOutReqxSO : out std_logic ;
DataOutAckxSI : in std_logic
);
end filter_soc ;
end component;
------------------------------------------------------------
------------------------------------------------------------
component IUMA is
port (
OE : in STD_ULOGIC := ’U ’;
IDDQ : in STD_ULOGIC := ’U ’;
DO : in STD_ULOGIC := ’U ’;
PIN1 : in STD_ULOGIC := ’U ’;
PIN2 : in STD_ULOGIC := ’U ’;
SMT : in STD_ULOGIC := ’U ’;
SR : in STD_ULOGIC := ’U ’;
PD : in STD_ULOGIC := ’U ’;
PU : in STD_ULOGIC := ’U ’;
DI : out STD_ULOGIC ;
PAD : inout STD_ULOGIC ;
VDD : inout STD_ULOGIC ;
VDDIO : inout STD_ULOGIC ;
VSS : inout STD_ULOGIC ;
VSSIO : inout STD_ULOGIC );
end component IUMA ;
component IUMB is
port (
OE : in STD_ULOGIC := ’U ’;
IDDQ : in STD_ULOGIC := ’U ’;
DO : in STD_ULOGIC := ’U ’;
PIN1 : in STD_ULOGIC := ’U ’;
PIN2 : in STD_ULOGIC := ’U ’;
SMT : in STD_ULOGIC := ’U ’;
SR : in STD_ULOGIC := ’U ’;
PD : in STD_ULOGIC := ’U ’;
PU : in STD_ULOGIC := ’U ’;
DI : out STD_ULOGIC ;
PAD : inout STD_ULOGIC ;
VDD : inout STD_ULOGIC ;
VDDIO : inout STD_ULOGIC ;
VSS : inout STD_ULOGIC ;
VSSIO : inout STD_ULOGIC );
end component IUMB ;
component IVDD is
port (
VDD : inout STD_ULOGIC ;
VSS : inout STD_ULOGIC );
end component IVDD ;
component IVDDIO is
port (
VDD : inout STD_ULOGIC ;
VDDIO : inout STD_ULOGIC ;
VSSIO : inout STD_ULOGIC );
end component IVDDIO ;
component IVSS is
port (
VDDIO : inout STD_ULOGIC ;
VSS : inout STD_ULOGIC ;
VSSIO : inout STD_ULOGIC );
end component IVSS ;
component IVSSIO is
port (
VDD : inout STD_ULOGIC ;
VSSIO : inout STD_ULOGIC );
APPENDIX A. VHDL NETLISTS 50
------------------------------------------------------------
-- signal declarations
------------------------------------------------------------
signal ClkxCI_s : std_logic ;
signal ResetxRBI_s : std_logic ;
signal DataInxDI_s : std_logic_vector ( DWIDTH -1 downto 0) ;
signal DataInReqxSI_s : std_logic ;
signal DataInAckxSO_s : std_logic ;
signal DataOutxDO_s : std_logic_vector ( DWIDTH -1 downto 0) ;
signal DataOutReqxSO_s : std_logic ;
signal DataOutAckxSI_s : std_logic ;
signal ClkxCI_p : std_logic ;
signal ResetxRBI_p : std_logic ;
signal DataInxDI_p : std_logic_vector ( DWIDTH -1 downto 0) ;
signal DataInReqxSI_p : std_logic ;
signal DataInAckxSO_p : std_logic ;
signal DataOutxDO_p : std_logic_vector ( DWIDTH -1 downto 0) ;
signal DataOutReqxSO_p : std_logic ;
signal DataOutAckxSI_p : std_logic ;
signal VCCIO : std_ulogic_vector (7 downto 0) ;
signal GNDIO : std_ulogic_vector (7 downto 0) ;
signal VCCCO : std_ulogic ;
signal GNDCO : std_ulogic ;
begin
------------------------------------------------------------
-- Pad Instantiations
------------------------------------------------------------
-- Power Pads
io_VCCIO :
for j in 8 -1 downto 0 generate
io_VCCIO_x : IVDDIO port map ( VDDIO => open, VDD => open, VSSIO => open) ;
end generate;
io_GNDIO :
for j in 8 -1 downto 0 generate
io_GNDIO_x : IVSSIO port map ( VSSIO => open, VDD => open) ;
end generate;
APPENDIX A. VHDL NETLISTS 51
io_VCCCO :
IVDD port map ( VDD => open, VSS => open) ;
io_GNDCO :
IVSS port map ( VSS => open, VDDIO => open, VSSIO => open) ;
-- Signal Pads
i_ClkxCI :
IUMA port map ( do => ’0’, oe => ’0’, pad => ClkxCI_p , di => ClkxCI_s , pin1 = > ’0 ’ ,
pin2 => ’0’, sr => to_stdulogic (0) ,
PU => ’0’, PD => ’0’, SMT => ’0’, IDDQ => ’0’, VDD =>
open, VDDIO => open, VSS => open, VSSIO => open);
i_ResetxRBI :
IUMA port map ( do => ’0’, oe => ’0’, pad => ResetxRBI_p , di => ResetxRBI_s , pin1
= > ’0 ’ , pin2 => ’0’, sr => to_stdulogic (0) ,
PU => ’0’, PD => ’0’, SMT => ’0’, IDDQ => ’0’, VDD =>
open, VDDIO => open, VSS => open, VSSIO => open);
i_DataInReqxSI :
IUMA port map ( do => ’0’, oe => ’0’, pad => DataInReqxSI_p , di => DataInReqxSI_s ,
pin1 = > ’0 ’ , pin2 => ’0’, sr => to_stdulogic (0) ,
PU => ’0’, PD => ’0’, SMT => ’0’, IDDQ => ’0’, VDD =>
open, VDDIO => open, VSS => open, VSSIO => open);
i_DataOutAckxSI :
IUMA port map ( do => ’0’, oe => ’0’, pad => DataOutAckxSI_p , di => DataOutAckxSI_s ,
pin1 = > ’0 ’ , pin2 => ’0’, sr => to_stdulogic (0) ,
PU => ’0’, PD => ’0’, SMT => ’0’, IDDQ => ’0’, VDD =>
open, VDDIO => open, VSS => open, VSSIO => open);
i_DataInxDI :
for j in DWIDTH -1 downto 0 generate
i_DataInxDI_x : IUMA port map ( do => ’0’, oe => ’0’, pad => DataInxDI_p (j) , di
=> DataInxDI_s (j) , pin1 = > ’0 ’ , pin2 => ’0’, sr => to_stdulogic (0) ,
PU => ’0’, PD => ’0’, SMT => ’0’, IDDQ => ’0’, VDD =>
open, VDDIO => open, VSS => open, VSSIO => open);
end generate;
o_DataInAckxSO :
IUMB port map ( do => DataInAckxSO_s , oe => ’1’, pad => DataInAckxSO_p , di => open,
pin1 = > ’0 ’ , pin2 => ’0’, sr => to_stdulogic (0) ,
PU => ’0’, PD => ’0’, SMT => ’0’, IDDQ => ’0’, VDD =>
open, VDDIO => open, VSS => open, VSSIO => open);
o_DataOutReqxSO :
IUMB port map ( do => DataOutReqxSO_s , oe => ’1’, pad => DataOutReqxSO_p , di => open,
pin1 = > ’0 ’ , pin2 => ’0’, sr => to_stdulogic (0) ,
PU => ’0’, PD => ’0’, SMT => ’0’, IDDQ => ’0’, VDD =>
open, VDDIO => open, VSS => open, VSSIO => open);
o_DataOutxDO :
for j in DWIDTH -1 downto 0 generate
o_DataOutxDO_x : IUMB port map ( do => DataOutxDO_s (j) , oe => ’1’, pad =>
DataOutxDO_p (j) , di => open, pin1 = > ’0 ’ , pin2 => ’0’, sr => to_stdulogic
(0) ,
PU => ’0’, PD => ’0’, SMT => ’0’, IDDQ => ’0’, VDD =>
open, VDDIO => open, VSS => open, VSSIO => open);
end generate;
------------------------------------------------------------
APPENDIX A. VHDL NETLISTS 52
-- Component Instantiations
------------------------------------------------------------
i_filter_top : filter_top
generic map (
CWIDTH => CWIDTH ,
CAW => CAW ,
DWIDTH => DWIDTH ,
DAW => DAW )
port map (
ClkxCI => ClkxCI_s ,
ResetxRBI => ResetxRBI_s ,
DataInxDI => DataInxDI_s ,
DataInReqxSI => DataInReqxSI_s ,
DataInAckxSO => DataInAckxSO_s ,
DataOutxDO => DataOutxDO_s ,
DataOutReqxSO => DataOutReqxSO_s ,
DataOutAckxSI => DataOutAckxSI_s
);
end rtl ;
LIBRARY ieee ;
USE ieee . std_logic_1164 .ALL;
USE ieee . std_logic_arith .ALL;
USE ieee . std_logic_signed .ALL;
USE ieee . math_real .ALL;
APPENDIX A. VHDL NETLISTS 53
ENTITY filter_soc_tb IS
GENERIC( clock_delay : time := 16 ns ;
CWIDTH : integer := 16;
CAW : integer := 7;
DWIDTH : integer := 16;
DAW : integer := 7
);
END filter_soc_tb ;
component filter_soc is
generic (
CWIDTH : integer := 16;
CAW : integer := 7;
DWIDTH : integer := 32;
DAW : integer := 7
);
port (
ClkxCI : in std_logic ;
ResetxRBI : in std_logic ;
DataInxDI : in std_logic_vector ( DWIDTH -1 downto 0) ;
DataInReqxSI : in std_logic ;
DataInAckxSO : out std_logic ;
DataOutxDO : out std_logic_vector ( DWIDTH -1 downto 0) ;
DataOutReqxSO : out std_logic ;
DataOutAckxSI : in std_logic
);
end component;
BEGIN
-- Instantiate device-under-test.
dut : filter_soc
generic map (
CWIDTH => CWIDTH ,
CAW => CAW ,
DWIDTH => DWIDTH ,
DAW => DAW )
port map (
ClkxCI => ClkxCI ,
ResetxRBI => ResetxRBI ,
DataInxDI => DataInxDI ,
DataInReqxSI => DataInReqxSI ,
DataInAckxSO => DataInAckxSO ,
DataOutxDO => DataOutxDO ,
DataOutReqxSO => DataOutReqxSO ,
DataOutAckxSI => DataOutAckxSI
);
clock_generation :
PROCESS
APPENDIX A. VHDL NETLISTS 54
BEGIN
-- Generate equal duty-cycle clock.
ClkxCI <= ’0 ’;
WAIT FOR ( clock_delay / 2 );
ClkxCI <= ’1 ’;
WAIT FOR ( clock_delay / 2 );
END PROCESS clock_generation ;
generate_stimulus :
PROCESS
BEGIN
-- Initialize input signals.
DataInReqxSI <= ’0 ’;
DataInxDI <= ( OTHERS => ’0’ );
DataOutAckxSI <= ’0 ’;
DataInReqxSI <= ’0 ’;
DataInxDI <= ( OTHERS => ’0’ );
DataOutAckxSI <= ’1 ’;
DataOutAckxSI <= ’0 ’;
END LOOP;
--
-- Wait forever.
--
WAIT;
END behavioral ;
Appendix B
Tool Scripts
set corner wc
55
APPENDIX B. TOOL SCRIPTS 56
################################
# Other Options
################################
set_host_options -max_cores 4
set hdlin_reporting_level comprehensive
#set hdlin_reporting_level verbose
set hdlin_keep_signal_name all
set hdlin_check_no_latch true
B.1.2 load_design.tcl
#-----------------------------------------------------------------------------
# Design related information (can be changed)
#-----------------------------------------------------------------------------
set VHDL_ENTITY filter_soc
set VHDL_ARCH rtl
set CLK_NAME ClkxCI
set RST_NAME ResetxRBI
# all time values are in ns
set CLK_PERIOD 8;
set CLK_UNCERTAINTY 0 .2 ;
set INPUT_DELAY 0 .6 ;
set OUTPUT_DELAY 0 .8 ;
APPENDIX B. TOOL SCRIPTS 57
set PAD_IN 0 .5
set PAD_OUT 1 .5
set CLK_TREE 0
#-----------------------------------------------------------------------------
# Flags that drive the script behavior (can be changed)
#
# DB_FORMAT (db | ddc)
# if db, use the old DB format to store design information
# if ddc, use the new XG format to store design information (recommended)
# SHARE_RESOURCES (0 | 1)
# if 1, force the tool to share resources as much as possible
# if 0, no resource sharing
# COMPILE_SIMPLE (0 | 1)
# if 1, only do a single compile with default arguments
# if 0, do a two-step compilation with ungrouping in between
# OPT (string)
# can be used to have different mapped file names
#-----------------------------------------------------------------------------
set DB_MODE ddc
set COMPILE_SIMPLE 1
set OPT "" ;# to denote the 10ns clock period case
#-----------------------------------------------------------------------------
# File names
#-----------------------------------------------------------------------------
set SOURCE_FILE_NAME ${ VHDL_ENTITY }
set ROOT_FILE_NAME ${ VHDL_ENTITY }
set VHDL_SOURCE_FILE_NAME ${ SOURCE_FILE_NAME } .vhd
set ELAB_FILE_NAME ${ ROOT_FILE_NAME } _elab
set MAPPED_FILE_NAME ${ ROOT_FILE_NAME }${ OPT } _mapped
set DB_ELAB_FILE_NAME ${ ELAB_FILE_NAME } .$DB_MODE
set DB_MAPPED_FILE_NAME ${ MAPPED_FILE_NAME } .$DB_MODE
set VHDL_NETLIST_FILE_NAME ${ MAPPED_FILE_NAME } .vhd
set VLOG_NETLIST_FILE_NAME ${ MAPPED_FILE_NAME } .v
set SDF_FILE_NAME ${ MAPPED_FILE_NAME } .sdf
set SDC_FILE_NAME ${ MAPPED_FILE_NAME } .sdc
set RPT_AREA_FILE_NAME ${ MAPPED_FILE_NAME } _area.rpt
set RPT_TIMING_FILE_NAME ${ MAPPED_FILE_NAME } _timing.rpt
set RPT_RESOURCES_FILE_NAME ${ MAPPED_FILE_NAME } _resources.rpt
set RPT_REFERENCES_FILE_NAME ${ MAPPED_FILE_NAME } _references.rpt
set RPT_CELLS_FILE_NAME ${ MAPPED_FILE_NAME } _cells.rpt
set RPT_POWER_FILE_NAME ${ MAPPED_FILE_NAME } _power.rpt
set RPT_NET_FANOUT_FILE_NAME ${ MAPPED_FILE_NAME } _net_fanout.rpt
#-----------------------------------------------------------------------------
# Absolute paths
#-----------------------------------------------------------------------------
set VHDL_SOURCE_DIR ${ PROJECT_DIR }/ HDL / RTL
set VHDL_SOURCE_FILE ${ VHDL_SOURCE_DIR }/ ${ VHDL_SOURCE_FILE_NAME }
set VHDL_NETLIST_FILE ${ PROJECT_DIR }/ HDL / GATE /${ VHDL_NETLIST_FILE_NAME }
set VLOG_NETLIST_FILE ${ PROJECT_DIR }/ HDL / GATE /${ VLOG_NETLIST_FILE_NAME }
set DB_ELAB_FILE ${ PROJECT_DIR }/ SYN / DB /${ DB_ELAB_FILE_NAME }
APPENDIX B. TOOL SCRIPTS 58
#-----------------------------------------------------------------------------
# Suppress Errors
#-----------------------------------------------------------------------------
set suppress_errors " VHDL-2285 OPT-150 TIM-111 TIM-112 HDL-193 ELAB-130 ELAB-924
ELAB-311 ELAB-802 PWR-536 OPT-776 OPT-1056 UID-95 OPT-1022 "
file mkdir LIB / SNPS
file mkdir LIB / SNPS / work
define_design_lib work -path LIB / SNPS / work
#-----------------------------------------------------------------------------
# Analyze RTL source
#-----------------------------------------------------------------------------
analyze -format VHDL -library work {\
HDL / RTL / coeffFAR.vhd \
HDL / RTL / dataRamFAR.vhd \
HDL / RTL / filter.vhd \
HDL / RTL / filter_top.vhd \
HDL / RTL / filter_soc.vhd \
}
#-----------------------------------------------------------------------------
# Elaborate design
#-----------------------------------------------------------------------------
elaborate $VHDL_ENTITY
# -arch $VHDL_ARCH
#-----------------------------------------------------------------------------
# Save elaborated design and constraints
#-----------------------------------------------------------------------------
write -hierarchy -format $DB_MODE -output $DB_ELAB_FILE
B.1.3 constraints.tcl
uniquify -dont_skip_empty_designs
remove_unconnected_ports -blast_buses [ find -hierarchy cell {"*" }]
remove_unconnected_ports [ find -hierarchy cell {"*" }]
#-----------------------------------------------------------------------------
# Define constraints
#-----------------------------------------------------------------------------
# create the main Clock
create_clock -name $CLK_NAME -period $CLK_PERIOD [ get_ports $CLK_NAME ]
# clocked inputs have the input delay minus the clock tree
set_input_delay [expr $IN + $CLK_TREE ] -clock $CLK_NAME [ all_inputs ]
#set_input_delay $INPUT_DELAY -clock $CLK_NAME [list [all_inputs]]
#set all_inputs_worst_clk [remove_from_collection [remove_from_collection [all_inputs] [
get_ports $CLK]] [get_ports $RST]]
#set_input_delay -clock $CLK -max [expr $DFF_CKQ*2] $all_inputs_worst_clk
APPENDIX B. TOOL SCRIPTS 59
set_max_area 0
set_fix_hold $CLK_NAME
#set_fix_hold [all_clocks]
set_drive 0 $RST_NAME
set_drive 0 $CLK_NAME
set_dont_touch_network $RST_NAME
set_ideal_network [ get_ports $RST_NAME ]
set_fix_multiple_port_nets -all
set fsm_auto_inferring true
set_fsm_encoding_style binary
B.1.4 compile.tcl
#set TEST 1
#set TEST 0
#-----------------------------------------------------------------------------
# Map design to gates
#-----------------------------------------------------------------------------
set bind_unused_hierarchical_pins false
# run compilation
if { $COMPILE_SIMPLE } {
compile_ultra
} else {
compile_ultra -map_effort medium -area_effort medium
ungroup -all -flatten
compile_ultra -incremental -map_effort high
}
report_qor
APPENDIX B. TOOL SCRIPTS 60
report_timing
report_area
#-----------------------------------------------------------------------------
# Save mapped design
#-----------------------------------------------------------------------------
write -hierarchy -format $DB_MODE -output $DB_MAPPED_FILE
B.1.5 check_save.tcl
#-----------------------------------------------------------------------------
# Generate reports
#-----------------------------------------------------------------------------
report_qor -nosplit > $RPT_QOR_FILE
report_area -nosplit > $RPT_AREA_FILE
report_power -nosplit > $RPT_POWER_FILE
report_timing -path full \
-delay max \
-nworst 1 \
-max_paths 1 \
-significant_digits 2 \
-nosplit \
-sort_by group \
> $RPT_TIMING_FILE
report_resources -nosplit -hierarchy > $RPT_RESOURCES_FILE
report_reference -nosplit > $RPT_REFERENCES_FILE
report_cell -nosplit > $RPT_CELLS_FILE
report_net_fanout -hi > $RPT_NET_FANOUT_FILE
echo " IN2REG TIMING " > ${
RPT_TIMING_FILE }1
report_timing -from [ all_inputs ] -to [ all_registers -data_pins ] >> ${
RPT_TIMING_FILE }1
echo " REG2REG TIMING " >> ${
RPT_TIMING_FILE }1
report_timing -from [ all_registers -clock_pins ] -to [ all_registers -data_pins ] >> ${
RPT_TIMING_FILE }1
echo " REG2OUT TIMING " >> ${
RPT_TIMING_FILE }1
report_timing -from [ all_registers -clock_pins ] -to [ all_outputs ] >> ${
RPT_TIMING_FILE }1
echo " IN2OUT TIMING " >> ${
RPT_TIMING_FILE }1
report_timing -from [ all_inputs ] -to [ all_outputs ] >> ${
RPT_TIMING_FILE }1
#-----------------------------------------------------------------------------
# Generate VHDL netlist
#-----------------------------------------------------------------------------
#change_names -rule vhdl -hierarchy -verbose
remove_design -all -quiet
read_file -format $DB_MODE $DB_MAPPED_FILE
change_names -hierarchy -rules vhdl
write -format vhdl -hierarchy -output $VHDL_NETLIST_FILE
#-----------------------------------------------------------------------------
# Generate Verilog netlist
#
# The design is reloaded from scratch to avoid potential naming problems
# when using the netlist for placement and routing
#-----------------------------------------------------------------------------
uniquify
APPENDIX B. TOOL SCRIPTS 61
B.1.6 syn.tcl
set TEST 1
#set TEST 0
#scan setup
#source scripts/scan_setup.tcl
# run compilation
source SYN / BIN / compile.tcl
#if { $COMPILE_SIMPLE } {
#compile_ultra
#} else {
#compile_ultra -map_effort medium -area_effort medium
#ungroup -all -flatten
#compile_ultra -incremental -map_effort high
#}
#compile_ultra -gate_clock -scan -no_autoungroup
#scan stitch
#source scripts/scan_stitch.tcl
report_qor
#report_scan_chain
#ckSynthesis \
#-rguide $CTS_RGUIDE_FILE \
#-report $CTS_RPT_FILE
#optDesign -postCTS -drv -outDir ${PROJECT_DIR}/PAR/RPT
#} ;# make_clock_tree
#source $CONF_FILE
#init_design
#loadIoFile $IO_FILE
setDesignMode -process 65
setPreference ConstraintUserXGrid 0 .20
setPreference ConstraintUserXOffset 0 .20
setPreference ConstraintUserYGrid 0 .20
setPreference ConstraintUserYOffset 0 .20
setPreference SnapAllCorners 1
#clearGlobalNets
#globalNetConnect VDD -type pgpin -pin VDD -inst * -module {} -verbose
#globalNetConnect VSS -type pgpin -pin VSS -inst * -module {} -verbose
#applyGlobalNets
APPENDIX B. TOOL SCRIPTS 64
setDrawView fplan
fit
B.2.2 importDesign.tcl
source $CONF_FILE
init_design
loadIoFile $IO_FILE
setDesignMode -process 65
setPreference ConstraintUserXGrid 0 .20
setPreference ConstraintUserXOffset 0 .20
setPreference ConstraintUserYGrid 0 .20
setPreference ConstraintUserYOffset 0 .20
setPreference SnapAllCorners 1
setDrawView fplan
fit
B.2.3 floorplan.tcl
finishFloorplan -addHalo 14
saveDesign $SAVE_DESIGN_FP_FILE
setDrawView fplan
fit
#selectInst i_filter_top_i_dataRAM_i_dmem
#placeInstance i_filter_top_i_dataRAM_i_dmem 669.363 922.454
#deselectAll
#selectInst i_filter_top_i_coeff_a9d16
#placeInstance i_filter_top_i_coeff_a9d16 809.227 885.546 MX90
#cutRow
#deselectAll
#
#fit
B.2.4 powerplan.tcl
puts " ----------------- Power Planning ------------------------------------------ "
set crwidth 2 .8
set crspace 2 .80
set croffset 28 .00
set corepgrSpacing 2
set corepgrWidth 3
set corepgrOffset 1
cutRow
deselectAll
deselectAll
deselectAll
saveDesign $SAVE_DESIGN_PR_FILE
setDrawView fplan
fit
puts " ----------------- Power Planning done -------------------------------------- "
APPENDIX B. TOOL SCRIPTS 66
B.2.5 placement.tcl
set delaycal_use_default_delay_limit
setDelayCalMode -reportOutBound false
if { $PLACE_TIMING } {
setPlaceMode -congEffort $PL_EFFORT -timingDriven true
placeDesign
} else {
setPlaceMode -congEffort $PL_EFFORT
placeDesign
}
saveDesign $SAVE_DESIGN_PL_FILE
puts " -------------Done Placing Cells----- "
setDrawView place
fit
B.2.6 cts.tcl
set_ccopt_property use_inverters auto
setCCOptMode -cts_opt_type full
create_ccopt_clock_tree_spec
ccopt_design
B.2.7 route.tcl
puts " --------Add Filler Cells--------------- "
source ${ PROJECT_DIR }/ PAR / BIN / fillcore.tcl
setDesignMode -process 65
globalDetailRoute
B.2.8 verify.tcl
verify_drc \
-report $RPT_GEOM_FILE
B.2.9 results.tcl
source PAR / BIN / fillcore.tcl
setExtractRCMode \
-engine postRoute \
-coupled true \
-relative_c_th 0 .01 \
-total_c_th 5 .0
extractRC
reportAnalysisMode
buildTimingGraph
check_timing -verbose > $RPT_CHECK_TA_FILE
report_timing \
-format { hpin arc cell delay arrival required slew fanout load } \
-late \
-max_points 10 \
-net \
> $RPT_REPORT_TA_FILE
B.2.10 par.tcl
set PROJECT_DIR [pwd]
set PAR_BIN ${ PROJECT_DIR }/ PAR / BIN
# Import the design
source ${ PAR_BIN }/ setup.tcl
source ${ PAR_BIN }/ importDesign.tcl
fit
redraw
# Create a floorplan
source ${ PAR_BIN }/ floorplan.tcl
fit
redraw
# Create power/ground distribution lines
source ${ PAR_BIN }/ powerplan.tcl
fit
redraw
# Place standard cells into the core
source ${ PAR_BIN }/ placement.tcl
fit
redraw
# Create the Clock Tree
source ${ PAR_BIN }/ cts.tcl
fit
redraw
# Place Filler Cells and route the design
source ${ PAR_BIN }/ route.tcl
fit
redraw
# Verify Connectivity and Geometry
source ${ PAR_BIN }/ verify.tcl
fit
redraw
# Extract the circuit
source ${ PAR_BIN }/ results.tcl
fit
redraw
APPENDIX B. TOOL SCRIPTS 69