2013-03-14 7 views
2

Je suis tombé sur la conception d'un codeur prioritaire et j'ai trouvé une nouvelle façon de le faire en utilisant une déclaration de cas. La seule chose qui prête à confusion, est-ce qu'une déclaration de cas donne la priorité aux cas? Exemple:Déclaration de cas dans verilog

case(1'b1)         
    A[3]: Y<=4'b1000;    
    A[2]: Y<=4'b0100; 
    A[1]: Y<=4'b0010; 
    A[0]: Y<=4'b0001; 
    default:Y<=4'b0000; 
endcase 

ici si je donne A comme 1111Y obtient 1000 i.e. il donne la priorité à la première déclaration de cas. Pourquoi est-ce vrai?

Répondre

5

Oui, il existe une priorité, basée sur la commande. Selon les spécifications Verilog-2001, l'article 9.5:

L'élément cas expressions sont évaluées et comparées dans l'ordre exact dans lequel ils sont donnés. Au cours de la recherche linéaire, si l'une des expressions d'élément case correspond à l'expression de cas donnée entre parenthèses, l'instruction associée à cet élément de cas doit être exécutée.

+0

Ohh. J'ai un doute alors. N'est-ce pas similaire à l'écriture d'une instruction if else? Alors pourquoi écrire une déclaration de cas? – aditya3524

+2

@ aditya3524 déclaration de cas est plus propre, et généralement préféré par rapport à d'autres chaînes. – Morgan

+1

Personnellement, j'ai rarement vu un codeur de priorité écrit de cette façon.Cela devrait être équivalent à un tas d'instructions if/else. C'est plus compact mais je trouve difficile à lire puisque la valeur à l'intérieur de case (...) est une constante. – dwikle

9

je serais refactorisons cela:

casez(A)         
    4'b1???: Y<=4'b1000;    
    4'b01??: Y<=4'b0100; 
    4'b001?: Y<=4'b0010; 
    4'b0001: Y<=4'b0001; 
    default: Y<=4'b0000; 
endcase 

Ensuite, il n'y a pas besoin de se soucier de priorité, chaque match est unique.

IEEE Std 1800-2009 (norme IEEE POUR SystemVerilog)

12.5.2 Expression constante dans le cas où la déclaration
Une expression constante peut être utilisée pour la expression_conditionnelle. La valeur de l'expression constante doit être comparée à l'expression case_item_expressions.

L'exemple suivant montre l'utilisation par la modélisation d'un codeur de priorité 3 bits:

logic [2:0] encode ; 

case (1) 
    encode[2] : $display("Select Line 2") ; 
    encode[1] : $display("Select Line 1") ; 
    encode[0] : $display("Select Line 0") ; 
    default $display("Error: One of the bits expected ON"); 
endcase 

12.5.3-cas unique, unique0 cas, et la priorité cas
Le Les mots clés case, casez et casex peuvent être qualifiés par des mots clés prioritaires, uniques ou uniques0 pour effectuer certaines vérifications de violation. On les appelle collectivement un cas de priorité, un cas unique ou un cas unique0. Une priorité-case doit agir sur le premier match seulement. Case-cas et unique0-case affirment qu'il n'y a pas de chevauchement case_items et qu'il est donc sûr que les arguments case_items soient évalués en parallèle.

...

priority casez(a) // values 4,5,6,7 cause a violation report 
    3’b00?: $display("0 or 1"); 
    3’b0??: $display("2 or 3"); 
endcase 

Je ne sais pas comment bien appuyé les déclarations de cas prioritaires sont pris en charge par des outils de synthèse bien.

+0

pleine SystemVerilog standard (2012) ici: https://standards.ieee.org/findstds/standard/1800-2012.html –