Что быстрее с точки зрения закрытия времени, нескольких "если" или "если-еще"?
Допустим, у меня есть логика, зависящая от трех сигналов 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. Хотя вы не увидите такой ударной производительности, если у вас будет меньший сим, если бы это была какая-то логика, которая многократно создавалась на быстрых часах, она начала бы съедаться. сим циклы.