Devido a um problema no software Intel® Quartus® Prime versão 16.0 e posterior, você pode ver que o atributo de "no_rw_check" é ignorado se você declarar a saída da RAM a um sinal intermediário em vez da porta de saída. Este problema não ocorre no software Intel Quartus Prime versão 15.1 e anterior.
Se você tiver um projeto migrado para a versão do software Intel Quartus Prime 16.0 e mais recente, verifique o relatório sob análise e síntese de configurações > LPM_Parameter -> RAM. Certifique-se de que o parâmetro READ_DURING_WRITE_MODE_MIXED_PORTS tenha um valor de DON'T CARE se o atributo "no_rw_check" for usado.
Exemplo abaixo mostra o código do atributo 'no_rw_check' detectado no software Intel Quartus Prime versão 16.0 em diante:
Ieee BIBLIOTECA;
USE IEEE.STD_LOGIC_1164.ALL;
RAM ENTIDADE É
PORTA (
clock: in STD_LOGIC;
dados: EM STD_LOGIC_VECTOR (2 DOWNTO 0);
write_address: NO INTERVALO INTEIRO DE 0 a 31;
read_address: NO INTERVALO INTEIRO DE 0 a 31;
nós: em STD_LOGIC;
q: OUT STD_LOGIC_VECTOR (2 DOWNTO 0)
);
RAM END;
RTL ARQUITETURA DE RAM É
TIPO MEM É ARRAY(0 A 31) DE STD_LOGIC_VECTOR(2 DOWNTO 0);
SINAL ram_block: MEM;
RAMSTYLE ATTRIBUTE: string;
RAMSTYLE ATRIBUTO de ram_block: o sinal é "no_rw_check";
SINAL read_address_reg: FAIXA DE INTEIROS DE 0 a 31;
SINAL q_reg: STD_LOGIC_VECTOR (2 DOWNTO 0);
COMEÇAR
PROCESSO (clock)
COMEÇAR
IF (clock'event and clock = '1') ENTÃO
SE (nós = '1') ENTÃO
ram_block(write_address) <= dados;
TERMINAR SE;
read_address_reg <= read_address;
TERMINAR SE;
código de ponta do atributo no_rw_check não detectado na versão 16.0 do software Prime Intel Quartus versão 16.0
------------------------------------------------------------------------------------
IF (clock'event and clock = '1') ENTÃO
q_reg <= ram_block(read_address_reg);
TERMINAR SE;
q <= q_reg;
------------------------------------------------------------------------------------
PROCESSO FINAL;
RTL END;
Para resolver este problema, ligue a lógica de adicionar pass-through para RAMs inferidos no
Configurações de > -> do compilador -> configurações avançadas (síntese)
Ou
Declare o sinal de saída da RAM como porta de saída sem usar sinal intermediário, substituindo o código de ponta acima pelo código abaixo:
------------------------------------------------------------------------------------
IF (clock'event and clock = '1') ENTÃO
q <= ram_block(read_address_reg);
TERMINAR SE;
------------------------------------------------------------------------------------
Este problema está programado para ser corrigido em uma versão futura do software Intel Quartus Prime Pro edition.