Dar libertad de síntesis para elegir la señal.

¿Hay algún tipo de no importa en Verilog (o VHDL) donde puedo decir:

"Use la señal A o la señal B, realmente no me importa porque serían funcionalmente equivalentes. Solo haga lo mejor que pueda, ¡buena suerte!"

Ejemplo:

module example
    (input wire [1:0] idx,  
     // Sometimes an address of 3 shows up, but in this case the 
     // output is irrelevant (not used/read).
     output wire [2+8-1:0] out);

    reg [8*3-1:0] mem_r;  // 3 words of 1 byte each, imagine content
    wire [1:0] idx_restricted;

    always @* begin
        if(idx == 3) begin
            idx_restricted = 2'b00;
        end else begin
            idx_restricted = idx;
        end
    end

    assign output = {idx, mem_r[8*idx_restricted +: 8]};  
    // ***Here "idx" could be either idx, or idx_restricted***
endmodule

Sin el idx_restricted, hay un fuera de los límites para el mem_r.

Alguien sabe de algo como esto?

¿Podrías explicar más? ¿Puedes pegar un ejemplo? Sin embargo, si las señales son equivalentes, ¿por qué considera elegir la otra?
¿Una puerta OR quizás?
Realmente no quería agregar un ejemplo porque quería mantener la pregunta en general. Pero traté de pensar en un ejemplo para aclarar la pregunta.
@Wossname: No estoy seguro de cómo sería eso. Me parece que eso solo agregaría más lógica. En ese caso, yo, como el que escribe el código, debería elegir una de las señales de alguna manera arbitraria.
No sé si esto realmente funcionaría, pero en VHDL podría crear una "bandera constante: std_logic: = '-';" luego configure su asignación para que sea "salida <= idx when flag='1' else idx_restricted"

Respuestas (4)

No. En lo que respecta a VHDL, son la misma señal o una señal diferente. Incluso si sabe que (por ejemplo) parten de la misma señal y pasan por dos puertas diferentes funcionalmente idénticas, o que son dos pines equivalentes de un bloque de E/S de un chip de propósito general, y puede elegir lo que hacen más tarde en el software.

Podrías hacerlo mandrónicamente, teniendo dos arquitecturas diferentes, una usando la señal A, otra usando la B, y ver cuál te dio la mejor síntesis. Eso funcionará para una señal incierta, pero rápidamente se volvería tedioso si necesitara comparar docenas o permutaciones de docenas. Ahí es cuando necesita iniciar la declaración 'generar', para crear esas arquitecturas para usted.

Si es el caso de que está asignando pines de bus, entonces solo tiene que hacer una puñalada inteligente en lo que probablemente sea mejor y dejar que las herramientas lo resuelvan. Solo comience a optimizar los pines si falla el enrutamiento.

mandrólicamente? Mandrólico: adj. una tarea larga y tediosa realizada manualmente en lugar de automáticamente.

No es necesario crear una variable idx_restricted separada. Verilog genera una X si el índice en mem_r está fuera de los límites, y eso se convierte en un no importa.

En el ejemplo proporcionado, esas dos señales son diferentes. Si el diseño puede funcionar con ambos, entonces, desde el punto de vista de síntesis/tiempo, debe usar idx. Esto se debe a idx_restrictedque, técnicamente es casi como el idx, todavía necesita decodificador cuando idx == 3. Eso es solo agregar otro nivel de lógica.

De todos modos, las herramientas de síntesis generalmente harán el trabajo correcto y muy a menudo optimizarán la lógica de una buena manera. No me preocuparía por eso, a menos que realmente esté mirando los problemas de rendimiento/tiempo.

Soy sobre todo curioso. Además, lo que dice que una lógica más superficial es mejor. Si está congestionado, supongo que podría ser más fácil enrutar si uso idx_restricted en lugar de tener que enrutar idx pasando el decodificador.

En principio, la respuesta a su pregunta es 'sí'. Un sintetizador puede tratar un valor X como indiferente, lo que puede llevar a una mejor minimización. En la práctica, sin embargo, esta es una muy mala idea. El problema fundamental es que la simulación trata los valores X como "desconocidos" o "comodines", que no es lo mismo que la interpretación del sintetizador. Esto significa que una simulación RTL de un diseño defectuoso puede pasar (incorrectamente), mientras que la simulación de netlist puede fallar (correctamente). Los verificadores de equivalencia también pueden fallar al detectar el error, es posible que obtenga informes de cobertura de código incorrectos, etc.

Mike Turpin escribió un buen artículo sobre esto hace años, véase aquí .

Supongo, por supuesto, que puede reescribir su código para pasar una X en el caso relevante.

Sí, se puede usar una X para representar una síntesis de caseína "no me importa" para una señal dada, pero no se puede usar para decir "No me importa qué señal usas". No existe tal cosa como un 'comodín' en la simulación, es desconocido.
@ElliotAlderson: comodín: consulte Verilog casex/ casezy VHDL case?; a "no me importa qué señal": mux, con una de las entradas Xpara el caso en que "la salida es irrelevante"
casexy casezse utilizan principalmente para controlar la síntesis . Usted dijo " la simulación trata a X... como... 'comodín'. Y no dijo nada sobre casexo casezen su respuesta original, ni aclaró que por 'valores X' se refería a valores en una expresión literal utilizada en a casexo casez. Y el simulador nunca dirá "la salida es irrelevante", dirá "la salida es desconocida". Las palabras tienen significado, y el significado importa.
@ElliotAlderson: Sí, la simulación se trata Xcomo 'desconocido o comodín'. 'comodín' es un término genérico común que se usa para describir casexy casez. Véase, por ejemplo, casexel artículo de Cummings. Tenga en cuenta que todos sus artículos son sobre simulación, no síntesis. No tuve que decir nada sobre casex, porque cualquiera que use Verilog regularmente sabrá lo que significa 'comodín'. No dije nada sobre 'irrelevante'; Simplemente cité el requisito del OP. Si realmente objeta mi respuesta, lea el artículo de Turpin, que vinculé.
Recuerde que no está escribiendo para alguien que "usa Verilog regularmente"... está tratando de ayudar a un recién llegado. Cuando dice "trata los valores X como 'desconocidos' o 'comodines'", la estructura de la frase no lo hace claro. ¿Hace el simulador una elección arbitraria y aleatoria entre 'desconocido' o 'comodín'? Si la entrada de una puerta AND es 'X', ¿se trata como un 'comodín'? Si la parte condicional de un operador ternario se evalúa como 'X', ¿el simulador decide arbitrariamente cuál de las opciones devolver? Puede que le guste 'comodín' pero IEEE Std 1364 usa 'do-not-care'.