#synthesis #yosys
#синтез #yosys
Вопрос:
У меня есть следующий очень простой модуль verilog, который в зависимости от операции ввода выполняет либо a b, либо a-b.
module addsub (a, b, op, r);
parameter DATA_WIDTH = 4;
input [DATA_WIDTH-1:0] a, b;
input op;
output [DATA_WIDTH-1:0] r;
assign r = op ? a-b : a b;
endmodule
Теперь, когда я синтезирую этот код с помощью yosys (версия 0.9, сценарий ниже) Я получаю два модуля $ alu, оба из которых подаются на входы a и b, где у каждого есть свои входные данные CI и BI. Выходные данные r генерируются с использованием мультиплексора.
read_verilog addsub.v
synth -flatten -run begin:fine
#share -aggressive; opt
show
Тем не менее, я хотел бы, чтобы yosys признал, что необходим только один $ alu, где входы CI и BI подключены к op. Следовательно, я попробовал команду share (прокомментирована в приведенном выше сценарии), и действительно, два $ alu объединены в один, но теперь я получаю странную (избыточную) структуру мультиплексора на входах a и b, смотрите здесь .
Мой вопрос в том, что я делаю не так, есть ли специальный проход, чтобы избавиться от этих мультиплексоров, или я здесь совершенно не на том пути?
Решение, предложенное Дэвидом Шахом: в версии yosys, которую я установил, не было команды opt_share. Следовательно, я скомпилировал текущую версию (0.9 3558), и теперь следующий сценарий синтеза работает так, как ожидалось:
read_verilog addsub.v
synth -flatten -run begin:fine
share -aggressive; opt
opt_share; opt
show
Ответ №1:
Переход, который вы ищете, является opt_share
, но он может быть новее, чем версия 0.9, и в этом случае вам понадобится Yosys от git master.