0

J'ai ajouté une assertion immédiate pour vérifier que deux registres ne sont pas programmés à la même valeur à un moment donné. J'obtiens un échec au temps 0fs parce que toutes les valeurs sont non initialisées et sont 'x'. Y at-il un moyen de désactiver proprement cette assertion seulement au moment initial? Erreur d'assertion immédiate SystemVerilog au temps 0fs

always @(*) begin 
    assert_reg_val_cmp: 
    assert (reg != 1'b1) else $error("...error msg..."); 
end 
Je pourrais utiliser la comparaison reg !== 1'b1, qui compare 'x' aussi, mais je veux attraper tous les 'x' après 0fs.

+0

Avez-vous un signal de réinitialisation que vous pouvez vérifier avant de vérifier l'assertion? – igon

+0

Je peux, mais je ne suis pas sûr de savoir comment la syntaxe va fonctionner. Je connais la syntaxe des assertions simultanées, mais où 'disable iff (reset! == 1'b1)' go? – Wilderness

+2

'désactiver iff' ne fonctionne pas une assertion immédiate. Vous pouvez utiliser: 'assert (reset === 1'b1 || reg! = 1'b1) else $ error (" ... erreur msg ... ");' ou 'if (reset == 1'b1) assert (reg! = 1'b1) else $ error ("... erreur msg ..."); ' – Greg

Répondre

0

Si vous utilisez SystemVerilog, s'il vous plaît utiliser always_comb au lieu de always @(*). Ce dernier a un problème en ce qu'il ne s'exécute pas si l'une des entrées s'avère être une constante.

Si vous voulez vous assurer qu'un registre est initialisé à l'instant 0, utilisez une assertion différée.

always_comb begin 
    assert_reg_val_cmp: 
    assert #0 (reg != 1'b1) else $error("...error msg..."); 
end 

Mais pourquoi ne voulez-vous pas utiliser une assertion simultanée pour cela?