Pregunta

El uso de pseudo código aquí. ¿Hay pros y los contras de estos estilos:

Supongamos que tiene una ALU que puede hacer complemento, AND, OR y XOR. Es mejor tener código que calcula las posibles respuestas todo el tiempo a continuación, seleccione la respuesta en base al código de operación (en este caso una caliente):

alu_add = a + b;
alu_and = a & b;
alu_or  = a | b;
alu_xor = a ^ b;

...

if(opcode[0])      alu_out = alu_add;
else if(opcode[1]) alu_out = alu_and;
else if(opcode[2]) alu_out = alu_or;
else if(opcode[3]) alu_out = alu_xor;

Una alternativa sería la de código de esta manera:

if(opcode[0])      alu_out = a + b;
else if(opcode[1]) alu_out = a & b;
else if(opcode[2]) alu_out = a | b;
else if(opcode[3]) alu_out = a ^ b;

También he visto como:

alu_add = a + b;
alu_and = a & b;
alu_or  = a | b;
alu_xor = a ^ b;

...

alu_out = 
  ( 8{opcode[0]} & alu_add ) |
  ( 8{opcode[1]} & alu_and ) | 
  ( 8{opcode[2]} & alu_or ) |
  ( 8{opcode[3]} & alu_xor );

¿Hay pros y los contras de cualquier método o hacer que salen de la misma al final?

¿Fue útil?

Solución

Piense en esto en términos de niveles de la lógica y la legibilidad. Las dos primeras formas son bien en términos de facilidad de lectura, pero ambos encarnan prioridad innecesariamente y dará lugar a más niveles de la lógica. También la tercera forma no es tan maravilloso por cualquiera de estas métricas. Por último, no hay razón aparente para utilizar una codificación en caliente aquí codificación binaria más. Así es como me gustaría código Este:

parameter ALU_ADD = 2'b00;
parameter ALU_AND = 2'b01;
parameter ALU_OR  = 2'b10;
parameter ALU_XOR = 2'b11;

reg [1:0]  opcode;  // 2 bits for binary coding vs. 4 for one-hot

// y más tarde, en su siempre bloquee:

case (opcode)  // synopsys parallel_case
    ALU_ADD: alu_out = a + b;
    ALU_AND: alu_out = a & b;
    ALU_OR:  alu_out = a | b;
    ALU_XOR: alu_out = a ^ b;
endcase

Aquí he valores a los códigos de operación de la ALU, evitando "números mágicos" y lo que es más fácil para que otros puedan entender lo que está sucediendo asignaron de forma explícita. También he utilizado la declaración del caso y se aplica una directiva que dice que mi herramienta de síntesis que hay más de una expresión se puede adaptar, por lo que se infiere ninguna codificador de prioridad. Yo no nombró las señales intermedias (alu_add etc.), porque se trata de operaciones triviales, pero con frecuencia lo hago cuando quiero un cómodo acceso a esas señales (ver a sus valores después de la simulación en un visor de forma de onda, por ejemplo).

Se puede obtener más información sobre el uso de declaraciones de casos efectivamente en este artículo de la excelente Sunburst Diseño sitio (sin afiliación, sólo un ex-estudiante).

Por último, acerca de su pregunta: "¿Es mejor tener código que calcula las posibles respuestas todo el tiempo a continuación, seleccione la respuesta en base al código de operación" - recuerda que Verilog es un lenguaje de descripción de hardware. Todas las implementaciones de esta página está calculando todo, todo el tiempo de todos modos. En lo que difieren es en los niveles de la lógica y la legibilidad. Echar un vistazo a esta página , lo que demuestra que mi aplicación tiene 1 nivel de la lógica más allá de las propias operaciones, donde la aplicación if-else tiene 3 niveles adicionales de la lógica.

Otros consejos

Los dos primeros le dará a la misma lógica, sino que obtendrá un pestillo en alu_out debido a su bloque if else (el codificador de prioridad) no tiene else final. (Esto es cierto para todos modos Verilog). Si el tiempo es escaso, es posible que tenga problemas con las rutas largas que un codificador de prioridad implica.

En la tercera versión, se obtendrá una estructura más 'paralelo' que puede ser mejor para medir el tiempo. No va pestillo.

En las tres versiones, cada una de las cuatro operaciones se traqueteo de distancia nomatter lo que el código de operación. Esto tendrá implicaciones de energía.

Es mi opinión que la primera versión gana para mayor claridad, y se puede obtener en cada una de las operaciones separadas en el visor de forma de onda cuando la depuración. No hay ningún punto en la codificación por algo que no es tan fácil de leer menos tiempo, de área o potencia limitaciones están sufriendo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top