2014-11-29 01:44:07 +00:00
// DESCRIPTION: Verilator: Verilog Test module
//
2020-03-21 15:24:24 +00:00
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2014 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
2014-11-29 01:44:07 +00:00
2020-04-20 00:10:07 +00:00
`define checkh(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got='h%x exp='h%x\n", `__FILE__,`__LINE__, (gotv), (expv)); $stop; end while(0);
2023-01-23 13:35:10 +00:00
function automatic int f_au_st_global ( ) ;
static int st = 0 ; st + + ; return st ;
endfunction
package my_pkg ;
function int f_no_st_pkg ( ) ;
static int st = 0 ; st + + ; return st ;
endfunction
endpackage
2014-11-29 01:44:07 +00:00
module t ( /*AUTOARG*/
// Inputs
clk
) ;
input clk ;
function int f_no_no ( ) ;
int st = 2 ; st + + ; return st ;
endfunction
function int f_no_st ( ) ;
static int st = 2 ; st + + ; return st ;
endfunction
function int f_no_au ( ) ;
2020-04-20 01:18:57 +00:00
automatic int au = 2 ; au + + ; return au ;
2014-11-29 01:44:07 +00:00
endfunction
2017-09-11 23:18:58 +00:00
2014-11-29 01:44:07 +00:00
function static int f_st_no ( ) ;
int st = 2 ; st + + ; return st ;
endfunction
function static int f_st_st ( ) ;
static int st = 2 ; st + + ; return st ;
endfunction
function static int f_st_au ( ) ;
2020-04-20 01:18:57 +00:00
automatic int au = 2 ; au + + ; return au ;
2014-11-29 01:44:07 +00:00
endfunction
function automatic int f_au_no ( ) ;
2020-04-20 01:18:57 +00:00
int au = 2 ; au + + ; return au ;
2014-11-29 01:44:07 +00:00
endfunction
function automatic int f_au_st ( ) ;
static int st = 2 ; st + + ; return st ;
endfunction
function automatic int f_au_au ( ) ;
2020-04-20 01:18:57 +00:00
automatic int au = 2 ; au + + ; return au ;
2014-11-29 01:44:07 +00:00
endfunction
2017-09-11 23:18:58 +00:00
2020-10-16 00:44:51 +00:00
int v ;
2014-11-29 01:44:07 +00:00
initial begin
2020-10-16 00:44:51 +00:00
v = f_no_no ( ) ; `checkh ( v , 3 ) ;
v = f_no_no ( ) ; `checkh ( v , 4 ) ;
v = f_no_st ( ) ; `checkh ( v , 3 ) ;
v = f_no_st ( ) ; `checkh ( v , 4 ) ;
v = f_no_au ( ) ; `checkh ( v , 3 ) ;
v = f_no_au ( ) ; `checkh ( v , 3 ) ;
2014-11-29 01:44:07 +00:00
//
2020-10-16 00:44:51 +00:00
v = f_st_no ( ) ; `checkh ( v , 3 ) ;
v = f_st_no ( ) ; `checkh ( v , 4 ) ;
v = f_st_st ( ) ; `checkh ( v , 3 ) ;
v = f_st_st ( ) ; `checkh ( v , 4 ) ;
v = f_st_au ( ) ; `checkh ( v , 3 ) ;
v = f_st_au ( ) ; `checkh ( v , 3 ) ;
2014-11-29 01:44:07 +00:00
//
2020-10-16 00:44:51 +00:00
v = f_au_no ( ) ; `checkh ( v , 3 ) ;
v = f_au_no ( ) ; `checkh ( v , 3 ) ;
v = f_au_st ( ) ; `checkh ( v , 3 ) ;
v = f_au_st ( ) ; `checkh ( v , 4 ) ;
v = f_au_au ( ) ; `checkh ( v , 3 ) ;
v = f_au_au ( ) ; `checkh ( v , 3 ) ;
2014-11-29 01:44:07 +00:00
//
2023-01-23 13:35:10 +00:00
v = f_au_st_global ( ) ; `checkh ( v , 1 ) ;
v = f_au_st_global ( ) ; `checkh ( v , 2 ) ;
v = my_pkg : : f_no_st_pkg ( ) ; `checkh ( v , 1 ) ;
v = my_pkg : : f_no_st_pkg ( ) ; `checkh ( v , 2 ) ;
//
2020-04-20 00:10:07 +00:00
end
2020-04-20 01:18:57 +00:00
2020-04-20 00:10:07 +00:00
int cyc = 0 ;
always @ ( posedge clk ) begin
int ist1 ;
static int ist2 ;
automatic int iau3 ;
cyc < = cyc + 1 ;
if ( cyc = = 0 ) begin
ist1 = 10 ;
ist2 = 20 ;
iau3 = 30 ;
2020-10-16 00:44:51 +00:00
v = ist1 ; `checkh ( v , 10 ) ;
v = ist2 ; `checkh ( v , 20 ) ;
v = iau3 ; `checkh ( v , 30 ) ;
2020-04-20 00:10:07 +00:00
+ + ist1 ;
+ + ist2 ;
+ + iau3 ;
end
else if ( cyc = = 1 ) begin
2020-10-16 00:44:51 +00:00
v = ist1 ; `checkh ( v , 11 ) ;
v = ist2 ; `checkh ( v , 21 ) ;
//TODO v = iau3; `checkh(v, 0);
2020-04-20 00:10:07 +00:00
end
else if ( cyc = = 5 ) begin
$write ( " *-* All Finished *-* \n " ) ;
$finish ;
end
2014-11-29 01:44:07 +00:00
end
endmodule