ee34084d9f1a3d2f37909f5c2ebaa94b2af2b1f5
[mw/milkymist.git] / cores / pfpu / doc / pfpu.tex
1 \documentclass[a4paper,11pt]{article}
2 \usepackage{fullpage}
3 \usepackage[latin1]{inputenc}
4 \usepackage[T1]{fontenc}
5 \usepackage[normalem]{ulem}
6 \usepackage[english]{babel}
7 \usepackage{listings,babel}
8 \lstset{breaklines=true,basicstyle=\ttfamily}
9 \usepackage{graphicx}
10 \usepackage{moreverb}
11 \usepackage{url}
12 \usepackage{amsmath}
13 \usepackage{float}
14 \usepackage{tabularx}
15
16 \title{Programmable Floating Point Unit}
17 \author{S\'ebastien Bourdeauducq}
18 \date{November 2009}
19 \begin{document}
20 \setlength{\parindent}{0pt}
21 \setlength{\parskip}{5pt}
22 \maketitle{}
23 \section{Overview}
24 The Programmable Floating Point Unit (PFPU) is a floating point microprocessor optimized for fast computation of triangle strip vertices (mesh) used by the Milkymist texture mapping unit.
25
26 It is designed for repetitive evaluation of the same mathematical function on a large number of points, using 32-bit floating point numbers. Furthermore, it contains specifically crafted DMA engine and address generator which enable the output DMA buffer to be ready to be used immediately by the texture mapping unit.
27
28 \section{Architecture}
29
30 \begin{figure}[H]
31 \centering
32 \includegraphics[height=100mm]{architecture.eps}
33 \caption{The PFPU architecture.}\label{fig:architecture}
34 \end{figure}
35
36 \subsection{Register file}
37 The PFPU implements 128 registers, which are accessed by its microcode, the address generator and the CSR interface.\\
38
39 \begin{tabularx}{\textwidth}{|l|l|l|l|X|}
40 \hline
41 \bf Register & \multicolumn{3}{|c|}{\bf Access} & \bf Description \\
42 \hline
43  & \bf Ucode & \bf Addr. gen. & \bf CSR & \\
44 \hline
45 R0 & R & W & -- & Mesh X coordinate of the currently computed point, stored as integer by the address generator before starting the microcode. \\
46 \hline
47 R1 & R & W & -- & Mesh Y coordinate of the currently computed point (same remark). \\
48 \hline
49 R2 & RW & -- & RW & ALU flags (typically comparison result). \\
50 \hline
51 R3--R30 & RW & -- & RW & General purpose 32-bit registers. \\
52 \hline
53 R127 & W & -- & -- & Output register. Writing to this register stores the value into system memory via DMA, and restarts the microcode to compute the next point. \\
54 \hline
55 \end{tabularx}\\
56
57 The compiler can use the general purpose registers to store inputs of the function to be evaluated, and to store intermediate computation results.
58
59 The registers are not reinitialized when a new point is computed. It is the responsibility of the compiler to generate a microcode that does not overwrite inputs that must be used to compute several points.
60
61 Microcode writes to read-only registers result in undefined behaviour.
62
63 \subsection{Instruction set}
64 The microcode is specified a simple 25-bit instruction set. All instruction scheduling is handled by the compiler. \\
65
66 On each cycle, the PFPU executes two instructions, a read + start operation instruction that pushes two registers into the ALU, and a write instruction that takes the current ALU result and writes it back to the register file. The two are encoded in the same insctruction word. \\
67
68 \begin{tabular}{|l|l|l|l|l|}
69 \hline
70 \bf Parameter & Operand A & Operand B &  Opcode & Destination \\
71 \hline
72 \bf Length & 7 & 7 & 4 & 7 \\
73 \hline
74 \bf Bits & \verb!24..18! & \verb!17..11! & \verb!10..7! & \verb!7..0! \\
75 \hline
76 \end{tabular}\\
77
78 All instructions that do not write to the register file must have the ``destination'' field set to 0.
79
80 \subsection{Address generator}
81 The address generator iterates over all the points of a rectangular mesh. At each point, the ``X coordinate'' and ``Y coordinate'' registers are updated, and the DMA target address is computed.
82
83 The function used to compute the DMA target address is the same as the one of the texture mapping unit :
84
85 \begin{equation*}
86 base + 4 \cdot (128 \cdot y + x)
87 \end{equation*}
88
89 \subsection{Arithmetic and logical unit (ALU)}
90 The ALU contains several computation units that perform arithmetic, binary and logic operations.
91
92 At every cycle, a computation unit is selected using the ``opcode'' part of the instuction, according to the table below. The computation unit finishes its computation a number of cycles later, and the result is written to the register given in the instruction which is active at this time. It is the responsibility of the compiler to avoid output conflicts ; that is to say, that only one unit may finish its computation at a given cycle.
93
94 A computation unit can be parallel or sequential. A parallel unit can accept a new operation at each cycle (it's typically a pipeline). A sequential unit can only accept a new operation when it is not already busy processing one (it's typically a FSM with a datapath) ; and trying to push a new operation into a busy sequential unit results in undefined behaviour.
95
96 Each computation unit can have one, two or three arguments. If the unit has one argument, operand A is used, and operand B and flags are ignored. If the unit has two arguments, operands A and B are used. If the unit has three arguments, all operands and flags are used.
97
98 \subsubsection{Table of operations}
99
100 \begin{tabularx}{\textwidth}{|l|l|l|l|X|}
101 \hline
102 \bf Mnemonic & \bf Opcode & \bf Type & \bf Latency & \bf Description \\
103 \hline
104 NOP & 0 & -- & -- & No operation (use as filler). \\
105 \hline
106 FADD & 1 & Parallel & 4 & Floating point addition. \\
107 \hline
108 FSUB & 2 & Parallel & 4 & Floating point subtraction (A-B). \\
109 \hline
110 FMUL & 3 & Parallel & 5 & Floating point multiplication. \\
111 \hline
112 FDIV & 4 & Sequential & TBD & Floating point division (A/B). \\
113 \hline
114 F2I & 5 & Parallel & 2 & Convert float to integer. \\
115 \hline
116 I2F & 6 & Parallel & 3 & Convert integer to float. \\
117 \hline
118 VECT & 7 & Parallel & 2 & Make vector. \\
119 \hline
120 SIN & 8 & Parallel & 4 & Sine table look-up. \\
121 \hline
122 COS & 9 & Parallel & 4 & Cosine table look-up. \\
123 \hline
124 ABOVE & a & Parallel & 2 & Result is 1.0 is A>B, 0.0 otherwise. \\
125 \hline
126 EQUAL & b & Parallel & 2 & Result is 1.0 is A=B, 0.0 otherwise. \\
127 \hline
128 COPY & c & Parallel & 2 & Result is A. \\
129 \hline
130 \end{tabularx}\\
131
132 \subsubsection{Relationship with IEEE754}
133 When using floating point numbers, the PFPU uses the same number representation as IEEE754 (1-bit sign, 8-bit biased exponent, 23-bit mantissa). This is made to ease interfacing with IEEE754-compliant systems and software ; however, the PFPU does not comply with IEEE754 and notoriously differs from the norm in the following points :
134
135 \paragraph{Denormal numbers.} The PFPU represents zero as any number that has a zero biased exponent, and the other bits are don't care. This means that denormal numbers are treated as zero. Therefore, when writing a floating point number to the PFPU, no special care should be taken to check if it's denormal or not (except for the obvious loss of precision). However, when reading a floating point number from the PFPU, if its exponent is zero, then its other bits are invalid. They must be ignored unless your use of the number can tolerate the introduced noise.
136
137 \paragraph{Precision.} The PFPU does not follow IEEE754 specifications regarding precision and rounding of operations.
138
139 \paragraph{Special numbers.} Numbers like NaN, infinity, etc. are not supported. Trying to perform an operation that would result in such a number in IEEE754-compliant arithmetics yields undefined result on the PFPU.
140
141 \subsubsection{Floating point addition and subtraction}
142 These operations are implemented using the same pipeline.
143
144 The operation is performed using one guard digit and truncation of the result.
145
146 \subsubsection{Floating point multiplication}
147 The operation is performed by multiplying the mantissas at full precision and then truncating the result.
148
149 \subsubsection{Floating point division}
150 The floating point division is not implemented in this release.
151
152 \subsubsection{Integer conversions}
153 The PFPU supports conversion to and from 32-bit signed integers, using two's complement. When doing a float to integer conversion, the decimal part is truncated.
154
155 \subsubsection{Make vector}
156 This operation is used to format the output of the PFPU so that it can be directly read as a vertex coordinate by the texture mapping unit.
157
158 It takes two 32-bit integers A and B as input, and concatenates their 16 lowest significant bits to make a 32-bit vector composed of two 16-bit integers (in Verilog syntax, you get \verb!{A[15:0], B[15:0]}! as output).
159
160 \subsubsection{Sine and cosine table look-up}
161 This computes $sin(\frac{2 \cdot \pi \cdot A}{8192})$ or $cos(\frac{2 \cdot \pi \cdot A}{8192})$ for a signed integer input A. A can be of the whole 32-bit signed integer range ($-2^{31}$ to $2^{31}-1$) and the result will be correct, which makes preliminary range reduction to $[0;2\cdot\pi]$ unnecessary in practical cases. To compute sine or cosine, all you would need to do is a floating point multiplication by $\frac{8192}{2 \cdot \pi}$, conversion to integer, and sine/cosine table look-up.
162
163 \subsubsection{Comparison}
164 The \verb!ABOVE! and \verb!EQUAL! operations return a floating point number which is 0.0 (false) or 1.0 (true), depending on the result of the comparison.
165
166 \subsubsection{Copy}
167 The PFPU can copy a register to another, to help the compiler resolve register placement constraints.
168
169 \section{Interface}
170 The PFPU is equipped with a CSR slave bus used for control, and a Wishbone master for storing the computation results into system memory.
171
172 The CSR bus gives access to configuration and status registers, to the contents of the 128 data registers, and to the microcode memory.
173
174 \subsection{Register 0x000 -- Control register}
175 \begin{tabularx}{\textwidth}{|l|l|l|X|}
176 \hline
177 \bf Bits & \bf Access & \bf Default & \bf Description \\
178 \hline
179 0 & RW & 0 & Start/busy bit. Writing 1 to this position starts the execution of the microcode. When reading, this bit is set when the core is busy. \\
180 \hline
181 31--1 & --- & 0 & Reserved. \\
182 \hline
183 \end{tabularx}
184
185 \subsection{Register 0x004 -- DMA base register}
186 This register sets the base address for DMA transfers, expressed in bytes. DMA transfers must be aligned to a 32-bit boundary.
187
188 When the PFPU is busy (microcode execution in progress), this register is read-only. Writing it results in undefined behaviour.
189
190 \subsection{Registers 0x008 and 0x00C -- Last vertex index registers}
191 These registers set the indices of the last vertices of the mesh, respectively horizontally and vertically. Indices start at 0. For instance, when computing a mesh of 32x24 vertices, the registers should be set to 31 and 23.
192
193 When the PFPU is busy, these registers are read-only.
194
195 \subsection{Register 0x010 -- Microcode page register}
196 Because the CSR address space is limited, the 2048-word microcode memory is split into 4 consecutive pages of 512 words, and only one of these pages is mapped to the CSR interface at a given time. This register selects which. Values are between 0 to 3.
197
198 \subsection{Register 0x014 -- Vertex counter register}
199 This register counts the number of processed vertices. It can be read at any time, including when the core is busy. It is set to 0 when a new computation is started.
200
201 \subsection{Register 0x018 -- Collision counter register}
202 This register counts the number of \textit{collisions} that occured. A \textit{collision} happens when two pipelines finish their computations in the same clock cycle - and the microcode must be made so that this situation is avoided. The counter is set to 0 when a new computation is started.
203
204 \subsection{Register 0x01C -- Stray write counter register}
205 This register counts the number of \textit{stray writes} that occured. A \textit{stray write} happens when a pipeline finishes a computation, but the microcode defines no destination register for it. The counter is set to 0 when a new computation is started.
206
207 For stray write detection to work, all unused destination register slots in the microcode must be set to 0.
208
209 \subsection{Registers 0x400 to 0x5FC -- Register file access}
210 This address range gives direct access to the 128 registers of the file.
211
212 It should not be accessed while the microcode is in execution.
213
214 \subsection{Registers 0x800 to 0xFFC -- Microcode access}
215 This address range gives direct access to a page of 512 words of the microcode. The 25-bit microcode words are padded to 32 bits by adding 7 zeros before them.
216
217 It should not be accessed while the microcode is in execution.
218
219 \section{Interrupts}
220 The PFPU is equipped with one active-high edge-sensitive interrupt line.
221
222 An interrupt is triggered when a microcode has finished execution and all resulting data has been sent through the bus master.
223
224 \end{document}