Что быстрее с точки зрения закрытия времени, нескольких «если» или «если-еще»? - PullRequest
0 голосов
/ 17 октября 2018

Допустим, у меня есть некоторая логика, зависящая от трех сигналов a, b и c для назначения переменной d.

Если я знаю, a и b и c логически (как в Я знаю, что они будут, инструмент не обязательно сможет это выяснить)будет взаимоисключающим, что будет быстрее с точки зрения синтезированного результата?

Это:

always @(posedge clk) begin

   if (a) begin
       d <= foo;
   end

   if (b) begin
       d <= bar;
   end

   if (c) begin
       d <= fizz;
   end

end

Или это:

always @(posedge clk) begin

   if (c) begin
       d <= fizz;
   end else if (b) begin
       d <= bar;
   end else if (a) begin
       d <= foo;
   end

end

Я думаю, чтопервый, потому что там меньше вложенности, так как там нет проверки, затем проверьте это, затем проверьте это.Но я бы сказал последнее, потому что, если одно условное вычисление оценивается первым, ему не нужно учитывать результаты других условий.Но, возможно, я ошибаюсь и что-то упускаю.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Обе части кода приведут к приоритетному мультиплексированию.Единственное отличие состоит в том, что порядок приоритета определяется вами / инструментом синтеза во втором / первом фрагментах кода соответственно.

Однако, если вы ориентируетесь на этот код для ПЛИС, вы можете встроить взаимоисключающийчасть в код с чем-то вроде этого

always@(*)
begin
    case ( {a,b,c} )
    3'b000: d_in <= d;
    3'b001: d_in <= foo;
    3'b010: d_in <= bar;
    3'b100: d_in <= fizz;
    endcase
end

always@(posedge clk)
begin
    d<=d_in;
end 

С уважением, Bharadwaj

0 голосов
/ 30 октября 2018

Большинство инструментов синтеза, скорее всего, будут создавать одну и ту же логику для обоих на основе того, как вы ее структурировали, причем первый случай - это a-> b-> c, а второй - c-> b-> a в отношении условных проверок.

С учетом сказанного ...

Тот, кому нужно взглянуть на это, потенциально не будет знать об исключительности логики, что может привести к неправильному управлению ею, если эти условные проверки контролируются каким-либовнешние сигналы.Также трудно читать с точки зрения необходимости действительно исследовать код.If / else четко различает «если это, еще сделай это», и нет никакой двусмысленности в отношении результата.Мне пришлось взглянуть на порядок if в первой структуре, прежде чем я увидел, что вы делаете, и как это соответствует.

Поскольку мы говорим о скорости логики, мы также можем обсудить скорость симулятора.На вашей первой структуре вы теперь заставляете симулятора делать 3 проверки.2-й может быть всего 1 и выше 3. Хотя вы не увидели бы эту эффективность воздействия, если бы у вас был меньший сим, если бы это была какая-то логика, которая многократно создавалась на быстрых часах, она начала бы съедатьсим циклы.

...