| \section{Yosys by example -- Synthesis} | |
| \begin{frame} | |
| \sectionpage | |
| \end{frame} | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| \subsection{Typical Phases of a Synthesis Flow} | |
| \begin{frame}{\subsecname} | |
| \begin{itemize} | |
| \item Reading and elaborating the design | |
| \item Higher-level synthesis and optimization | |
| \begin{itemize} | |
| \item Converting {\tt always}-blocks to logic and registers | |
| \item Perform coarse-grain optimizations (resource sharing, const folding, ...) | |
| \item Handling of memories and other coarse-grain blocks | |
| \item Extracting and optimizing finite state machines | |
| \end{itemize} | |
| \item Convert remaining logic to bit-level logic functions | |
| \item Perform optimizations on bit-level logic functions | |
| \item Map bit-level logic gates and registers to cell library | |
| \item Write results to output file | |
| \end{itemize} | |
| \end{frame} | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| \subsection{Reading the design} | |
| \begin{frame}[fragile]{\subsecname} | |
| \begin{lstlisting}[xleftmargin=0.5cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] | |
| read_verilog file1.v | |
| read_verilog -I include_dir -D enable_foo -D WIDTH=12 file2.v | |
| read_verilog -lib cell_library.v | |
| verilog_defaults -add -I include_dir | |
| read_verilog file3.v | |
| read_verilog file4.v | |
| verilog_defaults -clear | |
| verilog_defaults -push | |
| verilog_defaults -add -I include_dir | |
| read_verilog file5.v | |
| read_verilog file6.v | |
| verilog_defaults -pop | |
| \end{lstlisting} | |
| \end{frame} | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| \subsection{Design elaboration} | |
| \begin{frame}[fragile]{\subsecname} | |
| During design elaboration Yosys figures out how the modules are hierarchically | |
| connected. It also re-runs the AST parts of the Verilog frontend to create | |
| all needed variations of parametric modules. | |
| \bigskip | |
| \begin{lstlisting}[xleftmargin=0.5cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] | |
| # simplest form. at least this version should be used after reading all input files | |
| # | |
| hierarchy | |
| # recommended form. fails if parts of the design hierarchy are missing, removes | |
| # everything that is unreachable from the top module, and marks the top module. | |
| # | |
| hierarchy -check -top top_module | |
| \end{lstlisting} | |
| \end{frame} | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| \subsection{The {\tt proc} command} | |
| \begin{frame}[fragile]{\subsecname} | |
| The Verilog frontend converts {\tt always}-blocks to RTL netlists for the | |
| expressions and ``processes'' for the control- and memory elements. | |
| \medskip | |
| The {\tt proc} command transforms this ``processes'' to netlists of RTL | |
| multiplexer and register cells. | |
| \medskip | |
| The {\tt proc} command is actually a macro-command that calls the following | |
| other commands: | |
| \begin{lstlisting}[xleftmargin=0.5cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] | |
| proc_clean # remove empty branches and processes | |
| proc_rmdead # remove unreachable branches | |
| proc_init # special handling of "initial" blocks | |
| proc_arst # identify modeling of async resets | |
| proc_mux # convert decision trees to multiplexer networks | |
| proc_dff # extract registers from processes | |
| proc_clean # if all went fine, this should remove all the processes | |
| \end{lstlisting} | |
| \medskip | |
| Many commands can not operate on modules with ``processes'' in them. Usually | |
| a call to {\tt proc} is the first command in the actual synthesis procedure | |
| after design elaboration. | |
| \end{frame} | |
| \begin{frame}[fragile]{\subsecname{} -- Example 1/3} | |
| \begin{columns} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=verilog]{PRESENTATION_ExSyn/proc_01.v} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys, frame=single]{PRESENTATION_ExSyn/proc_01.ys} | |
| \end{columns} | |
| \hfil\includegraphics[width=8cm,trim=0 0cm 0 0cm]{PRESENTATION_ExSyn/proc_01.pdf} | |
| \end{frame} | |
| \begin{frame}[t, fragile]{\subsecname{} -- Example 2/3} | |
| \vbox to 0cm{\includegraphics[width=\linewidth,trim=0cm 0cm 0cm -2.5cm]{PRESENTATION_ExSyn/proc_02.pdf}\vss} | |
| \vskip-1cm | |
| \begin{columns} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=verilog]{PRESENTATION_ExSyn/proc_02.v} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys, frame=single]{PRESENTATION_ExSyn/proc_02.ys} | |
| \end{columns} | |
| \end{frame} | |
| \begin{frame}[t, fragile]{\subsecname{} -- Example 3/3} | |
| \vbox to 0cm{\includegraphics[width=\linewidth,trim=0cm 0cm 0cm -1.5cm]{PRESENTATION_ExSyn/proc_03.pdf}\vss} | |
| \vskip-1cm | |
| \begin{columns} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys, frame=single]{PRESENTATION_ExSyn/proc_03.ys} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=verilog]{PRESENTATION_ExSyn/proc_03.v} | |
| \end{columns} | |
| \end{frame} | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| \subsection{The {\tt opt} command} | |
| \begin{frame}[fragile]{\subsecname} | |
| The {\tt opt} command implements a series of simple optimizations. It also | |
| is a macro command that calls other commands: | |
| \begin{lstlisting}[xleftmargin=0.5cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] | |
| opt_expr # const folding and simple expression rewriting | |
| opt_merge -nomux # merging identical cells | |
| do | |
| opt_muxtree # remove never-active branches from multiplexer tree | |
| opt_reduce # consolidate trees of boolean ops to reduce functions | |
| opt_merge # merging identical cells | |
| opt_rmdff # remove/simplify registers with constant inputs | |
| opt_clean # remove unused objects (cells, wires) from design | |
| opt_expr # const folding and simple expression rewriting | |
| while [changed design] | |
| \end{lstlisting} | |
| The command {\tt clean} can be used as alias for {\tt opt\_clean}. And {\tt ;;} | |
| can be used as shortcut for {\tt clean}. For example: | |
| \begin{lstlisting}[xleftmargin=0.5cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] | |
| proc; opt; memory; opt_expr;; fsm;; | |
| \end{lstlisting} | |
| \end{frame} | |
| \begin{frame}[t, fragile]{\subsecname{} -- Example 1/4} | |
| \vbox to 0cm{\includegraphics[width=\linewidth,trim=0cm 0cm 0cm -0.5cm]{PRESENTATION_ExSyn/opt_01.pdf}\vss} | |
| \vskip-1cm | |
| \begin{columns} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys, frame=single]{PRESENTATION_ExSyn/opt_01.ys} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=verilog]{PRESENTATION_ExSyn/opt_01.v} | |
| \end{columns} | |
| \end{frame} | |
| \begin{frame}[t, fragile]{\subsecname{} -- Example 2/4} | |
| \vbox to 0cm{\includegraphics[width=\linewidth,trim=0cm 0cm 0cm 0cm]{PRESENTATION_ExSyn/opt_02.pdf}\vss} | |
| \vskip-1cm | |
| \begin{columns} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys, frame=single]{PRESENTATION_ExSyn/opt_02.ys} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=verilog]{PRESENTATION_ExSyn/opt_02.v} | |
| \end{columns} | |
| \end{frame} | |
| \begin{frame}[t, fragile]{\subsecname{} -- Example 3/4} | |
| \vbox to 0cm{\includegraphics[width=\linewidth,trim=0cm 0cm 0cm -2cm]{PRESENTATION_ExSyn/opt_03.pdf}\vss} | |
| \vskip-1cm | |
| \begin{columns} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys, frame=single]{PRESENTATION_ExSyn/opt_03.ys} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=verilog]{PRESENTATION_ExSyn/opt_03.v} | |
| \end{columns} | |
| \end{frame} | |
| \begin{frame}[t, fragile]{\subsecname{} -- Example 4/4} | |
| \vbox to 0cm{\hskip6cm\includegraphics[width=6cm,trim=0cm 0cm 0cm -3cm]{PRESENTATION_ExSyn/opt_04.pdf}\vss} | |
| \vskip-1cm | |
| \begin{columns} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=verilog]{PRESENTATION_ExSyn/opt_04.v} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys, frame=single]{PRESENTATION_ExSyn/opt_04.ys} | |
| \end{columns} | |
| \end{frame} | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| \subsection{When to use {\tt opt} or {\tt clean}} | |
| \begin{frame}{\subsecname} | |
| Usually it does not hurt to call {\tt opt} after each regular command in the | |
| synthesis script. But it increases the synthesis time, so it is favourable | |
| to only call {\tt opt} when an improvement can be achieved. | |
| \bigskip | |
| The designs in {\tt yosys-bigsim} are a good playground for experimenting with | |
| the effects of calling {\tt opt} in various places of the flow. | |
| \bigskip | |
| It generally is a good idea to call {\tt opt} before inherently expensive | |
| commands such as {\tt sat} or {\tt freduce}, as the possible gain is much | |
| higher in this cases as the possible loss. | |
| \bigskip | |
| The {\tt clean} command on the other hand is very fast and many commands leave | |
| a mess (dangling signal wires, etc). For example, most commands do not remove | |
| any wires or cells. They just change the connections and depend on a later | |
| call to clean to get rid of the now unused objects. So the occasional {\tt ;;} | |
| is a good idea in every synthesis script. | |
| \end{frame} | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| \subsection{The {\tt memory} command} | |
| \begin{frame}[fragile]{\subsecname} | |
| In the RTL netlist, memory reads and writes are individual cells. This makes | |
| consolidating the number of ports for a memory easier. The {\tt memory} | |
| transforms memories to an implementation. Per default that is logic for address | |
| decoders and registers. It also is a macro command that calls other commands: | |
| \begin{lstlisting}[xleftmargin=0.5cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] | |
| # this merges registers into the memory read- and write cells. | |
| memory_dff | |
| # this collects all read and write cells for a memory and transforms them | |
| # into one multi-port memory cell. | |
| memory_collect | |
| # this takes the multi-port memory cell and transforms it to address decoder | |
| # logic and registers. This step is skipped if "memory" is called with -nomap. | |
| memory_map | |
| \end{lstlisting} | |
| \bigskip | |
| Usually it is preferred to use architecture-specific RAM resources for memory. | |
| For example: | |
| \begin{lstlisting}[xleftmargin=0.5cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] | |
| memory -nomap; techmap -map my_memory_map.v; memory_map | |
| \end{lstlisting} | |
| \end{frame} | |
| \begin{frame}[t, fragile]{\subsecname{} -- Example 1/2} | |
| \vbox to 0cm{\includegraphics[width=0.7\linewidth,trim=0cm 0cm 0cm -10cm]{PRESENTATION_ExSyn/memory_01.pdf}\vss} | |
| \vskip-1cm | |
| \begin{columns} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys, frame=single]{PRESENTATION_ExSyn/memory_01.ys} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=verilog]{PRESENTATION_ExSyn/memory_01.v} | |
| \end{columns} | |
| \end{frame} | |
| \begin{frame}[t, fragile]{\subsecname{} -- Example 2/2} | |
| \vbox to 0cm{\hfill\includegraphics[width=7.5cm,trim=0cm 0cm 0cm -5cm]{PRESENTATION_ExSyn/memory_02.pdf}\vss} | |
| \vskip-1cm | |
| \begin{columns} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{6pt}{8pt}\selectfont, language=verilog]{PRESENTATION_ExSyn/memory_02.v} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys, frame=single]{PRESENTATION_ExSyn/memory_02.ys} | |
| \end{columns} | |
| \end{frame} | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| \subsection{The {\tt fsm} command} | |
| \begin{frame}[fragile]{\subsecname{}} | |
| The {\tt fsm} command identifies, extracts, optimizes (re-encodes), and | |
| re-synthesizes finite state machines. It again is a macro that calls | |
| a series of other commands: | |
| \begin{lstlisting}[xleftmargin=0.5cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] | |
| fsm_detect # unless got option -nodetect | |
| fsm_extract | |
| fsm_opt | |
| clean | |
| fsm_opt | |
| fsm_expand # if got option -expand | |
| clean # if got option -expand | |
| fsm_opt # if got option -expand | |
| fsm_recode # unless got option -norecode | |
| fsm_info | |
| fsm_export # if got option -export | |
| fsm_map # unless got option -nomap | |
| \end{lstlisting} | |
| \end{frame} | |
| \begin{frame}{\subsecname{} -- details} | |
| Some details on the most important commands from the {\tt fsm\_*} group: | |
| \bigskip | |
| The {\tt fsm\_detect} command identifies FSM state registers and marks them | |
| with the {\tt (* fsm\_encoding = "auto" *)} attribute, if they do not have the | |
| {\tt fsm\_encoding} set already. Mark registers with {\tt (* fsm\_encoding = | |
| "none" *)} to disable FSM optimization for a register. | |
| \bigskip | |
| The {\tt fsm\_extract} command replaces the entire FSM (logic and state | |
| registers) with a {\tt \$fsm} cell. | |
| \bigskip | |
| The commands {\tt fsm\_opt} and {\tt fsm\_recode} can be used to optimize the | |
| FSM. | |
| \bigskip | |
| Finally the {\tt fsm\_map} command can be used to convert the (optimized) {\tt | |
| \$fsm} cell back to logic and registers. | |
| \end{frame} | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| \subsection{The {\tt techmap} command} | |
| \begin{frame}[t]{\subsecname} | |
| \vbox to 0cm{\includegraphics[width=12cm,trim=-15cm 0cm 0cm -20cm]{PRESENTATION_ExSyn/techmap_01.pdf}\vss} | |
| \vskip-0.8cm | |
| The {\tt techmap} command replaces cells with implementations given as | |
| verilog source. For example implementing a 32 bit adder using 16 bit adders: | |
| \vbox to 0cm{ | |
| \vskip-0.3cm | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{6pt}{7pt}\selectfont, language=verilog]{PRESENTATION_ExSyn/techmap_01_map.v} | |
| }\vbox to 0cm{ | |
| \vskip-0.5cm | |
| \lstinputlisting[xleftmargin=5cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, frame=single, language=verilog]{PRESENTATION_ExSyn/techmap_01.v} | |
| \lstinputlisting[xleftmargin=5cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys, frame=single]{PRESENTATION_ExSyn/techmap_01.ys} | |
| } | |
| \end{frame} | |
| \begin{frame}[t]{\subsecname{} -- stdcell mapping} | |
| When {\tt techmap} is used without a map file, it uses a built-in map file | |
| to map all RTL cell types to a generic library of built-in logic gates and registers. | |
| \bigskip | |
| \begin{block}{The built-in logic gate types are:} | |
| {\tt \$\_NOT\_ \$\_AND\_ \$\_OR\_ \$\_XOR\_ \$\_MUX\_} | |
| \end{block} | |
| \bigskip | |
| \begin{block}{The register types are:} | |
| {\tt \$\_SR\_NN\_ \$\_SR\_NP\_ \$\_SR\_PN\_ \$\_SR\_PP\_ \\ | |
| \$\_DFF\_N\_ \$\_DFF\_P\_ \\ | |
| \$\_DFF\_NN0\_ \$\_DFF\_NN1\_ \$\_DFF\_NP0\_ \$\_DFF\_NP1\_ \\ | |
| \$\_DFF\_PN0\_ \$\_DFF\_PN1\_ \$\_DFF\_PP0\_ \$\_DFF\_PP1\_ \\ | |
| \$\_DFFSR\_NNN\_ \$\_DFFSR\_NNP\_ \$\_DFFSR\_NPN\_ \$\_DFFSR\_NPP\_ \\ | |
| \$\_DFFSR\_PNN\_ \$\_DFFSR\_PNP\_ \$\_DFFSR\_PPN\_ \$\_DFFSR\_PPP\_ \\ | |
| \$\_DLATCH\_N\_ \$\_DLATCH\_P\_} | |
| \end{block} | |
| \end{frame} | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| \subsection{The {\tt abc} command} | |
| \begin{frame}{\subsecname} | |
| The {\tt abc} command provides an interface to ABC\footnote[frame]{\url{http://www.eecs.berkeley.edu/~alanmi/abc/}}, | |
| an open source tool for low-level logic synthesis. | |
| \medskip | |
| The {\tt abc} command processes a netlist of internal gate types and can perform: | |
| \begin{itemize} | |
| \item logic minimization (optimization) | |
| \item mapping of logic to standard cell library (liberty format) | |
| \item mapping of logic to k-LUTs (for FPGA synthesis) | |
| \end{itemize} | |
| \medskip | |
| Optionally {\tt abc} can process registers from one clock domain and perform | |
| sequential optimization (such as register balancing). | |
| \medskip | |
| ABC is also controlled using scripts. An ABC script can be specified to use | |
| more advanced ABC features. It is also possible to write the design with | |
| {\tt write\_blif} and load the output file into ABC outside of Yosys. | |
| \end{frame} | |
| \begin{frame}[fragile]{\subsecname{} -- Example} | |
| \begin{columns} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=verilog]{PRESENTATION_ExSyn/abc_01.v} | |
| \column[t]{5cm} | |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys, frame=single]{PRESENTATION_ExSyn/abc_01.ys} | |
| \end{columns} | |
| \includegraphics[width=\linewidth,trim=0 0cm 0 0cm]{PRESENTATION_ExSyn/abc_01.pdf} | |
| \end{frame} | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| \subsection{Other special-purpose mapping commands} | |
| \begin{frame}{\subsecname} | |
| \begin{block}{\tt dfflibmap} | |
| This command maps the internal register cell types to the register types | |
| described in a liberty file. | |
| \end{block} | |
| \bigskip | |
| \begin{block}{\tt hilomap} | |
| Some architectures require special driver cells for driving a constant hi or lo | |
| value. This command replaces simple constants with instances of such driver cells. | |
| \end{block} | |
| \bigskip | |
| \begin{block}{\tt iopadmap} | |
| Top-level input/outputs must usually be implemented using special I/O-pad cells. | |
| This command inserts this cells to the design. | |
| \end{block} | |
| \end{frame} | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| \subsection{Example Synthesis Script} | |
| \begin{frame}[fragile]{\subsecname} | |
| \begin{columns} | |
| \column[t]{4cm} | |
| \begin{lstlisting}[basicstyle=\ttfamily\fontsize{6pt}{7pt}\selectfont, language=ys] | |
| # read and elaborate design | |
| read_verilog cpu_top.v cpu_ctrl.v cpu_regs.v | |
| read_verilog -D WITH_MULT cpu_alu.v | |
| hierarchy -check -top cpu_top | |
| # high-level synthesis | |
| proc; opt; fsm;; memory -nomap; opt | |
| # substitute block rams | |
| techmap -map map_rams.v | |
| # map remaining memories | |
| memory_map | |
| # low-level synthesis | |
| techmap; opt; flatten;; abc -lut6 | |
| techmap -map map_xl_cells.v | |
| # add clock buffers | |
| select -set xl_clocks t:FDRE %x:+FDRE[C] t:FDRE %d | |
| iopadmap -inpad BUFGP O:I @xl_clocks | |
| # add io buffers | |
| select -set xl_nonclocks w:* t:BUFGP %x:+BUFGP[I] %d | |
| iopadmap -outpad OBUF I:O -inpad IBUF O:I @xl_nonclocks | |
| # write synthesis results | |
| write_edif synth.edif | |
| \end{lstlisting} | |
| \column[t]{6cm} | |
| \vskip1cm | |
| \begin{block}{Teaser / Outlook} | |
| \small\parbox{6cm}{ | |
| The weird {\tt select} expressions at the end of this script are discussed in | |
| the next part (Section 3, ``Advanced Synthesis'') of this presentation.} | |
| \end{block} | |
| \end{columns} | |
| \end{frame} | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| \subsection{Summary} | |
| \begin{frame}{\subsecname} | |
| \begin{itemize} | |
| \item Yosys provides commands for each phase of the synthesis. | |
| \item Each command solves a (more or less) simple problem. | |
| \item Complex commands are often only front-ends to simple commands. | |
| \item {\tt proc; opt; fsm; opt; memory; opt; techmap; opt; abc;;} | |
| \end{itemize} | |
| \bigskip | |
| \bigskip | |
| \begin{center} | |
| Questions? | |
| \end{center} | |
| \bigskip | |
| \bigskip | |
| \begin{center} | |
| \url{http://www.clifford.at/yosys/} | |
| \end{center} | |
| \end{frame} | |