Detectar registros que não são redefinidos

8

Ao escrever o Verilog, uso uma variedade de "linters" que fornecerão erros e avisos. Estes são meu simulador (ModelSim), meu compilador (Quartus II) e um linter (Verilator). Juntos, tenho uma boa cobertura para armadilhas comuns, como diferenças de tamanho de ônibus e travas inferidas.

Infelizmente, nenhuma das três ferramentas detecta registros que não estão sendo redefinidos. Para entender o que quero dizer, considere o seguinte.

reg a;
reg b;

always @(posedge clk_i or posedge rst_i) begin
  if(rst_i) begin
    a <= 1'b0; // Reset a
    // Ooops, forgot to reset b
  end else begin
    // Do stuff with a and b
  end
end

Como posso fazer com que minhas ferramentas detectem automaticamente registros que não estão sendo redefinidos?

Randomblue
fonte
2
"registros que não são redefinidos" não são necessariamente uma coisa ruim (pelo menos em um design de silício), e pode ser por isso que eles não são avisos em ferramentas de fiapos. Em geral, você deseja redefinir apenas os registros que precisam ser redefinidos, pois adicionar redefinições a chinelos aumenta sua área e a carga na rede de redefinição. Se você tiver um barramento de dados de 256 bits e um sinal 'válido' de um bit, não será necessário redefinir os dados se você redefinir o válido.
Tim
Synplicity (ferramenta de síntese) alerta sobre essas coisas. Chato, porque eles são muitas vezes intencional ... mas pode ajudar com sua situação (assumindo Synplicity faz Verilog, eu nunca tentei)
Brian Drummond
A pergunta afirma que uma variedade de linters está sendo usada, ModelSim, Quartus II e Verilator. Essas ferramentas têm recursos limitados de linting e os tipos de problemas que eles procuram são bastante limitados.
Travisartley

Respostas:

3

Nenhuma das ferramentas que você mencionou é uma ferramenta de aprendizado real. Essas ferramentas não devem fornecer uma boa cobertura de fiapos.

Vi duas ferramentas comerciais de fiapos e ambas tinham regras para detectar flops não redefinidos.

Eu vejo três opções:

  1. Se a resposta de David Kessner funciona para você - caminho a percorrer.
  2. Obtenha uma ferramenta decente de fiapos que fará o trabalho.
  3. Escreva um script que detecte flops não redefinidos.

Agora, o número 2 pode não ser tão simples. Não sei se existem bons aplicativos gratuitos por aí, e os profissionais são caros e levarão muito tempo para você configurar.

# 3 é a abordagem que eu usaria. Se você conhece alguma linguagem de script (Perl, Python, ...), você precisará de um dia no máximo para escrever um script que procure flops não redefinidos. Se você não conhece nenhuma linguagem de script, há o StackOverflow onde você pode pedir ajuda - alguns dias e está pronto. Isso também adicionará outra ferramenta à sua caixa de ferramentas pessoal, que é muito valorizada entre os designers de front-end - escrevendo scripts de processamento de texto.

Boa sorte!

Vasiliy
fonte
4

Quando executo o Modelsim nos meus projetos de VHDL, ele me dá avisos em Time = 0ps sobre a lógica com sinais de entrada do tipo 'X' ou 'U'. Eu esqueço a mensagem de aviso exata. Passar por esses avisos pode me dizer o que não inicializei.


fonte
1

Confio nos testes funcionais, em vez de nas ferramentas de fiapos, pois costumo alternar as redefinições e reproduzir novamente as partes do banco de testes. Se o dispositivo funcionar corretamente após a redefinição, você redefiniu o espaço de estado o suficiente, ou sua bancada de testes não é boa!

shuckc
fonte
0

Às vezes, as ferramentas de design produzem uma série de relatórios que fornecem todos os tipos de informações interessantes. Por exemplo, o Xilinx pode chamar isso de Relatório de Mapa, que informa quais componentes lógicos foram mapeados para quais componentes físicos.

No exemplo acima, reg a seria mapeado para um FDCE (Flip flop, D, com Clear assíncrono e clock Enable), enquanto reg b seria mapeado para um FDE (Flip flop, D e clock Enable). Isso indica que o registro b não foi zerado.

ajs410
fonte