Dynamic casting in SV using $cast function and task

Publish date: 2024-05-04

How can we tell if the calling of $cast is of a function or of a task. How would calling of each differ? One thing I understand is that with the function call, I'll be able to use assert(). But other than that, what tells us if the call is of the $cast function or the $cast task? In either case, we'd be doing something like $cast(pkt, pkt1);

LRM gives the syntax of the $cast function as

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

and of the $cast task as

task $cast( singular dest_var, singular source_exp ); 

and goes on to explain that

Use of $cast as either a task or a function determines how invalid assignments are handled.

When called as a task, $cast attempts to assign the source expression to the destination variable. If the assignment is invalid, a run-time error occurs, and the destination variable is left unchanged.

When called as a function, $cast attempts to assign the source expression to the destination variable and returns 1 if the cast is legal. If the cast fails, the function does not make the assignment and returns 0. When called as a function, no run-time error occurs, and the destination variable is left unchanged.

Please explain.

1

1 Answer

Your comment is correct: if $cast is used as part of an expression, it is considered called as a function. That wording is derived from Verilog terminology when functions could only be used in an expression and never could exist as a simple statement like a task call. But once SystemVerilog added functions with void return types, that wording does not fit as well anymore.

ncG1vNJzZmirpJawrLvVnqmfpJ%2Bse6S7zGiorp2jqbawutJoa25uY2qFeYOOnbCnmZ2esG6vwKyroqaXYravedKvZK6rmaO0bq%2FArKtmnqWjsLW1zqdkmqaUYsGiv8o%3D