Task #5149
closed[parser][cfg] Слияние процессов непрерывного присваивания
100%
Description
Предлагается сливать несколько маленьких процессов непрерывного присваивания в один. Два процесса соединяются, если каждый из них содержит только один базовый блок, а списки чувствительности совпадают.
assign a = x | y; => PROCESS(x, y) { a := x | y; } => PROCESS(x, y) { a := x | y; assign b = x & y; => PROCESS(x, y) { b := x & y; } b := x & y; }
Updated by Sergey Smolov over 10 years ago
Присваивания в разные процессах принудительно делаем concurrent.
Проверить работу backend'а можно на fifo.v
Updated by Sergey Smolov over 10 years ago
- Status changed from New to Resolved
- % Done changed from 0 to 100
- Published in build set to r832
Компонент реализован как класс parser.basis.backend.CfgProcessBackend
В текущей реализации сделать присваивание (или мульти-присваивание) concurrent-ным невозможно, т.к. это свойство зависит лишь от того, какой сущности присваивается значение (сигналу, или нет).
Updated by Alexander Kamkin over 10 years ago
Что понимается под "сигналом"? В CFG переменные делятся на входы/выходы и внутренние переменные. Для выходов и внутренних переменных определены как блокирующие, так и неблокирующие присваивания.
В Verilog принята следующая классификация. Говоря упрощенно, есть wire и reg - для wire определены непрерывные присваивания, для reg - процедурные. Процедурные делятся на блокирующие и неблокирующие. Выходы могут быть как wire, так и reg. Внутренние переменные могут быть как wire, так и reg.
Непрерывные присваивания у нас моделируются процедурными путем введения дополнительных процессов. Таким образом, в модели CFG нет wire. Признак блокирующего/неблокирующего присваивания можно устанавливать сверху.
Updated by Sergey Smolov over 10 years ago
- Published in build changed from r832 to r834
В класс AssignStatement добавлен булевский флаг isConcurrent. В CfgProcessBackend реализовано слияние процессов, содержащих один базовый блок и имеющих один и тот же список чувствительности. На выходе бэкэнда строится процесс, имеющий один базовый блок, содержащий набор утверждений из базовых блоков исходных процессов. Каждое утверждение является concurrent-ным.
Updated by Sergey Smolov over 10 years ago
- Published in build changed from r834 to r841
Поправка - слиянию подлежат только процессы, построенные вокруг присваиваний неблокирующего типа (concurrent).
Updated by Alexander Kamkin over 10 years ago
- Status changed from Resolved to Closed