Restricciones de SDC para componentes reutilizables

Tengo un componente divisor de reloj basado en registro simple que puedo colocar cuando no tengo un PLL de repuesto:

library IEEE;

use IEEE.std_logic_1164.ALL;
use IEEE.numeric_std.ALL;

entity div128 is
    port(
        inclk0 : in std_logic;
        locked : out std_logic;
        c0 : out std_logic
    );
end entity;

architecture syn of div128 is
begin
    div : process(inclk0) is
        variable counter : unsigned(6 downto 0);
    begin
        if(rising_edge(inclk0)) then
            counter := counter + 1;
            c0 <= counter(6);
        end if;
    end process;

    locked <= '1';
end architecture;

Ahora me gustaría reutilizar este componente en varios lugares, en diferentes dominios de reloj, sin repetirme más de lo estrictamente necesario.

  • ¿Necesito crear una create_generated_clockdeclaración para cada instancia o puedo especificar una vez que cada instancia genere un -divide_by 128reloj a partir de su entrada?

  • ¿Podría también sacar el divisor de un genericparámetro y llevarlo a las restricciones de tiempo?

  • ¿Tendría sentido usar atributos aquí en lugar de un archivo SDC?

Respuestas (1)

Puede especificar comandos SDC dentro de su código VHDL con atributos ALTERA. La biblioteca PoC está utilizando esto para aplicar restricciones de tiempo relativas para sincronizadores:

architecture rtl of sync_Bits_Altera is
  attribute ALTERA_ATTRIBUTE  : string;

  -- Apply a SDC constraint to meta stable flip flop
  attribute ALTERA_ATTRIBUTE of rtl : architecture is "-name SDC_STATEMENT ""set_false_path -to [get_registers {*|sync_Bits_Altera:*|\gen:*:Data_meta}] """;
begin

Fuente: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/sync/sync_Bits_Altera.vhdl?ts=2

Creo que podría hacer un enfoque similar para su reloj generado.

Tenga en cuenta que c0no cumple con todos los requisitos para ser una señal de reloj .

Recibo una advertencia de TimeQuest que c0no está definida como un reloj, aunque se usa como tal. Probablemente ya no se pueda usar como una entrada PLL (pero tampoco lo es coreclk_outdesde el bloque PCIe, razón por la cual tengo tantos dominios de reloj en primer lugar.