Что быстрее с точки зрения закрытия времени, нескольких "если" или "если-еще"?

Допустим, у меня есть логика, зависящая от трех сигналов 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 ответа

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

Однако если вы нацеливаете этот код на FPGA, вы можете встроить взаимоисключающую часть в код с помощью чего-то подобного

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 

С уважением, Бхарадвадж

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

С этим сказал...

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

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

Другие вопросы по тегам