forked from grigory-rechistov/simlab
-
Notifications
You must be signed in to change notification settings - Fork 0
/
lab06.tex
252 lines (202 loc) · 15.5 KB
/
lab06.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
\chapter{Моделирование процессора архитектуры OpenRISC~1000}\label{chap:lab06}
Данная практическая работа посвящена реализации модели компьютерной платформы, основанной на спецификации OpenRISC~1000~\cite{or1k-spec}. Модель строится на основе API Simics и оформляется как набор модулей и сценариев для данного симулятора.
\section{Спецификации OpenRISC~1000}
OpenRISC~1000 --- дизайн процессора, построенный по философии Open Source~\cite{open-source-definition-ru} как для программного кода, так и для аппаратуры. Спецификация определяет 32- или 64-битный RISC-процессор общего назначения, с пятью стадиями конвеера, необязательной поддержкой MMU (\abbr memory management unit), кэшей, управлением энергопотреблением и др. Важная для данной лабораторной работы черта спецификации OpenRISC~1000 --- это опциональность многих частей функциональности, что позволяет ограничиваться только минимально необходимыми для конкретной реализации элементами.
Существуют реализации OpenRISC~1000 в виде программных моделей, спецификаций для FPGA и описаний RTL на языке Verilog. Программная поддержка существует со стороны компиляторов GCC и LLVM, адаптированных библиотек LibC и GNU toolchain.
\subsection{Этапы проекта}
Для создания рабочей функциональной модели ЦПУ требуется спецификация на следующие его элементы: архитектурное состояние (число и типы регистров), набор инструкций (кодировка и семантика), а также интерфейсы к внешним элементам системы (память и периферийные устройства). Детали, относящиеся к особенностям организации конвеера, длительностям работы отдельных инструкций, устройству кэшей и т.п. не являются необходимыми на данном уровне точности моделирования.
\section{Краткое введение в архитектуру OpenRISC~1000}
\subsection{Набор регистров}
Классификация регистров OpenRISC~1000 (рис.~\ref{fig:or1k-regs}), требующих реализации в ходе работы.
\begin{itemize}
\item 32 регистра общего назначения шириной в 64 бита, доступные из пользовательского и супервизорного режимов: \texttt{R0} -- \texttt{R31}. Регистр R0 всегда должен содержать ноль.
\item Специфичные для модулей регистры (\abbr special purpose registers, SPR). В случае, если некоторая опциональная часть спецификации реализована, с ней могут идти дополнительные регистры для индикации статуса и управления состоянием. Каждый из них имеет собственное имя и функциональность. SPR разделены по группам. Группа 0 --- регистры супервизора шириной 32 бита. Некоторые из них могут быть доступны на чтение из пользовательского режима.
\end{itemize}
\begin{figure}[htbp]
\centering
\bytefieldsetup{bitwidth=0.07cm, endianness = big}
\begin{bytefield}[]{32}
\bitheader{31, 0} \\
\bitbox{32}{PC} \\
\end{bytefield}
\bytefieldsetup{bitwidth=0.07cm, endianness = big}
\begin{bytefield}[]{64}
\bitheader{63, 0} \\
\bitbox{64}{GPR0} \\
\bitbox{64}{\dots} \\
\bitbox{64}{GPR31} \\
\end{bytefield}
\begin{bytefield}[]{32}
\bitheader{31, 0} \\
\bitbox{32}{VR} \\
\bitbox{32}{UPR} \\
\bitbox{32}{CPUCFGR} \\
\bitbox{32}{\dots} \\
\bitbox{32}{ESR15} \\
\end{bytefield}
% \begin{tikzpicture}[>=latex, node distance=0.5cm, font=\small]
% \node[draw] (gpr0) {GPR0};
% \node[draw] (gpr31) {GPR31};
%
% % \node[draw, below = of cpu.south west, anchor=north west] (graph) {\textsc{graphics}: graph16};
%
% \end{tikzpicture}
\caption{Регистры OpenRISC~1000}\label{fig:or1k-regs}
\end{figure}
\subsection{Набор инструкций}
Набор инструкций состоит из нескольких классов (рис.~\ref{fig:or1k-isa}), соответствующих различным задачам и типам обрабатываемых данных.
\begin{figure}[htbp]
\centering
\begin{tikzpicture}[font=\small, node distance = 0.5cm]
\node[draw, ellipse] (ORBIS32) {ORBIS32};
\node[draw, ellipse, right = of ORBIS32] (ORBIS64) {ORBIS64};
\node[draw, ellipse, below = of ORBIS32] (ORFPX32) {ORFPX32};
\node[draw, ellipse, below = of ORBIS64] (ORFPX64) {ORFPX64};
\node[draw, ellipse, below = of ORFPX64] (ORVDX64) {ORVDX64};
\node[draw, ellipse, fit = (ORBIS32) (ORBIS64) (ORFPX32) (ORFPX64) (ORVDX64)] {};
\end{tikzpicture}
\caption{Классы инструкций набора команд OpenRISC~1000}\label{fig:or1k-isa}
\end{figure}
\begin{itemize}
\item ORBIS32 --- 32-битные команды общего назначения; единственный класс, обязательный для реализации;
\item ORBIS64 --- 64-битные команды общего назначения;
\item ORFPX32 --- 32-битные команды для работы над числами с плавающей запятой;
\item ORFPX64 --- 64-битные команды для работы над числами с плавающей запятой;
\item ORVDX64 --- команды для операции над векторами данных с элементами шириной 8, 16, 32 или 64 бита;
\item Частные команды, специфичные для конкретной модели.
\end{itemize}
Ширина отдельных инструкций фиксирована и равна 32 битам. ORBIS32 состоит из следующих подклассов команд:
\begin{itemize}
\item арифметические операции;
\item базовые инструкции для обработки сигналов (\abbr digital signal processing, DSP);
\item загрузка и запись данных из памяти;
\item управление порядком исполнения;
\item прочие.
\end{itemize}
\section[Кодовая база моделей процессоров]{Кодовая база Simics для создания моделей процессоров}
Основа модели ЦПУ --- код \texttt{sample-risc}, модифицированный для нужд учебного проекта:
\begin{itemize}
\item убрана многоядерность;
\item декодер упрощён до одной инструкции.
\end{itemize}
Конфигурация платформы (ЦПУ, память, опционально таймер) --- основана на сценарии \texttt{cosim}.
\section[Кодовая база моделей устройств]{Кодовая база Simics для создания моделей периферийных устройств}
Основа для моделей периферийных устройств --- код \texttt{sample-device-c} и \texttt{sample-timer-device}, переименованный в \texttt{tick-device}.
\section{Совместная симуляция процессоров и периферийных устройств}
Следующий пример работы с сессией Simics иллюстрирует совместную работу исполняющих (процессоры) и неисполняющих устройств в симуляции.
\begin{lstlisting}
simics> phys_mem0.map
Base Object Fn Offset Length
----------------------------------------
0x00000 ram0 0 0x0 0x10000
width 8192 bytes
0x00100 joy0 0 0x0 0x10
width 8 bytes
0x00110 joy1 0 0x0 0x10
width 8 bytes
0x08000 test0 0 0x0 0x8000
0x10000 tick0:regs 0x0 0x8
width 2 bytes
simics> tick0->irq_dev
["chip0", "EXTERNAL_INTERRUPT"]
\end{lstlisting}
tick0 — это периодический таймер, chip0 - центральный процессор. Они соединены через порт EXTERNAL_INTERRUPT, кроме того, регистры tick0 отображены в физическую память, начиная с адреса 0x10000.
\begin{lstlisting}
simics> log-level 4
New global log level: 4
simics> phys_mem0.write address = 0x10000 value = 0 -b size = 2
[tick0 info] Write to register regs.counter (addr 0x10000) <- 0
simics> phys_mem0.write address = 0x10002 value = 0 -b size = 2
[tick0 info] Write to register regs.reference (addr 0x10002) <- 0
simics> phys_mem0.write address = 0x10002 value = 100 -b size = 2
[tick0 info] Write to register regs.reference (addr 0x10002) <- 0x64
simics> peq
Step Object Description
Cycle Object Description
0 sim Time Quantum End
500001 cosim_cell sync_report
1000000 cosim_cell sync_block
\end{lstlisting}
Очередь событий не содержит архитектурных событий, только псевдособытия симулятора.
\begin{lstlisting}
simics> phys_mem0.write address = 0x10004 value = 2 -b size = 2
[tick0 info] Write to register regs.step (addr 0x10004) <- 0x2
[tick0 info] step updated
[tick0 info] reposting event to 200 cycles ahead
simics> peq
Step Object Description
Cycle Object Description
0 sim Time Quantum End
200 tick0 reference_reached
500001 cosim_cell sync_report
1000000 cosim_cell sync_block
\end{lstlisting}
После настройки регистров в очереди событий появилось событие таймера reference_reached.
\begin{lstlisting}
simics> log-level 1
New global log level: 1
simics> continue-cycles 199
[chip0] v:0x031c p:0x031c nop
simics> peq
Step Object Description
Cycle Object Description
1 tick0 reference_reached
499802 cosim_cell sync_report
999801 sim Time Quantum End
999801 cosim_cell sync_block
\end{lstlisting}
Расстояние до события таймера уменьшается.
\begin{lstlisting}
simics> continue-cycles 10
[tick0 info] reference_reached is fired!
[chip0 info] EXTERNAL_INTERRUPT raised.
[chip0 info] EXTERNAL_INTERRUPT lowered.
[chip0] v:0x0344 p:0x0344 nop
simics> peq
Step Object Description
Cycle Object Description
499792 cosim_cell sync_report
999791 sim Time Quantum End
999791 cosim_cell sync_block
\end{lstlisting}
Таймер отработал, а процессор получил прерывание.
\section{Тестирование моделей}
Для тестирования корректности моделирования отдельных инструкций применяется юнит-тестирование на основе фреймворка \texttt{test-runner}. Для проверки последовательностей команд гостевой код может быть написан вручную в машинных кодах OpenRISC~1000 или же с помощью GNU toolchain~\cite{or1k-toolchain}.
\section{Порядок работы}
\begin{enumerate}
\item Подготовить workspace Simics.
\item Собрать код sample-risc.
\item Реализовать набор регистров базового архитектурного состояния.
\item Реализовать декодер команд.
\item Интегрировать модель openrisc в сценарий платформы.
\item Реализовать модель таймера.
\item Интегрировать модель таймера в сценарий платформы.
\end{enumerate}
\subsection{Дополнительные шаги}
\begin{itemize}
\item Реализовать набор инструкций ORBIS64.
\item Реализовать функциональность TLB и/или MMU.
\item Реализовать устройство PIC.
\item Реализовать модель кэша данных.
\item Реализовать набор инструций ORFPX32.
\end{itemize}
\iftoggle{webpaper}{
\printbibliography[title={Список литературы к занятию}]
}{}
% День 1
% 1. [Лекция, 3 часа] Программное моделирование для задач совместной разработки аппаратуры и программ. Другие применения программных моделей. История использования. Симулятор Wind River Simics. Принципы работы, базовые понятия.
% 2. [Практикум, 5 часов] Знакомство с Simics: создание проекта, запуск моделирования, управление и инспектирование состояния симуляции. Сборка моделей шаблонных устройств.
% День 2
% 1. [Лекция, 2 часа] Моделирование центральных процессоров с помощью интерпретации. Моделирование периферийных устройств с помощью симуляции дискретных событий.
% 2. [Лекция, 1 час] Архитектура OpenRISC~1000.
% 3. [Практикум, 5 часов] Создание модели процессора OpenRISC~1000 с использованием фреймворка Simics Model Builder: архитектурное состояние, набор инструкций ORBIS32.
% День 3
% 1. [Практикум, 8 часов] Продолжение реализации основной и опциональной функциональности модели OpenRISC~1000.
% а. Набор инструкций ORBIS32.
% б. Поддержка исключений.
% в. Трансляция адресов: TLB и (MMU).
% г. Периферийные устройства: Tick timer facility.
% д. Периферийные устройства: PIC.
% е. Модель кэша данных.
% ж. Набор инструкций ORFPX32.
% Проверка работоспособности модели с помощью юнит-тестирования и микро-приложений, собранных с помощью GCC-or1k.