Опыт моделирования аппаратуры

advertisement
Опыт моделирования
аппаратуры
Почему и зачем? Что? Как?
Действующие лица и
исполнители
<lj user=thesz>, Сергей Зефиров
<lj user=potan>, Потанин Михаил, модель
памяти, контроллер памяти
<lj user=gaperton>, Влад Балин,
руководитель и вдохновитель (”Серег,
как процессор?”)
<lj user=garrrrr> - скрипт подсчета
строк, <lj user=t_h_e_d_i_p> - умножение
и деление
Языки и средства
(почему и зачем)
Описание аппаратуры
поведенческое - алгоритм работы
блоков
синтезируемое - получение описания
блоков в терминах элементной базы
Языки и средства
(почему и зачем)
Поведенческое: неважно, как получено
поведение, главное, чтобы достигалась
цель. Циклы, вызовы, отладочная
печать, ввод-вывод...
Синтезируемое: цель состоит в
получении информации для фабрики.
Здесь важно, как достигнута цель.
Циклы и тому подобное запрещено.
Языки и средства
(почему и зачем)
Средство
Язык
Поведенческое
описание
Синтезируемое
описание
Verilog
Verilog
+
+
VHDL
VHDL
+
+
SystemC
C++
+
(скорость
моделирования)
+(результаты
синтеза плохи)
Lava, Hydra
Haskell
+
+
Hawk
Haskell
+
-
Языки и средства
(почему и зачем)
VHDL. Накапливающий сумматор.
(только смысловая часть, без
объявлений)
process(clk)
begin
if clk’event and clk=’1’ then
sum <= sum+input;
end if;
end process;
Языки и средства
(почему и зачем)
Verilog. Снова накапливающий сумматор.
(также нет объявлений, их здесь два
типа: провода wire и регистры reg. И тип
данных - 1D битовый массив.)
always @ (posedge clk)
begin
sum <= sum+input;
end;
Языки и средства
(почему и зачем)
Verilog, VHDL и SystemC низкоуровневые, разработка модели
медленна
Lava и Hydra - DSEL в стиле V*, не дают
подходящий уровень абстракции
Языки и средства
(почему и зачем)
Hawk использовался для проверки
работы сложных блоков архитектуры
современных процессоров (однако,
заброшен, не развивается, не
собирается)
Наши собственные небольшие
разработки показывали адекватность
подхода a-la Hawk - от RS-триггеров до
небольших блоков CPU.
Языки и средства
(почему и зачем)
Интересно было посмотреть на
большую задачу
Таковой оказалась модель процессора
MIPS с элементами архитектуры Alpha,
который никто до этого не делал
“И все заверте...” (А. Аверченко)
Что моделировалось?
Современная электроника строго
потактовая (для упрощения
рассуждений разработчиков)
Состояние сигнала на начале такта
можно представить элементом списка
Список - эволюция сигнала во времени
Что моделировалось?
Такты накапливающего сумматора
Что моделировалось?
Бесконечный список S a:
data S a = S a (S a)
Модель работала с комбинаторами
delayS x s = S x s
constS x = let s = delayS x s in s
mapS, zipS, unzipS, zipWithS...
Производительность (S a) выше [a]
Что моделировалось?
Еще комбинаторов:
mapS f (S x xs) = delayS (f x) $ mapS f xs
zipS (S a as) (S b bs) = delayS (a,b) $ zipS as bs
unzipS as = (mapS fst as,mapS snd as)
zipWithS f as bs = mapS (uncurry f) $ zipS as bs
Что моделировалось?
Машина Мили (Mealy) - машина с
состоянием.
f
Состояние
Что моделировалось?
Машина Мили представляется
закороткой с задаваемым извне первым
состоянием
threadS :: state -> (input -> State state output) -> S input
-> S output -- использовалось всего один раз
loopS :: state -> (state -> input -> (state,output)) -> S input
-> S output
loopS s0 stateChanger inputS = outputS
where
stateOutputS = zipWithS stateChanger startStateS inputS
(stateS,outputS) = unzipS stateOutput
startStateS = delayS s0 stateS
Что моделировалось?
Логика и RS-триггер
andNot выполняется за ненулевое время
(delayS)
andNot :: S Bool -> S Bool -> S Bool
andNot a b = delayS False $ mapS not $ zipWithS (&&) a b
rsTrigger :: S Bool -> S Bool -> (S Bool, S Bool)
rsTrigger r s = (q,q’) andNot :: S Bool -> S Bool -> S Bool
where
q = andNot r q’
q’ = andNot s q
-- тестовые последовательности.
testS = fromList $ cycle $ replicate 8 False ++ [True]
testR = fromList $ cycle $ replicate 4 False ++ [True]++replicate 4 False
Что моделировалось?
Размер кода комбинаторов - 70
полезных строк (кое-что лишнее)
В завершении части - реализация
накапливающего сумматора:
*Loaders.AsmLoader Framework.S> let sumF s i = let sum = s+i in (sum,s)
*Loaders.AsmLoader Framework.S> let sumC s0 inputS = loopS s0 sumF inputS
*Loaders.AsmLoader Framework.S> sumC 0 (fromList $ [1..10]++repeat 0)
0,1,3,6,10,15,21,28,36,45,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,
55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55...
*Loaders.AsmLoader Framework.S> sumC 10 (fromList $ [1..10]++repeat 0)
10,11,13,16,20,25,31,38,46,55,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65
,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65...
*Loaders.AsmLoader Framework.S> _
Как получилось?
(общее впечатление)
Получилось трудно
2 месяца до первой рабочей сборки
процессора
3 месяца до работы с моделью
памяти
4 месяца до внесения всех
пожеланий инженеров
Как получилось?
(общее впечатление)
Получилось хорошо
2 месяца до модели современного
суперскалярного процессора
Месяц на запуск реальных задач
Месяц на непредусмотренное
изменение архитектуры
Как получилось?
(общее впечатление)
Высокий уровень представления:
Замена декодера команд (2 варианта)
Высокий уровень абстракции (R номер регистра, MIPSREG - маш.
слово):
mips_op_read :: forall b a1 a.
-- ответы от регистрового файла
S [(a, MIPSREG)]
-- запросы на чтение
-> S [(a1, b, ExecInstr (RegBypass R))]
-- результат чтения
-> (S Bool, S [(R, R)], S [(a1, b, ExecInstr (RegBypass MIPSREG))])
Как получилось?
(общее впечатление)
14 параметров ядра процессора - от
размеров кэшей до включения inorder выполнения
9 параметров модели памяти
Как получилось?
(мели и течения)
Нужен отчет о моделировании
В стиле Hawk, вывод информации о
тактах через unsafePerformIO
Формирование отчета в функции f
автомата Мили и протаскивание с
комбинированием
Как получилось?
(мели и течения)
Стиль Hawk показался неудобным
Комбинирование потоков отчетов не
занимает много времени (сравнительно
с логикой узлов)
Для прогона программ “на время”
можно отрезать получение отчета
препроцессором. Тоже не большая
задача.
Как получилось?
(мели и течения)
Проблемы ghc (6.4):
Фиксированный размер кучи
Проблема со сборкой мусора
(пришлось отрубить уплотнение: +RTS
-c100)
Утечку локализовать не удалось
(профайлер)
Как получилось?
(мели и течения)
Утечка памяти снижала скорость
работы:
За время заполнения поколения T
накапливалось M лишних байт
Размер копируемой памяти линейно
рос
Время сборки мусора линейно росло
Как получилось?
(мели и течения)
Время выполнение N модельных тактов
росло, как O(N2)
Коэффициент при N2 был маленьким, но
был.
Скорость работы:
N<3000 - 1000 тактов в секунду
N=150000 - 10 тактов в секунду
Как получилось?
(мели и течения)
Уверенно гоняли задачи до 100
микросекунд модельного времени
(50000 тактов)
Этого оказалось достаточно для общих
выводов
Для продолжения работ пришлось бы
ликвидировать утечку
Как получилось?
(заключение)
Стыковка проста. Редкое качество.
Разобраться в чужом коде сложно. Не
такое уж редкое качество.
Изменения довольно легки.
Отладка проста, профайлинг - нет.
Общий объем кода - 3400 строк.
Модель ядра - 2120 строк.
Как получилось?
(заключение)
Начальство в целом довольно.
На модель устройства, которое не
делал никто из команды, уходит от
одной до трех недель (текущий проект)
На модель устройства, которое кто-то
делал - дни
С параметрами!
Как получилось?
(заключение)
По мотивам был сделан вариант для
Эрланга. Он был признан более
понятным для инженеров
Download