Making prograss on Appnote 010

This commit is contained in:
Clifford Wolf 2013-11-23 05:46:51 +01:00
parent 3c023054bc
commit 9ab850e45e
2 changed files with 93 additions and 8 deletions

View File

@ -50,10 +50,14 @@ the BLIF format, for example it only uses synchronous resets.
Converting {\tt softusb\_navre.v} to {\tt softusb\_navre.blif} could not be
easier:
\begin{figure}[H]
\begin{lstlisting}[frame=trBL,xleftmargin=1.5em,numbers=left]
yosys -o softusb_navre.blif \
-S softusb_navre.v
yosys -o softusb_navre.blif \
-S softusb_navre.v
\end{lstlisting}
\renewcommand{\figurename}{Listing}
\caption{Calling Yosys without script file}
\end{figure}
Behind the scenes Yosys is controlled by synthesis scripts that execute
commands that operate on Yosys' internal state. For example, the {\tt -o
@ -76,12 +80,16 @@ to use an actual script file.
With a script file we have better control over Yosys. The following script
file replicates what the command from the last section did:
\begin{lstlisting}[frame=trBL,xleftmargin=1.5em,numbers=left,caption={\tt softusb\_navre.ys}]
\begin{figure}[H]
\begin{lstlisting}[frame=trBL,xleftmargin=1.5em,numbers=left]
read_verilog softusb_navre.v
hierarchy
proc; opt; memory; opt; techmap; opt
write_blif softusb_navre.blif
\end{lstlisting}
\renewcommand{\figurename}{Listing}
\caption{\tt softusb\_navre.ys}
\end{figure}
The first and last line obviously read the Verilog file and write the BLIF
file.
@ -124,9 +132,13 @@ source file, as we will see in the next section.
Now Yosys can be run with the file of the synthesis script as argument:
\begin{figure}[H]
\begin{lstlisting}[frame=trBL,xleftmargin=1.5em,numbers=left]
yosys softusb_navre.ys
yosys softusb_navre.ys
\end{lstlisting}
\renewcommand{\figurename}{Listing}
\caption{Calling Yosys with script file}
\end{figure}
\medskip
@ -155,13 +167,17 @@ processed using custom commands. But in this case we don't need that.
So now we have the final synthesis script for generating a BLIF file
for the navre CPU:
\begin{lstlisting}[frame=trBL,xleftmargin=1.5em,numbers=left,caption={\tt softusb\_navre.ys} (improved)]
\begin{figure}[H]
\begin{lstlisting}[frame=trBL,xleftmargin=1.5em,numbers=left]
read_verilog softusb_navre.v
hierarchy -check -top softusb_navre
proc; opt; memory; opt;
fsm; opt; techmap; opt
write_blif softusb_navre.blif
\end{lstlisting}
\renewcommand{\figurename}{Listing}
\caption{{\tt softusb\_navre.ys} (improved)}
\end{figure}
\section{Advanced Example: The Amber23 ARMv2a CPU}
@ -169,7 +185,8 @@ Our 2nd example is the Amber23\footnote{\url{http://opencores.org/project,amber}
ARMv2a CPU. Once again we base our example on the Verilog code that is included
in {\it yosys-bigsim}.
\begin{lstlisting}[frame=trBL,xleftmargin=1.5em,numbers=left,caption={\tt amber23.ys}]
\begin{figure}[b!]
\begin{lstlisting}[frame=trBL,xleftmargin=1.5em,numbers=left]
read_verilog a23_alu.v
read_verilog a23_barrel_shift_fpga.v
read_verilog a23_barrel_shift.v
@ -188,10 +205,77 @@ read_verilog generic_sram_line_en.v
hierarchy -check -top a23_core
add -global_input globrst 1
proc -global_arst globrst
opt; memory; opt; fsm; opt
techmap -map adff2dff.v
techmap
opt; memory; opt; fsm; opt; techmap
write_blif amber23.blif
\end{lstlisting}
\renewcommand{\figurename}{Listing}
\caption{\tt amber23.ys}
\label{aber23.ys}
\end{figure}
The problem with this core is that it contains no dedicated reset signals.
Instead it is using the coding techiques shown in Listing~\ref{glob_arst} to
set reset values to be used on the global asynchronous reset in an FPGA
implementation. This design can not be expressed in BLIF as it is. Instead we
need to use a synthesis script that transforms this to synchonous resets that
can be expressed in BLIF.
\medskip
Listing~\ref{aber23.ys} shows the synthesis script for the Amber23 core. In
line 17 the {\tt add} command is used to add a 1-bit wide global input signal
with the name {\tt globrst}. That means that an input with that name is added
to each module in the design hierarchy and then all module instanciations are
altered so that this new signal is connected throughout the whole design
hierarchy.
\begin{figure}[t!]
\begin{lstlisting}[frame=trBL,xleftmargin=1.5em,numbers=left]
reg [7:0] a = 13, b;
initial b = 37;
\end{lstlisting}
\renewcommand{\figurename}{Listing}
\caption{Implicit coding of global asynchronous resets}
\label{glob_arst}
\end{figure}
\begin{figure}[b!]
\begin{lstlisting}[frame=trBL,xleftmargin=1.5em,numbers=left]
module \$adff (CLK, ARST, D, Q);
parameter WIDTH = 1;
parameter CLK_POLARITY = 1'b1;
parameter ARST_POLARITY = 1'b1;
parameter ARST_VALUE = 0;
input CLK, ARST;
input [WIDTH-1:0] D;
output reg [WIDTH-1:0] Q;
wire _TECHMAP_FAIL_ =
!CLK_POLARITY || !ARST_POLARITY;
always @(posedge CLK)
if (ARST)
Q <= ARST_VALUE;
else
Q <= D;
endmodule
\end{lstlisting}
\renewcommand{\figurename}{Listing}
\caption{\tt adff2dff.v}
\label{adff2dff.v}
\end{figure}
In line 18 the {\tt proc} command is called. But this time the newly created
reset signal is passed to the core as a global reset line to use for resetting
all registers to their initial values.
Finally in line 19 the {\tt techmap} command is used to replace all instances
of flip-flops with asynchronous resets to flip-flops with synchronous resets.
The map file used fo this is shown in Lising~\ref{adff2dff.v}.
{\color{red} FIXME}

View File

@ -22,6 +22,7 @@
\usepackage{multirow}
\usepackage{hhline}
\usepackage{listings}
\usepackage{float}
\usepackage{tikz}
\usetikzlibrary{calc}