Эффективный синтез функции 4-в-1 в Verilog - PullRequest
3 голосов
/ 04 сентября 2008

Мне нужно реализовать функцию 4-к-1 в Veriog. На входе 4 бита, число от 0 до 15. Выход представляет собой один бит, 0 или 1. Каждый вход дает различный выход, и сопоставление входов и выходов известно, а сами входы и выходы - нет. Я хочу, чтобы vcs успешно оптимизировал код, а также чтобы он был максимально коротким / аккуратным. Мое решение пока:

wire [3:0] a;
wire b;
wire [15:0] c;

assign c = 16'b0100110010111010; //for example but could be any constant
assign b = c[a];

Необходимость объявить c ужасна, и я не знаю, распознает ли vcs K-карту там. Будет ли это работать так же, как заявление о кейсе или присвоение в нормальной форме?

Ответы [ 5 ]

5 голосов
/ 16 сентября 2008

То, что у вас есть, хорошо. Заявление о ситуации также будет работать одинаково хорошо. Это просто вопрос того, насколько выразительным ты хочешь быть.

Ваше решение, индексация, работает нормально, если выбранные кодировки не имеют какого-либо специального значения (например, селектор адресов памяти). Если выбранные кодировки действительно имеют какое-то особое семантическое значение для вас, дизайнера (и их не так уж много), то используйте оператор case и перечисления.

Синтез мудрый, не имеет значения, какой вы используете. Любой приличный инструмент синтеза даст тот же результат.

3 голосов
/ 04 сентября 2008

Я полностью согласен с Далласом. Используйте утверждение случая - оно проясняет ваши намерения. Инструмент синтеза создаст его как справочную таблицу (если она параллельна) и оптимизирует все, что может.

Кроме того, я бы не стал так сильно беспокоиться о том, чтобы ваш RTL-код был коротким. Я бы стрелял для ясности первым. Инструменты синтеза умнее, чем вы думаете ...

2 голосов
/ 19 сентября 2008

Для подобных вещей ясность RTL превосходит все с большим отрывом. SystemVerilog имеет специальные директивы всегда блока, чтобы было ясно, когда блок должен синтезироваться в комбинационную логику, защелки или флопы (и ваш инструмент синтеза должен выдавать ошибку, если вы написали RTL, который конфликтует с этим (например, не включая все сигналы в список чувствительности всегда блока). Также имейте в виду, что инструмент, вероятно, заменит любую кодировку, которую вы имеете, на наиболее аппаратно-эффективную кодировку (ту, которая минимизирует область вашего общего проекта), если только сама кодировка не распространяется на контакты. вашего модуля верхнего уровня.

Этот совет, в общем, тоже подходит. Сделайте ваш код легким для понимания людьми, и он, вероятно, будет более понятен и инструменту синтеза, что позволит ему более эффективно использовать буквально тысячи человеко-лет исследований алгоритмов для вашей RTL .

Вы также можете закодировать его, используя троичные операторы, если хотите, но я бы предпочел что-то вроде:

always_comb //or "always @*" if you don't have an SV-enabled tool flow
begin 
  case(a)
  begin
    4'b0000: b = 1'b0;
    4'b0001: b = 1'b1;
    ...
    4'b1111: b = 1'b0;
    //If you don't specify a "default" clause, your synthesis tool
    //Should scream at you if you didn't specify all cases,
    //Which is a good thing (tm)
  endcase //a
end //always
2 голосов
/ 04 сентября 2008

Мое предпочтение - если оно имеет смысл для вашей проблемы - это утверждение case, использующее перечисления или `определения. Что угодно, чтобы упростить просмотр, обслуживание и проверку кода.

1 голос
/ 12 октября 2008

Видимо, я использую паршивый инструмент синтеза. :-) Я просто синтезировал обе версии (только модуль, использующий модель, основанную на разветвлениях для задержек проводов), и версия индексации из вопроса дала лучшие временные и пространственные результаты, чем заявления случая. Использование Synopsys DC Z-2007.03-SP.

...