verilator/test_regress/t/t_var_ref.v

95 lines
1.8 KiB
Verilog

// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed into the Public Domain, for any use,
// without warranty, 2018 by Wilson Snyder.
`define checkh(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got='h%x exp='h%x\n", `__FILE__,`__LINE__, (gotv), (expv));; end while(0);
module t(/*AUTOARG*/
// Inputs
clk
);
input clk;
int cyc;
int vr;
int va[2];
`ifdef T_NOINLINE
// verilator no_inline_module
`endif
//====
task fun(ref int r, const ref int c);
`ifdef T_NOINLINE
// verilator no_inline_task
`endif
`checkh(c, 32'h1234);
r = 32'h4567;
endtask
initial begin
int ci;
int ri;
ci = 32'h1234;
fun(ri, ci);
`checkh(ri, 32'h4567);
end
//====
task fun_array(ref int af[2], const ref int cf[2]);
`ifdef T_NOINLINE
// verilator no_inline_task
`endif
`checkh(cf[0], 32'h1234);
`checkh(cf[1], 32'h2345);
af[0] = 32'h5678;
af[1] = 32'h6789;
endtask
// Not checkint - element of unpacked array
initial begin
int ca[2];
int ra[2];
ca[0] = 32'h1234;
ca[1] = 32'h2345;
fun_array(ra, ca);
`checkh(ra[0], 32'h5678);
`checkh(ra[1], 32'h6789);
end
//====
sub sub(.clk, .vr, .va);
always @ (posedge clk) begin
cyc <= cyc + 1;
if (cyc == 0) begin
vr <= 32'h789;
va[0] <= 32'h89a;
va[1] <= 32'h9ab;
end
else if (cyc == 2) begin
`checkh(vr, 32'h987);
`checkh(va[0], 32'ha98);
`checkh(va[1], 32'ha9b);
$write("*-* All Finished *-*\n");
$finish;
end
end
endmodule
module sub(input clk, ref int vr, ref int va[2]);
always @(posedge clk) begin
vr <= 32'h987;
va[0] <= 32'ha98;
va[1] <= 32'ha9b;
end
endmodule