Cadence Encounter Flow Management System (FMS)
For any medium to large chip, design management is just as important as the design itself. Keeping the flow and files organized is a must if you have tough timing challenges and need to keep a number different runs for comparison. And once you have a a dozen or so flow scripts, how do you manage them? How can you easily reuse them in the next project? And shouldn't there be scripts that came with Encounter that we could leverage?
The answer to all these questions is the Encounter Flow Management System, introduced with Encounter 4.2. It is a generic framework for managing any design flow. And it comes with one such flow ready to go, the Encounter ICDFLOW, which is a complete implementation of the Encounter timing closure flow.
In this tutorial we will take a small design and process it using FMS. We will see how to import a design into FMS, how to choose which steps to run and how to collect results from FMS, all without ever manually running Encounter.
The design data is in the following tar file. The file also includes slow and fast library corners, since the OSU library currently only includes a typical corner. But note that these are not real corners, they are just renamed copies of the existing OSU corner.
First we will un-tar the design file and perform synthesis using PKS, as usual:
tar xzf fms.tgz
pks_shell -f compile_bgx.scr
The output from PKS should look like this:
FMS will use our Encounter config file "encounter.conf" to get information about our library setup. So we will bring up Encounter and read in our config file, just to make sure its valid. This will be the only time we run Encounter manually.
In Encounter, do "Design -> Import" and load in "encounter.conf" into the dialog:
Then hit OK and load in the configuration. The Encounter command window should look like this. Any Errors should be corrected (typically wrong path names etc.). Then exit Encounter.
FMS Design Setup
Now we start FMS. We will start it in the folder "fms". That way we have our source data in "fms/synth" and FMS will create the run data in "fms/nrdcore". (Nrdcore is the toplevel name of the demo design).
(assuming we are in the folder "synth")
The FMS will look like this:
The first thing we do is to load a flow. FMS itself is just a framework, it supports any flow. Encounter comes with the ICDFLOW, that is the one we will use. Do "Flow-> Import". The "ICDFLOW" should already be selected:
After the ICDFLOW is loaded the FMS will show the flow steps:
The ICDFLOW is actually not just one flow, but many flows. We will use 3 of them: Design Setup, Prototyping and Block Implementation.
Do "Flow -> Select Flow" and select "Design Setup":
Now that we have the correct flow we will start a run with that flow. Do "Run -> New" and enter "nrdcore" as the design name and "run.setup" as the run name. The design name is the toplevel name of the design. The run name can be anything:
Once the run is created we can do "Run -> Generate & Run Script".This will create the tcl scripts for the run and execute them using Encounter.
Design setup is naturally interactive, since we need to tell the flow where our design is located and what its components are. Later the flow will run all automated.
The first part of the flow is to load in our config file so the flow can evaluate it. In order to load the config file we need to change the directory to "flow/synth", where it is located. In the Encounter command window, enter:
The "pwd" command should confirm that you are in the "synth" folder. Now we can load the config file. In the big Encounter import dialog, load in the config file "encounter.conf".
Now hit OK in the Import dialog. When Encounter has loaded the file the command window should look like this:
This concludes this step. In the Encounter menu bar, on the far right, should be an "ICDFLOW" menu. Do "ICDFLOW -> Save and return to FMS".
The second step in the flow is also interactive. Now that we have loaded the config file we could select any other components as well. For example if we had a floorplan we could select it here, or a scan-chain DEF file.
In this case we have no extra files to load, so all we do is hit "OK" to close the dialog. Now the flow is finished.
Back in the FMS window we can now see that both steps are colored "green", meaning they are completed with no errors. It may take some seconds for the colors to refresh. You can do "Run -> Refresh" to update the status colors.
In this step we will create the floorplan for our design and run initial timing analysis to get a feel for the wire delays in the design. The flow is also able to insert a power mesh and run power analysis but we will not use this, since our library is not setup for this.
To select the prototyping flow do "Flow -> Select Flow" and select "Flat Virtual Prototyping":
Create a new run using "Run->New":
To begin we will only run 2 steps. Once those are finished we will run the rest of the flow. To select which steps to run, click with the right right mouse button on the header row of our run and select "Configure". Now we can select the steps we want. Only select "Preplace STA" and "Initial Floorplan":
Now we see that only those two steps are enabled:
To start the flow, do "Run -> Generate & Run Script". The timing analysis step is automated. Once we get to the floorplan step we are back in interactive mode. FMS stops at the dialog to initialize the floorplan. We will keep all the default values, but enter "30" for the 4 "Core to Boundary" values:
Next we add power rings. Do "Floorplan -> Custom Power Planning -> Add Rings..." and change the width to "4.5" and select "Center in Channel":
Finally we will route the power nets with Sroute. Do "Route -> Sroute" and accept all the defaults, just hit OK. We will see the final routed floorplan:
Now we can end the interactive step. Do "ICDFLOW -> Save & Return to FMS". Now we can run the remainder of the flow, which is automated. Click again with the right mouse button in the header and select "Configure". Select "Detail Place" and "Release Floorplan":
"Detail Place" will place design. This placement will not actually be saved. It would only be used for the Power Analysis step. We run it here just for practice. The "Release Floorplan" step will take our floorplan and store it in the "nrdcore/source" folder. That way we can easily reuse the floorplan later on. And the block implementation flow will also expect the floorplan in that location:
At this point we have 2 steps finished and 2 more to go:
Select "Run -> Generate & Run Script". Now the 2 steps we selected will run and the floorplan will be written out. Once finished, both steps should turn green. This concludes the prototyping flow.
Now we have the design setup and created a working floorplan. Ready for block implementation! This is where we actually place and route the design.
Do "Flow -> Select Flow" and select "Flat Block Implementation":
Next do "Run -> New":
Finally, click with the right mouse button in the header and do "Configure". Select the steps as shown below. We will skip all of the Power Analysis and SI related steps, due to library reasons.
There is one more step we have to select. It is part of "Clock Synthesis". In the main window, click the "+" next to "Clock Synthesis" and you should see "Create Spec" is disabled. We need this step to create a clock tree configuration for us. Click with the right mouse button on "CREATE_SPEC" and select "Enable Step". Now the window should look like this:
All good to go, select "Run -> Generate & Run Scripts". The complete flow will run, step by step. Completed steps will turn green. In the end all steps should be green:
Now lets see how we did in terms of timing. Click with the right mouse button on "POSTROUTE_OPT" and select "View Results". There are 3 tabs, select the middle tab for "Setup". We see that we have 5.475ns of slack. We also see slack details for different path groups. Each step in the flow has lots of information for us to evaluate.
Now let's look at our final design. We can look at the design after each step if we wanted to. Click with the right mouse button on "SIGNOFF VERIFY" and select "View Design -> Encounter".
Now close down Encounter and FMS. All our data has been stored on the disk. And all our step information has been stored in the FMS database. We could run "flowMgr" again and it would restore all our runs.
Let's take a final look at our files:
Besides the log files from FMS we see 3 items: Our initial data in "synth", the FMS data in "nrdcore" and the FMS database in "steps.db".
Inside the "nrdcore" folder we see a folder for each run we did. In addition we see "source", which was created from the data we selected during "Design Setup". In the future we could just overwrite the files in the "source" folder, e.g. if we get a new netlist from synthesis. No need to run the "Design Setup" flow again.
This concludes the FMS tutorial. We saw how we can use Encounter's FMS to easily manage even complex designs. The ICDFLOW contains all the steps we need for most designs. We select the steps we need and run them automatically. Then we just look at the results we achieved. We can do as many runs as we wish and still have everything organized neatly by FMS.