Quiero entender cómo se sintetizan diferentes construcciones en código VHDL en RTL.
PD: He visto una pregunta relacionada "Múltiples sentencias if en proceso en vhdl", pero eso no responde a mi pregunta de todos modos.
¿Alguien puede decirme la diferencia entre la construcción If-Else y las construcciones de declaraciones Case de un proceso en VHDL en términos de cómo la herramienta de síntesis infiere el código en el circuito RTL?
La if-elsif-else
construcción infiere una red de enrutamiento de prioridad:
simular este circuito : esquema creado con CircuitLab
esto corresponde a
if bool_expr_1 then
sig <= val_expr_1;
elsif bool_expr_2 then
sig <= val_expr_2;
elsif bool_expr_3 then
sig <= val_expr_3;
else
sig <= val_expr_4;
end if;
La case
construcción, por otro lado, infiere un gran ol 'mux:
esto corresponde a
case case_expr is
when c0 =>
sig <= val_expr_0;
when c1 =>
sig <= val_expr_1;
when c2 =>
sig <= val_expr_2;
...
when others =>
sig <= val_expr_N;
end case;
Obviamente, estos son diseños muy simplificados con una sola expresión de valor, lo que da como resultado una salida.
Considere el caso de múltiples if-else anidados y la combinación de sentencias de caso con la construcción if-else dentro de un proceso.
Según lo anterior, puede ver cómo anidarían/mezclarían.
¿También cuándo usar qué construcción?
Dado que if-else
infiere prioridad, debe usarse cuando pueda ocurrir más de una condición de entrada. Usar case
, por otro lado, es apropiado cuando las entradas son mutuamente excluyentes.
if-else
construcción, sin embargo, es donde surge esa cadena. La primera condición debe fallar para que se pruebe la segunda condición. Este no es el caso para, er, la case
construcción, y es por eso que una if-else
declaración no se pudo sintetizar como un mux grande único.case
declaración también puede generar lógica secuencial. Encontré "Real World VHDL" , una serie de diapositivas de conferencias de la Universidad de Glasgow, que pueden serle útiles.En esta antigua publicación de blog , el autor escribió y sintetizó dos versiones funcionalmente equivalentes del código VHDL. Uno usando if-else, el otro usando case. El resultado:
Sinteticé este código y obtuve los resultados exactos. Incluso el esquema RTL era exactamente el mismo para ambos programas.
Y su conclusión:
Esto muestra que las sentencias 'case' y 'if...elsif...else' son igualmente eficientes. Pero si quiere escribir un código claro, entonces mejor use 'case'. 'case' es muy útil cuando el la salida depende de una gran cantidad de condiciones. Pero si la cantidad de condiciones es muy pequeña (2 o 3), entonces puede usar 'if..elseif..else'.
También hay docenas de publicaciones sobre este tema en Stack Overflow para todos los idiomas imaginables. La conclusión es generalmente la misma, que no hay diferencia en cuanto al rendimiento. Ocasionalmente, si hay una gran cantidad de casos, un compilador puede ser lo suficientemente inteligente como para crear una tabla de búsqueda que produzca un rendimiento ligeramente mejor.
Un sintetizador VHDL puede ser capaz de hacer algo similar. Pero aún necesitaría una gran cantidad de casos, en cuyo caso (juego de palabras) probablemente querrá usar una declaración de caso de todos modos, ya que proporciona una mejor legibilidad donde hay una gran cantidad de opciones.
Polinomio
dec
/jz
instrucciones, lo cual es mucho más eficiente. Quizás se aplique aquí una optimización similar.W5VO