2013-10-10 4 views
0

J'ai vu le code Verilog où l'opérateur ou l'opérateur bitwise ("|") est utilisé monadic. Quel est le but?Verilog bitwise ou ("|") monadique

Par exemple

| address[15:14]==0 

ou

|address[15:14]? io_din : ramrd 

cann't nous omettons le "|" dans ces cas?

Répondre

3

Dans ce cas, il agit comme un opérateur de réduction, par exemple:

|4'b1000 => 1'b1 (OR) 
&4'b1000 => 1'b0 (AND) 
^4'b1000 => 1'b1 (XOR) 

|4'b0000 => 1'b0 
&4'b1111 => 1'b1 
^4'b1111 => 1'b0 

ORing le bus entier à une valeur de 1 bit, ou l'application d'un ET/XOR au bus entier.

Ceci est appelé un opérateur 'unaire' car il ne prend qu'un argument de droite. Ils sont traités dans la Section 11.4.9 de SystemVerilog IEEE1800-2012.

2
|address[15:14]? io_din : ramrd 

est le raccourci pour écrire

(address[15] | address[14]) ? io_din : ramrd 

i.e. au niveau du bit ORing de tous les bits du bus en même temps pour générer une valeur de 1 bit. Dans ce cas, il sera évalué comme ÉLEVÉ si l'un (ou les deux) bits 15 OU OR 14 est ÉLEVÉ.

vous pouvez écrire d'autres de la même

opérateurs au niveau du bit
&address[15:14]? io_din : ramrd // ANDing 

^address[15:14]? io_din : ramrd // XORing 
+0

Notez que 'test? if_true: if_false' est identique à '| test? if_true: if_false' - le '|' est redudant lorsqu'il est utilisé dans un contexte booléen – Eric

1

Dans les exemples fournis, le code avec | est fonctionnellement équivalent à la même code avec le | omis. Trois raisons possibles d'avoir et de garder le | pour le code fourni sont:

  1. Il donne des conseils au synthétiseur: premier ou le address bits de comparer ensuite à 0, au lieu de comparer chaque address bit à 0 puis ANDing les résultats . C'est le même résultat fonctionnel avec différentes configurations de portes.
  2. Il suit un style de codage ou une exigence de style de formatage.
  3. Il suffit de lire mieux (visuellement/structurellement attrayant), car il ya un |address[15:14]==1 sur une ligne proche de code à |address[15:14]==0. (Rappel: |address[15:14]==1 est pas le même que address[15:14]==1)
+0

Bien que 'address [15:14]! = 0' soit probablement plus lisible que' | address [15:14] == 1' – Eric

0

Sur la question précise de savoir si le '|' peut être omis dans ces cas:

Si |address[15:14] et address[15:14] sont identiques dépend du contexte (en général, ils ne le sont pas, car les inconnus sont gérés différemment). Votre premier exemple comparé à 0, et il est vrai que le | peut être abandonné dans ce cas particulier, mais ce ne serait pas vrai si vous comparez à autre chose que 0.

Votre deuxième exemple est plus compliqué. Le LRM ne semble pas spécifier comment la première expression d'un ternaire est évaluée.Je connais 2 sims qui l'évaluent comme une réduction-OU, donc le | peut être abandonné dans ces cas. Cependant, si un sim évalue à la place de la même manière qu'un if (c'est-à-dire if(address[15:14])), le | est requis.

La synthèse est plus simple, bien sûr, puisque le synthétiseur n'a pas à s'inquiéter des inconnues.