Оптимизация сложения / вычитания в Yosys

#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.