System Verilog : Array querying system functions

System Verilog provides some system functions to query about arrays. The return value of this system function is `int` and it can be applied to all arrays.

Different array querying functions are

$dimension :
Returns the number of dimensions in the array and 1 for strings and simple bit vectors and 0 for any other type.

module array_query1; 

typedef logic [15:0] mem_t [1:63];
var mem_t mem;

logic [7:0][15:0] myarr [2:0][3:0]; 

initial 
begin 
 $display("Dimesion of mem : %0d", $dimensions(mem));            
 $display("Dimesion of myarr : %0d", $dimensions(myarr));        
end 
endmodule 

/*
ncsim> run
Dimesion of mem : 2
Dimesion of myarr : 4
*/

Here there are two dimensions for mem i.e. one `packed` and one `unpacked` ( [15:0] and 1:63]).For myarr there are two `packed` and two `unpacked` dimensions. So total 4.

$unpacked_dimensions :
Returns the number of unpacked dimensions of an array and 0 for any other type.

module array_query2; 
typedef logic [15:0] mem_t [1:63];

logic [7:0][15:0] myarr [2:0][3:0]; 
var mem_t mem;

initial 
begin 
 $display("Unpacked dimesion of mem : %0d", $unpacked_dimensions(mem_t));
 $display("Unpacked dimesion of myarr : %0d", $unpacked_dimensions(myarr));
 
end 
endmodule 
/*
ncsim> run
Unpacked dimesion of mem : 1
Unpacked dimesion of myarr : 2
*/

Here, one unpacked dimension for mem (i.e. 1:63) and 2 unpacked dimensions for myarr (2:0,3:0).

$left :
Returns the left declared bound of the dimension.

module array_query3; 
typedef logic [15:0] mem_t [1:63];

logic [7:0][15:0] myarr [2:0][3:0]; 
var mem_t mem;

initial 
begin 
 $display("$left of mem : %0d", $left(mem));            
 $display("$left of myarr : %0d", $left(myarr));        
end 
endmodule 
/*
ncsim> run
$left of mem : 1
$left of myarr : 2
*/

Here first unpacked dimension will be used. For mem, 1:63 is the unpacked dimension and left bound is 1.
For myarr, 2:0 is the unpacked dimension and 2 will be the $left value.

$right :
Returns the right declared bound of the dimension.

module array_query4; 
typedef logic [15:0] mem_t [1:63];

logic [7:0][15:0] myarr [2:0][3:0]; 
var mem_t mem;

initial 
begin 
 $display("$right of mem : %0d", $right(mem));            
 $display("$right of myarr : %0d", $right(myarr));        

end 
endmodule 
/*
ncsim> run
$right of mem : 63
$right of myarr : 0
ncsim: *W,RNQUIE: Simulation is complete.
*/

Just like $left, $right will be the right bound. So for mem, 1:63 is the dimesion and $left value is 1 and $right value is 63.For myarr $left is 2 and $right is 0.

$low :
Returns the lowest declared bound of the dimension.

module array_query5; 
typedef logic [15:0] mem_t [1:63];

logic [7:0][15:0] myarr [2:0][3:0]; 
var mem_t mem;

initial 
begin 
 $display("$low of mem : %0d", $low(mem));            
 $display("$low of myarr : %0d", $low(myarr));        

end 
endmodule
/* 
ncsim> run
$low of mem : 1
$low of myarr : 0
*/

Lowest declared bound of the dimension for mem is 1 and for myarr is 0.

$high :
returns the highest declared bound of the dimension.

module array_query6; 
typedef logic [15:0] mem_t [1:63];

logic [7:0][15:0] myarr [2:0][3:0]; 
var mem_t mem;

initial 
begin 
 $display("$high of mem : %0d", $high(mem));            
 $display("$high of myarr : %0d", $high(myarr));        
end 
endmodule 
/*
ncsim> run
$high of mem : 63
$high of myarr : 2
ncsim: *W,RNQUIE: Simulation is complete.
*/

Highest declared bound of the dimension for mem is 63 and for myarr is 2.

$increment :
Returns 1 if the left bound is greater than or equal to the right bound and -1 otherwise.

module array_query7; 
typedef logic [15:0] mem_t [1:63];

logic [7:0][15:0] myarr [2:0][3:0]; 
var mem_t mem;

initial 
begin 
 $display("$increment of mem : %0d", $increment(mem));            
 $display("$increment of myarr : %0d", $increment(myarr));        
end 
endmodule 
/*
ncsim> run
$increment of mem : -1
$increment of myarr : 1
*/

For mem, left bound is less than right bound, so returned -1.
For myarr, left bound is greater than right bound, so returned 1.

$size :
Returns the number of elements in the dimension.

module array_query8; 
typedef logic [15:0] mem_t [1:63];

logic [7:0][15:0] myarr [2:0][3:0]; 
var mem_t mem;

initial 
begin 
 $display("$size of mem : %0d", $size(mem));            
 $display("$size of myarr : %0d", $size(myarr));        

end 
endmodule 
/*
ncsim> run
$size of mem : 63
$size of myarr : 3
ncsim: *W,RNQUIE: Simulation is complete.
*/

Here, number of elements in mem is 63 (1:63 dimension) and myarr has 3 elements.

Leave a Reply

Your email address will not be published. Required fields are marked *