2017-08-11 6 views
1

Comment savoir si l'appel de $ cast est d'une fonction ou d'une tâche. Comment l'appel de chacun différerait-il? Une chose que je comprends est qu'avec l'appel de la fonction, je serai en mesure d'utiliser assert(). Mais à part ça, qu'est-ce qui nous dit si l'appel est de la fonction $ cast ou de la tâche $ cast? Dans les deux cas, nous ferions quelque chose comme $ cast (pkt, pkt1);

LRM donne la syntaxe des $ fonte fonction

function int $cast(singular dest_var, singular source_exp); 

et de la tâche $ jeté comme

task $cast(singular dest_var, singular source_exp); 

et poursuit en expliquant que

Utilisation de $ cast comme tâche ou une fonction détermine comment les affectations invalides sont gérées.

Lorsqu'il est appelé en tant que tâche, $ cast tente d'affecter l'expression source à la variable de destination. Si l'affectation est non valide, une erreur au moment de l'exécution se produit et la variable de destination reste inchangée.

Lorsqu'elle est appelée en tant que fonction, $ cast tente d'affecter l'expression source à la variable de destination et renvoie 1 si la conversion est autorisée. Si la distribution échoue, la fonction n'effectue pas l'affectation et renvoie 0. Lorsqu'elle est appelée en tant que fonction, aucune erreur d'exécution ne se produit et la variable de destination reste inchangée.

Veuillez expliquer.

+0

ou est-ce que LRM essaie vaguement de dire que l'utilisation de assert() ou si le bloc autour du cast $ choisirait la fonction $ cast, sinon la tâche cast? –

Répondre

1

Votre commentaire est correct: si $ cast est utilisé dans le cadre d'une expression, il est considéré comme une fonction. Ce libellé est dérivé de la terminologie Verilog lorsque les fonctions ne peuvent être utilisées que dans une expression et ne peuvent jamais exister en tant qu'expression simple comme un appel de tâche. Mais une fois que SystemVerilog a ajouté des fonctions avec des types de retour vides, ce libellé ne correspond plus aussi bien.