| |
| \section{Introduction to Yosys} |
| |
| \begin{frame} |
| \sectionpage |
| \end{frame} |
| |
| \iffalse |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Representations of (digital) Circuits} |
| |
| \begin{frame}[t]{\subsecname} |
| \begin{itemize} |
| \item Graphical |
| \begin{itemize} |
| \item \alert<1>{Schematic Diagram} |
| \item \alert<2>{Physical Layout} |
| \end{itemize} |
| \bigskip |
| \item Non-graphical |
| \begin{itemize} |
| \item \alert<3>{Netlists} |
| \item \alert<4>{Hardware Description Languages (HDLs)} |
| \end{itemize} |
| \end{itemize} |
| \bigskip |
| \begin{block}{Definition: |
| \only<1>{Schematic Diagram}% |
| \only<2>{Physical Layout}% |
| \only<3>{Netlists}% |
| \only<4>{Hardware Description Languages (HDLs)}} |
| \only<1>{ |
| Graphical representation of the circuit topology. Circuit elements |
| are represented by symbols and electrical connections by lines. The geometric |
| layout is for readability only. |
| }% |
| \only<2>{ |
| The actual physical geometry of the device (PCB or ASIC manufacturing masks). |
| This is the final product of the design process. |
| }% |
| \only<3>{ |
| A list of circuit elements and a list of connections. This is the raw circuit |
| topology. |
| }% |
| \only<4>{ |
| Computer languages (like programming languages) that can be used to describe |
| circuits. HDLs are much more powerful in describing huge circuits than |
| schematic diagrams. |
| }% |
| \end{block} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| \fi |
| |
| \subsection{Levels of Abstraction for Digital Circuits} |
| |
| \begin{frame}[t]{\subsecname} |
| \begin{itemize} |
| \item \alert<1>{System Level} |
| \item \alert<2>{High Level} |
| \item \alert<3>{Behavioral Level} |
| \item \alert<4>{Register-Transfer Level (RTL)} |
| \item \alert<5>{Logical Gate Level} |
| \item \alert<6>{Physical Gate Level} |
| \item \alert<7>{Switch Level} |
| \end{itemize} |
| \bigskip |
| \begin{block}{Definition: |
| \only<1>{System Level}% |
| \only<2>{High Level}% |
| \only<3>{Behavioral Level}% |
| \only<4>{Register-Transfer Level (RTL)}% |
| \only<5>{Logical Gate Level}% |
| \only<6>{Physical Gate Level}% |
| \only<7>{Switch Level}} |
| \only<1>{ |
| Overall view of the circuit. E.g. block-diagrams or instruction-set architecture descriptions. |
| }% |
| \only<2>{ |
| Functional implementation of circuit in high-level programming language (C, C++, SystemC, Matlab, Python, etc.). |
| }% |
| \only<3>{ |
| Cycle-accurate description of circuit in hardware description language (Verilog, VHDL, etc.). |
| }% |
| \only<4>{ |
| List of registers (flip-flops) and logic functions that calculate the next state from the previous one. Usually |
| a netlist utilizing high-level cells such as adders, multipliers, multiplexer, etc. |
| }% |
| \only<5>{ |
| Netlist of single-bit registers and basic logic gates (such as AND, OR, |
| NOT, etc.). Popular form: And-Inverter-Graphs (AIGs) with pairs of primary |
| inputs and outputs for each register bit. |
| }% |
| \only<6>{ |
| Netlist of cells that actually are available on the target architecture |
| (such as CMOS gates in an ASIC or LUTs in an FPGA). Optimized for |
| area, power, and/or speed (static timing or number of logic levels). |
| }% |
| \only<7>{ |
| Netlist of individual transistors. |
| }% |
| \end{block} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Digital Circuit Synthesis} |
| |
| \begin{frame}{\subsecname} |
| Synthesis Tools (such as Yosys) can transform HDL code to circuits: |
| |
| \bigskip |
| \begin{center} |
| \begin{tikzpicture}[scale=0.8, every node/.style={transform shape}] |
| \tikzstyle{lvl} = [draw, fill=MyBlue, rectangle, minimum height=2em, minimum width=15em] |
| \node[lvl] (sys) {System Level}; |
| \node[lvl] (hl) [below of=sys] {High Level}; |
| \node[lvl] (beh) [below of=hl] {Behavioral Level}; |
| \node[lvl] (rtl) [below of=beh] {Register-Transfer Level (RTL)}; |
| \node[lvl] (lg) [below of=rtl] {Logical Gate Level}; |
| \node[lvl] (pg) [below of=lg] {Physical Gate Level}; |
| \node[lvl] (sw) [below of=pg] {Switch Level}; |
| |
| \draw[dotted] (sys.east) -- ++(1,0) coordinate (sysx); |
| \draw[dotted] (hl.east) -- ++(1,0) coordinate (hlx); |
| \draw[dotted] (beh.east) -- ++(1,0) coordinate (behx); |
| \draw[dotted] (rtl.east) -- ++(1,0) coordinate (rtlx); |
| \draw[dotted] (lg.east) -- ++(1,0) coordinate (lgx); |
| \draw[dotted] (pg.east) -- ++(1,0) coordinate (pgx); |
| \draw[dotted] (sw.east) -- ++(1,0) coordinate (swx); |
| |
| \draw[gray,|->] (sysx) -- node[right] {System Design} (hlx); |
| \draw[|->|] (hlx) -- node[right] {High Level Synthesis (HLS)} (behx); |
| \draw[->|] (behx) -- node[right] {Behavioral Synthesis} (rtlx); |
| \draw[->|] (rtlx) -- node[right] {RTL Synthesis} (lgx); |
| \draw[->|] (lgx) -- node[right] {Logic Synthesis} (pgx); |
| \draw[gray,->|] (pgx) -- node[right] {Cell Library} (swx); |
| |
| \draw[dotted] (behx) -- ++(4,0) coordinate (a); |
| \draw[dotted] (pgx) -- ++(4,0) coordinate (b); |
| \draw[|->|] (a) -- node[right] {Yosys} (b); |
| \end{tikzpicture} |
| \end{center} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{What Yosys can and can't do} |
| |
| \begin{frame}{\subsecname} |
| |
| Things Yosys can do: |
| \begin{itemize} |
| \item Read and process (most of) modern Verilog-2005 code. |
| \item Perform all kinds of operations on netlist (RTL, Logic, Gate). |
| \item Perform logic optimizations and gate mapping with ABC\footnote[frame]{\url{http://www.eecs.berkeley.edu/~alanmi/abc/}}. |
| \end{itemize} |
| |
| \bigskip |
| Things Yosys can't do: |
| \begin{itemize} |
| \item Process high-level languages such as C/C++/SystemC. |
| \item Create physical layouts (place\&route). |
| \end{itemize} |
| |
| \bigskip |
| A typical flow combines Yosys with with a low-level implementation tool, such |
| as Qflow\footnote[frame]{\url{http://opencircuitdesign.com/qflow/}} for ASIC designs. |
| |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Yosys Data- and Control-Flow} |
| |
| \begin{frame}{\subsecname} |
| A (usually short) synthesis script controls Yosys. |
| |
| This scripts contain three types of commands: |
| \begin{itemize} |
| \item {\bf Frontends}, that read input files (usually Verilog). |
| \item {\bf Passes}, that perform transformations on the design in memory. |
| \item {\bf Backends}, that write the design in memory to a file (various formats are available: Verilog, BLIF, EDIF, SPICE, BTOR, \dots). |
| \end{itemize} |
| |
| \bigskip |
| \begin{center} |
| \begin{tikzpicture}[scale=0.6, every node/.style={transform shape}] |
| \path (-1.5,3) coordinate (cursor); |
| \draw[-latex] ($ (cursor) + (0,-1.5) $) -- ++(1,0); |
| \draw[fill=orange!10] ($ (cursor) + (1,-3) $) rectangle node[rotate=90] {Frontend} ++(1,3) coordinate (cursor); |
| \draw[-latex] ($ (cursor) + (0,-1.5) $) -- ++(1,0); |
| \draw[fill=green!10] ($ (cursor) + (1,-3) $) rectangle node[rotate=90] {Pass} ++(1,3) coordinate (cursor); |
| \draw[-latex] ($ (cursor) + (0,-1.5) $) -- ++(1,0); |
| \draw[fill=green!10] ($ (cursor) + (1,-3) $) rectangle node[rotate=90] {Pass} ++(1,3) coordinate (cursor); |
| \draw[-latex] ($ (cursor) + (0,-1.5) $) -- ++(1,0); |
| \draw[fill=green!10] ($ (cursor) + (1,-3) $) rectangle node[rotate=90] {Pass} ++(1,3) coordinate (cursor); |
| \draw[-latex] ($ (cursor) + (0,-1.5) $) -- ++(1,0); |
| \draw[fill=orange!10] ($ (cursor) + (1,-3) $) rectangle node[rotate=90] {Backend} ++(1,3) coordinate (cursor); |
| \draw[-latex] ($ (cursor) + (0,-1.5) $) -- ++(1,0); |
| |
| \path (-3,-0.5) coordinate (cursor); |
| \draw (cursor) -- node[below] {HDL} ++(3,0) coordinate (cursor); |
| \draw[|-|] (cursor) -- node[below] {Internal Format (RTLIL)} ++(8,0) coordinate (cursor); |
| \draw (cursor) -- node[below] {Netlist} ++(3,0); |
| |
| \path (-3,3.5) coordinate (cursor); |
| \draw[-] (cursor) -- node[above] {High-Level} ++(3,0) coordinate (cursor); |
| \draw[-] (cursor) -- ++(8,0) coordinate (cursor); |
| \draw[->] (cursor) -- node[above] {Low-Level} ++(3,0); |
| \end{tikzpicture} |
| \end{center} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Program Components and Data Formats} |
| |
| \begin{frame}{\subsecname} |
| \begin{center} |
| \begin{tikzpicture}[scale=0.6, every node/.style={transform shape}] |
| \tikzstyle{process} = [draw, fill=green!10, rectangle, minimum height=3em, minimum width=10em, node distance=15em] |
| \tikzstyle{data} = [draw, fill=blue!10, ellipse, minimum height=3em, minimum width=7em, node distance=15em] |
| \node[process] (vlog) {Verilog Frontend}; |
| \node[process, dashed, fill=green!5] (vhdl) [right of=vlog] {VHDL Frontend}; |
| \node[process] (ilang) [right of=vhdl] {Other Frontends}; |
| \node[data] (ast) [below of=vlog, node distance=5em, xshift=7.5em] {AST}; |
| \node[process] (astfe) [below of=ast, node distance=5em] {AST Frontend}; |
| \node[data] (rtlil) [below of=astfe, node distance=5em, xshift=7.5em] {RTLIL}; |
| \node[process] (pass) [right of=rtlil, node distance=5em, xshift=7.5em] {Passes}; |
| \node[process] (vlbe) [below of=rtlil, node distance=7em, xshift=-13em] {Verilog Backend}; |
| \node[process] (ilangbe) [below of=rtlil, node distance=7em, xshift=0em] {ILANG Backend}; |
| \node[process, fill=green!5] (otherbe) [below of=rtlil, node distance=7em, xshift=+13em] {Other Backends}; |
| |
| \draw[-latex] (vlog) -- (ast); |
| \draw[-latex] (vhdl) -- (ast); |
| \draw[-latex] (ast) -- (astfe); |
| \draw[-latex] (astfe) -- (rtlil); |
| \draw[-latex] (ilang) -- (rtlil); |
| \draw[latex-latex] (rtlil) -- (pass); |
| \draw[-latex] (rtlil) -- (vlbe); |
| \draw[-latex] (rtlil) -- (ilangbe); |
| \draw[-latex] (rtlil) -- (otherbe); |
| \end{tikzpicture} |
| \end{center} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Example Project} |
| |
| \begin{frame}[t]{\subsecname} |
| The following slides cover an example project. This project contains three files: |
| \begin{itemize} |
| \item A simple ASIC synthesis script |
| \item A digital design written in Verilog |
| \item A simple CMOS cell library |
| \end{itemize} |
| \vfill |
| Direct link to the files: \\ \footnotesize |
| \url{https://github.com/cliffordwolf/yosys/tree/master/manual/PRESENTATION_Intro} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \begin{frame}[t]{\subsecname{} -- Synthesis Script} |
| |
| \setbeamercolor{alerted text}{fg=white,bg=red} |
| |
| \begin{minipage}[t]{6cm} |
| \tt\scriptsize |
| {\color{YosysGreen}\# read design}\\ |
| \boxalert<1>{read\_verilog counter.v}\\ |
| \boxalert<2>{hierarchy -check -top counter} |
| |
| \medskip |
| {\color{YosysGreen}\# the high-level stuff}\\ |
| \boxalert<3>{proc}; \boxalert<4>{opt}; \boxalert<5>{fsm}; \boxalert<6>{opt}; \boxalert<7>{memory}; \boxalert<8>{opt} |
| |
| \medskip |
| {\color{YosysGreen}\# mapping to internal cell library}\\ |
| \boxalert<9>{techmap}; \boxalert<10>{opt} |
| \end{minipage} |
| \begin{minipage}[t]{5cm} |
| \tt\scriptsize |
| {\color{YosysGreen}\# mapping flip-flops to mycells.lib}\\ |
| \boxalert<11>{dfflibmap -liberty mycells.lib} |
| |
| \medskip |
| {\color{YosysGreen}\# mapping logic to mycells.lib}\\ |
| \boxalert<12>{abc -liberty mycells.lib} |
| |
| \medskip |
| {\color{YosysGreen}\# cleanup}\\ |
| \boxalert<13>{clean} |
| |
| \medskip |
| {\color{YosysGreen}\# write synthesized design}\\ |
| \boxalert<14>{write\_verilog synth.v} |
| \end{minipage} |
| |
| \vskip1cm |
| |
| \begin{block}{Command: \tt |
| \only<1>{read\_verilog counter.v}% |
| \only<2>{hierarchy -check -top counter}% |
| \only<3>{proc}% |
| \only<4>{opt}% |
| \only<5>{fsm}% |
| \only<6>{opt}% |
| \only<7>{memory}% |
| \only<8>{opt}% |
| \only<9>{techmap}% |
| \only<10>{opt}% |
| \only<11>{dfflibmap -liberty mycells.lib}% |
| \only<12>{abc -liberty mycells.lib}% |
| \only<13>{clean}% |
| \only<14>{write\_verilog synth.v}} |
| \only<1>{ |
| Read Verilog source file and convert to internal representation. |
| }% |
| \only<2>{ |
| Elaborate the design hierarchy. Should always be the first |
| command after reading the design. Can re-run AST front-end. |
| }% |
| \only<3>{ |
| Convert ``processes'' (the internal representation of behavioral |
| Verilog code) into multiplexers and registers. |
| }% |
| \only<4>{ |
| Perform some basic optimizations and cleanups. |
| }% |
| \only<5>{ |
| Analyze and optimize finite state machines. |
| }% |
| \only<6>{ |
| Perform some basic optimizations and cleanups. |
| }% |
| \only<7>{ |
| Analyze memories and create circuits to implement them. |
| }% |
| \only<8>{ |
| Perform some basic optimizations and cleanups. |
| }% |
| \only<9>{ |
| Map coarse-grain RTL cells (adders, etc.) to fine-grain |
| logic gates (AND, OR, NOT, etc.). |
| }% |
| \only<10>{ |
| Perform some basic optimizations and cleanups. |
| }% |
| \only<11>{ |
| Map registers to available hardware flip-flops. |
| }% |
| \only<12>{ |
| Map logic to available hardware gates. |
| }% |
| \only<13>{ |
| Clean up the design (just the last step of {\tt opt}). |
| }% |
| \only<14>{ |
| Write final synthesis result to output file. |
| }% |
| \end{block} |
| |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \begin{frame}[fragile]{\subsecname{} -- Verilog Source: \tt counter.v} |
| \lstinputlisting[xleftmargin=1cm, language=Verilog]{PRESENTATION_Intro/counter.v} |
| \end{frame} |
| |
| \begin{frame}[fragile]{\subsecname{} -- Cell Library: \tt mycells.lib} |
| \begin{columns} |
| \column[t]{5cm} |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=liberty, lastline=20]{PRESENTATION_Intro/mycells.lib} |
| \column[t]{5cm} |
| \lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=liberty, firstline=21]{PRESENTATION_Intro/mycells.lib} |
| \end{columns} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Running the Synthesis Script} |
| |
| \begin{frame}[t, fragile]{\subsecname{} -- Step 1/4} |
| \begin{verbatim} |
| read_verilog counter.v |
| hierarchy -check -top counter |
| \end{verbatim} |
| |
| \vfill |
| \includegraphics[width=\linewidth,trim=0 0cm 0 0cm]{PRESENTATION_Intro/counter_00.pdf} |
| \end{frame} |
| |
| \begin{frame}[t, fragile]{\subsecname{} -- Step 2/4} |
| \begin{verbatim} |
| proc; opt; fsm; opt; memory; opt |
| \end{verbatim} |
| |
| \vfill |
| \includegraphics[width=\linewidth,trim=0 0cm 0 0cm]{PRESENTATION_Intro/counter_01.pdf} |
| \end{frame} |
| |
| \begin{frame}[t, fragile]{\subsecname{} -- Step 3/4} |
| \begin{verbatim} |
| techmap; opt |
| \end{verbatim} |
| |
| \vfill |
| \includegraphics[width=\linewidth,trim=0 0cm 0 2cm]{PRESENTATION_Intro/counter_02.pdf} |
| \end{frame} |
| |
| \begin{frame}[t, fragile]{\subsecname{} -- Step 4/4} |
| \begin{verbatim} |
| dfflibmap -liberty mycells.lib |
| abc -liberty mycells.lib |
| clean |
| \end{verbatim} |
| |
| \vfill\hfil |
| \includegraphics[width=10cm,trim=0 0cm 0 0cm]{PRESENTATION_Intro/counter_03.pdf} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{The synth command} |
| |
| \begin{frame}[fragile]{\subsecname{}} |
| Yosys contains a default (recommended example) synthesis script in form of the |
| {\tt synth} command. The following commands are executed by this synthesis command: |
| |
| \begin{columns} |
| \column[t]{5cm} |
| \begin{lstlisting}[xleftmargin=1cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] |
| begin: |
| hierarchy -check [-top <top>] |
| |
| coarse: |
| proc |
| opt |
| wreduce |
| alumacc |
| share |
| opt |
| fsm |
| opt -fast |
| memory -nomap |
| opt_clean |
| \end{lstlisting} |
| \column[t]{5cm} |
| \begin{lstlisting}[xleftmargin=1cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] |
| fine: |
| opt -fast -full |
| memory_map |
| opt -full |
| techmap |
| opt -fast |
| |
| abc: |
| abc -fast |
| opt -fast |
| \end{lstlisting} |
| \end{columns} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Yosys Commands} |
| |
| \begin{frame}[fragile]{\subsecname{} 1/3 \hspace{0pt plus 1 filll} (excerpt)} |
| Command reference: |
| \begin{itemize} |
| \item Use ``{\tt help}'' for a command list and ``{\tt help \it command}'' for details. |
| \item Or run ``{\tt yosys -H}'' or ``{\tt yosys -h \it command}''. |
| \item Or go to \url{http://www.clifford.at/yosys/documentation.html}. |
| \end{itemize} |
| |
| \bigskip |
| Commands for design navigation and investigation: |
| \begin{lstlisting}[xleftmargin=1cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] |
| cd # a shortcut for 'select -module <name>' |
| ls # list modules or objects in modules |
| dump # print parts of the design in ilang format |
| show # generate schematics using graphviz |
| select # modify and view the list of selected objects |
| \end{lstlisting} |
| |
| \bigskip |
| Commands for executing scripts or entering interactive mode: |
| \begin{lstlisting}[xleftmargin=1cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] |
| shell # enter interactive command mode |
| history # show last interactive commands |
| script # execute commands from script file |
| tcl # execute a TCL script file |
| \end{lstlisting} |
| \end{frame} |
| |
| \begin{frame}[fragile]{\subsecname{} 2/3 \hspace{0pt plus 1 filll} (excerpt)} |
| Commands for reading and elaborating the design: |
| \begin{lstlisting}[xleftmargin=1cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] |
| read_ilang # read modules from ilang file |
| read_verilog # read modules from Verilog file |
| hierarchy # check, expand and clean up design hierarchy |
| \end{lstlisting} |
| |
| \bigskip |
| Commands for high-level synthesis: |
| \begin{lstlisting}[xleftmargin=1cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] |
| proc # translate processes to netlists |
| fsm # extract and optimize finite state machines |
| memory # translate memories to basic cells |
| opt # perform simple optimizations |
| \end{lstlisting} |
| |
| \bigskip |
| Commands for technology mapping: |
| \begin{lstlisting}[xleftmargin=1cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] |
| techmap # generic technology mapper |
| abc # use ABC for technology mapping |
| dfflibmap # technology mapping of flip-flops |
| hilomap # technology mapping of constant hi- and/or lo-drivers |
| iopadmap # technology mapping of i/o pads (or buffers) |
| flatten # flatten design |
| \end{lstlisting} |
| \end{frame} |
| |
| \begin{frame}[fragile]{\subsecname{} 3/3 \hspace{0pt plus 1 filll} (excerpt)} |
| Commands for writing the results: |
| \begin{lstlisting}[xleftmargin=1cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] |
| write_blif # write design to BLIF file |
| write_btor # write design to BTOR file |
| write_edif # write design to EDIF netlist file |
| write_ilang # write design to ilang file |
| write_spice # write design to SPICE netlist file |
| write_verilog # write design to Verilog file |
| \end{lstlisting} |
| |
| \bigskip |
| Script-Commands for standard synthesis tasks: |
| \begin{lstlisting}[xleftmargin=1cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] |
| synth # generic synthesis script |
| synth_xilinx # synthesis for Xilinx FPGAs |
| \end{lstlisting} |
| |
| \bigskip |
| Commands for model checking: |
| \begin{lstlisting}[xleftmargin=1cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys] |
| sat # solve a SAT problem in the circuit |
| miter # automatically create a miter circuit |
| scc # detect strongly connected components (logic loops) |
| \end{lstlisting} |
| |
| \bigskip |
| ... and many many more. |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{More Verilog Examples} |
| |
| \begin{frame}[fragile]{\subsecname{} 1/3} |
| \begin{lstlisting}[xleftmargin=1cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=Verilog] |
| module detectprime(a, y); |
| input [4:0] a; |
| output y; |
| |
| integer i, j; |
| reg [31:0] lut; |
| |
| initial begin |
| for (i = 0; i < 32; i = i+1) begin |
| lut[i] = i > 1; |
| for (j = 2; j*j <= i; j = j+1) |
| if (i % j == 0) |
| lut[i] = 0; |
| end |
| end |
| |
| assign y = lut[a]; |
| endmodule |
| \end{lstlisting} |
| \end{frame} |
| |
| \begin{frame}[fragile]{\subsecname{} 2/3} |
| \begin{lstlisting}[xleftmargin=1cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=Verilog] |
| module carryadd(a, b, y); |
| parameter WIDTH = 8; |
| input [WIDTH-1:0] a, b; |
| output [WIDTH-1:0] y; |
| |
| genvar i; |
| generate |
| for (i = 0; i < WIDTH; i = i+1) begin:STAGE |
| wire IN1 = a[i], IN2 = b[i]; |
| wire C, Y; |
| if (i == 0) |
| assign C = IN1 & IN2, Y = IN1 ^ IN2; |
| else |
| assign C = (IN1 & IN2) | ((IN1 | IN2) & STAGE[i-1].C), |
| Y = IN1 ^ IN2 ^ STAGE[i-1].C; |
| assign y[i] = Y; |
| end |
| endgenerate |
| endmodule |
| \end{lstlisting} |
| \end{frame} |
| |
| \begin{frame}[fragile]{\subsecname{} 3/3} |
| \begin{lstlisting}[xleftmargin=1cm, basicstyle=\ttfamily\fontsize{7pt}{8.5pt}\selectfont, language=Verilog] |
| module cam(clk, wr_enable, wr_addr, wr_data, rd_data, rd_addr, rd_match); |
| parameter WIDTH = 8; |
| parameter DEPTH = 16; |
| localparam ADDR_BITS = $clog2(DEPTH-1); |
| |
| input clk, wr_enable; |
| input [ADDR_BITS-1:0] wr_addr; |
| input [WIDTH-1:0] wr_data, rd_data; |
| output reg [ADDR_BITS-1:0] rd_addr; |
| output reg rd_match; |
| |
| integer i; |
| reg [WIDTH-1:0] mem [0:DEPTH-1]; |
| |
| always @(posedge clk) begin |
| rd_addr <= 'bx; |
| rd_match <= 0; |
| for (i = 0; i < DEPTH; i = i+1) |
| if (mem[i] == rd_data) begin |
| rd_addr <= i; |
| rd_match <= 1; |
| end |
| if (wr_enable) |
| mem[wr_addr] <= wr_data; |
| end |
| endmodule |
| \end{lstlisting} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Currently unsupported Verilog-2005 language features} |
| |
| \begin{frame}{\subsecname} |
| \begin{itemize} |
| \item Tri-state logic |
| \item The wor/wand wire types (maybe for 0.5) |
| \item Latched logic (is synthesized as logic with feedback loops) |
| \item Some non-synthesizable features that should be ignored in synthesis are not supported by the parser and cause a parser error (file a bug report if you encounter this problem) |
| \end{itemize} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Verification of Yosys} |
| |
| \begin{frame}{\subsecname} |
| Continuously checking the correctness of Yosys and making sure that new features |
| do not break old ones is a high priority in Yosys. |
| |
| \bigskip |
| Two external test suites have been built for Yosys: VlogHammer and yosys-bigsim |
| (see next slides) |
| |
| \bigskip |
| In addition to that, yosys comes with $\approx\!200$ test cases used in ``{\tt make test}''. |
| |
| \bigskip |
| A debug build of Yosys also contains a lot of asserts and checks the integrity of |
| the internal state after each command. |
| \end{frame} |
| |
| \begin{frame}[fragile]{\subsecname{} -- VlogHammer} |
| VlogHammer is a Verilog regression test suite developed to test the different |
| subsystems in Yosys by comparing them to each other and to the output created |
| by some other tools (Xilinx Vivado, Xilinx XST, Altera Quartus II, ...). |
| |
| \bigskip |
| Yosys Subsystems tested: Verilog frontend, const folding, const eval, technology mapping, |
| simulation models, SAT models. |
| |
| \bigskip |
| Thousands of auto-generated test cases containing code such as: |
| \begin{lstlisting}[xleftmargin=1cm, basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=Verilog] |
| assign y9 = $signed(((+$signed((^(6'd2 ** a2))))<$unsigned($unsigned(((+a3)))))); |
| assign y10 = (-((+((+{2{(~^p13)}})))^~(!{{b5,b1,a0},(a1&p12),(a4+a3)}))); |
| assign y11 = (~&(-{(-3'sd3),($unsigned($signed($unsigned({p0,b4,b1}))))})); |
| \end{lstlisting} |
| |
| \bigskip |
| Some bugs in Yosys where found and fixed thanks to VlogHammer. Over 50 bugs in |
| the other tools used as external reference where found and reported so far. |
| \end{frame} |
| |
| \begin{frame}{\subsecname{} -- yosys-bigsim} |
| yosys-bigsim is a collection of real-world open-source Verilog designs and test |
| benches. yosys-bigsim compares the testbench outputs of simulations of the original |
| Verilog code and synthesis results. |
| |
| \bigskip |
| The following designs are included in yosys-bigsim (excerpt): |
| \begin{itemize} |
| \item {\tt openmsp430} -- an MSP430 compatible 16 bit CPU |
| \item {\tt aes\_5cycle\_2stage} -- an AES encryption core |
| \item {\tt softusb\_navre} -- an AVR compatible 8 bit CPU |
| \item {\tt amber23} -- an ARMv2 compatible 32 bit CPU |
| \item {\tt lm32} -- another 32 bit CPU from Lattice Semiconductor |
| \item {\tt verilog-pong} -- a hardware pong game with VGA output |
| \item {\tt elliptic\_curve\_group} -- ECG point-add and point-scalar-mul core |
| \item {\tt reed\_solomon\_decoder} -- a Reed-Solomon Error Correction Decoder |
| \end{itemize} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Benefits of Open Source HDL Synthesis} |
| |
| \begin{frame}{\subsecname} |
| \begin{itemize} |
| \item Cost (also applies to ``free as in free beer'' solutions) |
| \item Availability and Reproducibility |
| \item Framework- and all-in-one-aspects |
| \item Educational Tool |
| \end{itemize} |
| |
| \bigskip |
| |
| Yosys is open source under the ISC license. |
| \end{frame} |
| |
| \begin{frame}{\subsecname{} -- 1/3} |
| \begin{itemize} |
| \item Cost (also applies to ``free as in free beer'' solutions): \smallskip\par |
| Today the cost for a mask set in $\unit[180]{nm}$ technology is far less than |
| the cost for the design tools needed to design the mask layouts. Open Source |
| ASIC flows are an important enabler for ASIC-level Open Source Hardware. |
| |
| \bigskip |
| \item Availability and Reproducibility: \smallskip\par |
| If you are a researcher who is publishing, you want to use tools that everyone |
| else can also use. Even if most universities have access to all major |
| commercial tools, you usually do not have easy access to the version that was |
| used in a research project a couple of years ago. With Open Source tools you |
| can even release the source code of the tool you have used alongside your data. |
| \end{itemize} |
| \end{frame} |
| |
| \begin{frame}{\subsecname{} -- 2/3} |
| \begin{itemize} |
| \item Framework: \smallskip\par |
| Yosys is not only a tool. It is a framework that can be used as basis for other |
| developments, so researchers and hackers alike do not need to re-invent the |
| basic functionality. Extensibility was one of Yosys' design goals. |
| |
| \bigskip |
| \item All-in-one: \smallskip\par |
| Because of the framework characteristics of Yosys, an increasing number of features |
| become available in one tool. Yosys not only can be used for circuit synthesis but |
| also for formal equivalence checking, SAT solving, and for circuit analysis, to |
| name just a few other application domains. With proprietary software one needs to |
| learn a new tool for each of these applications. |
| \end{itemize} |
| \end{frame} |
| |
| \begin{frame}{\subsecname{} -- 3/3} |
| \begin{itemize} |
| \item Educational Tool: \smallskip\par |
| Proprietary synthesis tools are at times very secretive about their inner |
| workings. They often are ``black boxes''. Yosys is very open about its |
| internals and it is easy to observe the different steps of synthesis. |
| \end{itemize} |
| |
| \bigskip |
| \begin{block}{Yosys is licensed under the ISC license:} |
| Permission to use, copy, modify, and/or distribute this software for any |
| purpose with or without fee is hereby granted, provided that the above |
| copyright notice and this permission notice appear in all copies. |
| \end{block} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Typical Applications for Yosys} |
| |
| \begin{frame}{\subsecname} |
| \begin{itemize} |
| \item Synthesis of final production designs |
| \item Pre-production synthesis (trial runs before investing in other tools) |
| \item Conversion of full-featured Verilog to simple Verilog |
| \item Conversion of Verilog to other formats (BLIF, BTOR, etc) |
| \item Demonstrating synthesis algorithms (e.g. for educational purposes) |
| \item Framework for experimenting with new algorithms |
| \item Framework for building custom flows\footnote[frame]{Not limited to synthesis |
| but also formal verification, reverse engineering, ...} |
| \end{itemize} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Projects (that I know of) using Yosys} |
| |
| \begin{frame}{\subsecname{} -- (1/2)} |
| \begin{itemize} |
| \item Ongoing PhD project on coarse grain synthesis \\ |
| {\setlength{\parindent}{0.5cm}\footnotesize |
| Johann Glaser and Clifford Wolf. Methodology and Example-Driven Interconnect |
| Synthesis for Designing Heterogeneous Coarse-Grain Reconfigurable |
| Architectures. In Jan Haase, editor, \it Models, Methods, and Tools for Complex |
| Chip Design. Lecture Notes in Electrical Engineering. Volume 265, 2014, pp |
| 201-221. Springer, 2013.} |
| |
| \bigskip |
| \item I know several people that use Yosys simply as Verilog frontend for other |
| flows (using either the BLIF and BTOR backends). |
| |
| \bigskip |
| \item I know some analog chip designers that use Yosys for small digital |
| control logic because it is simpler than setting up a commercial flow. |
| \end{itemize} |
| \end{frame} |
| |
| \begin{frame}{\subsecname{} -- (2/2)} |
| \begin{itemize} |
| \item Efabless |
| \begin{itemize} |
| \smallskip \item Not much information on the website (\url{http://efabless.com}) yet. |
| \smallskip \item Very cheap 180nm prototyping process (partnering with various fabs) |
| \smallskip \item A semiconductor company, NOT an EDA company |
| \smallskip \item Web-based design environment |
| \smallskip \item HDL Synthesis using Yosys |
| \smallskip \item Custom place\&route tool |
| |
| \bigskip |
| \item efabless is building an Open Source IC as reference design. \\ |
| \hskip1cm (to be announced soon: \url{http://www.openic.io}) |
| \end{itemize} |
| \end{itemize} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Supported Platforms} |
| |
| \begin{frame}{\subsecname} |
| \begin{itemize} |
| \item Main development OS: Kubuntu 14.04 |
| \item There is a PPA for ubuntu (not maintained by me) |
| \item Any current Debian-based system should work out of the box |
| \item When building on other Linux distributions: |
| \begin{itemize} |
| \item Needs compiler with some C++11 support |
| \item See README file for build instructions |
| \item Post to the subreddit if you get stuck |
| \end{itemize} |
| \item Ported to OS X (Darwin) and OpenBSD |
| \item Native win32 build with VisualStudio |
| \item Cross win32 build with MXE |
| \end{itemize} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Other Open Source Tools} |
| |
| \begin{frame}{\subsecname} |
| \begin{itemize} |
| \item Icarus Verilog \\ |
| \smallskip\hskip1cm{}Verilog Simulation (and also a good syntax checker) \\ |
| \smallskip\hskip1cm{}\url{http://iverilog.icarus.com/} |
| |
| \bigskip |
| \item Qflow (incl. TimberWolf, qrouter and Magic) \\ |
| \smallskip\hskip1cm{}A complete ASIC synthesis flow, using Yosys and ABC \\ |
| \smallskip\hskip1cm{}\url{http://opencircuitdesign.com/qflow/} |
| |
| \bigskip |
| \item ABC \\ |
| \smallskip\hskip1cm{}Logic optimization, technology mapping, and more \\ |
| \smallskip\hskip1cm{}\url{http://www.eecs.berkeley.edu/~alanmi/abc/} |
| \end{itemize} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Yosys needs you} |
| |
| \begin{frame}{\subsecname} |
| \dots as an active user: |
| \begin{itemize} |
| \item Use Yosys for on your own projects |
| \item .. even if you are not using it as final synthesis tool |
| \item Join the discussion on the Subreddit |
| \item Report bugs and send in feature requests |
| \end{itemize} |
| |
| \bigskip |
| \dots as a developer: |
| \begin{itemize} |
| \item Use Yosys as environment for your (research) work |
| \item .. you might also want to look into ABC for logic-level stuff |
| \item Fork the project on github or create loadable plugins |
| \item We need a VHDL frontend or a good VHDL-to-Verilog converter |
| \end{itemize} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Documentation, Downloads, Contacts} |
| |
| \begin{frame}{\subsecname} |
| \begin{itemize} |
| \item Website: \\ |
| \smallskip\hskip1cm\url{http://www.clifford.at/yosys/} |
| |
| \bigskip |
| \item Manual, Command Reference, Application Notes: \\ |
| \smallskip\hskip1cm\url{http://www.clifford.at/yosys/documentation.html} |
| |
| \bigskip |
| \item Instead of a mailing list we have a SubReddit: \\ |
| \smallskip\hskip1cm\url{http://www.reddit.com/r/yosys/} |
| |
| \bigskip |
| \item Direct link to the source code: \\ |
| \smallskip\hskip1cm\url{https://github.com/cliffordwolf/yosys} |
| \end{itemize} |
| \end{frame} |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| \subsection{Summary} |
| |
| \begin{frame}{\subsecname} |
| \begin{itemize} |
| \item Yosys is a powerful tool and framework for Verilog synthesis. |
| \item It uses a command-based interface and can be controlled by scripts. |
| \item By combining existing commands and implementing new commands Yosys can |
| be used in a wide range of application far beyond simple synthesis. |
| \end{itemize} |
| |
| \bigskip |
| \bigskip |
| \begin{center} |
| Questions? |
| \end{center} |
| |
| \bigskip |
| \bigskip |
| \begin{center} |
| \url{http://www.clifford.at/yosys/} |
| \end{center} |
| \end{frame} |
| |