Pregunta

Necesito implementar un 4-a-1 en función de Veriog.La entrada es de 4 bits, un número de 0-15.La salida es de un solo bit, 0 o 1.Cada entrada proporciona una salida diferente y la asignación de las entradas en salidas que se conoce, pero las entradas y salidas no son en sí.Quiero vcs con éxito optimizar el código y también tienen que ser lo más corto/más prolija posible.Mi solución hasta el momento:

wire [3:0] a;
wire b;
wire [15:0] c;

assign c = 16'b0100110010111010; //for example but could be any constant
assign b = c[a];

Tener que declarar c es feo y no sé si vcs reconocerá el K-mapa de allí.En este trabajo, así como una declaración de caso o una asignación en forma normal conjuntiva?

¿Fue útil?

Solución

Lo que tiene está muy bien.Una declaración de caso también funcionaría igual de bien.Es sólo una cuestión de cómo expresiva usted desea ser.

Su solución, indexación, funciona bien si la selección de codificaciones no tiene ningún significado especial (una dirección de memoria selector, por ejemplo).Si la selección codificaciones tienen algo de especial significado semántico a que el diseñador (y no hay muchos de ellos), y luego ir con un caso de la declaración y de las enumeraciones.

Síntesis sabio, no importa que uno utiliza.Cualquier decente herramienta de síntesis, se producirá el mismo resultado.

Otros consejos

Estoy totalmente de acuerdo con Dallas.El uso de una instrucción case - hace que su intención más clara.La herramienta de síntesis va a construir como una tabla de búsqueda (si es en paralelo) y optimizar todo lo que pueden.

También, yo no me preocuparía mucho acerca de cómo mantener su RTL código corto.Me gustaría disparar para mayor claridad en primer lugar.Las herramientas de síntesis son más listos de lo que usted piensa...

Mi preferencia si tiene sentido para su problema - es para un caso de declaración que hace uso de enumeraciones o `define.Cualquier cosa para hacer que la revisión del código, el mantenimiento y la verificación más fácil.

Por cosas como esta, RTL claridad por encima de todo por un amplio margen.SystemVerilog tiene especial bloquear siempre directivas para dejar claro cuando el bloque debe sintetizar a la lógica combinacional, pestillos, o flops (y su herramienta de síntesis debe producir un error si has escrito RTL que los conflictos con los que (por ejemplo,no incluye todas las señales en la sensibilidad a la lista de un bloque).También ser conscientes de que la herramienta probablemente reemplace cualquier codificación que tiene con la mayoría de hardware de codificación eficiente (el que minimiza el área total de su diseño), a menos que la codificación en sí se propaga a los pines de la parte superior a nivel de módulo.

Este consejo va en general, así.Hacer que el código sea fácil de entender por los humanos, y probablemente será más comprensible para la herramienta de síntesis, que permite de manera más efectiva llevar literalmente miles de años-hombre de los algoritmos de la investigación para influir en su RTL.

También puede codificar mediante operadores ternarios si te gusta, pero preferiría algo como:

always_comb //or "always @*" if you don't have an SV-enabled tool flow
begin 
  case(a)
  begin
    4'b0000: b = 1'b0;
    4'b0001: b = 1'b1;
    ...
    4'b1111: b = 1'b0;
    //If you don't specify a "default" clause, your synthesis tool
    //Should scream at you if you didn't specify all cases,
    //Which is a good thing (tm)
  endcase //a
end //always

Al parecer, yo estoy usando una pésima herramienta de síntesis.:-) Yo sintetiza ambas versiones (sólo el módulo usando un modelo basado en el fan-out para alambre de retrasos) y la indexación de la versión de la pregunta que dio una mejor sincronización y el área de los resultados que en el caso de las declaraciones.El uso de Synopsys DC Z-2007.03-SP.

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