Fix dynamic array elements passed to ref argument (#6877)
This commit is contained in:
parent
c388e793e0
commit
cc11ff8c53
|
|
@ -534,8 +534,11 @@ class TaskVisitor final : public VNVisitor {
|
|||
refArgOk = cMethodp->method() == VCMethod::DYN_AT_WRITE_APPEND
|
||||
|| cMethodp->method() == VCMethod::DYN_AT_WRITE_APPEND_BACK;
|
||||
} else {
|
||||
refArgOk = cMethodp->method() == VCMethod::ARRAY_AT
|
||||
|| cMethodp->method() == VCMethod::ARRAY_AT_BACK;
|
||||
if (cMethodp->method() == VCMethod::ARRAY_AT) {
|
||||
// Change the method to writable variant
|
||||
cMethodp->method(VCMethod::ARRAY_AT_WRITE);
|
||||
}
|
||||
refArgOk = cMethodp->method() == VCMethod::ARRAY_AT_WRITE;
|
||||
}
|
||||
}
|
||||
if (refArgOk) {
|
||||
|
|
|
|||
|
|
@ -8,53 +8,63 @@
|
|||
`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);
|
||||
|
||||
class MyInt;
|
||||
int x;
|
||||
function new(int a);
|
||||
x = a;
|
||||
endfunction
|
||||
int x;
|
||||
function new(int a);
|
||||
x = a;
|
||||
endfunction
|
||||
endclass
|
||||
|
||||
function int get_val_set_5(ref int x);
|
||||
automatic int y = x;
|
||||
x = 5;
|
||||
return y;
|
||||
automatic int y = x;
|
||||
x = 5;
|
||||
return y;
|
||||
endfunction
|
||||
|
||||
class Cls;
|
||||
function int get_val_set_2(ref int x);
|
||||
automatic int y = x;
|
||||
x = 2;
|
||||
return y;
|
||||
endfunction
|
||||
function int get_val_set_2(ref int x);
|
||||
automatic int y = x;
|
||||
x = 2;
|
||||
return y;
|
||||
endfunction
|
||||
endclass
|
||||
|
||||
module t;
|
||||
int a, b;
|
||||
int arr[1];
|
||||
Cls cls;
|
||||
MyInt mi;
|
||||
initial begin
|
||||
a = 10;
|
||||
b = get_val_set_5(a);
|
||||
`checkh(a, 5);
|
||||
`checkh(b, 10);
|
||||
int a, b;
|
||||
int arr[1];
|
||||
int dyn_arr[];
|
||||
Cls cls;
|
||||
MyInt mi;
|
||||
initial begin
|
||||
a = 10;
|
||||
b = get_val_set_5(a);
|
||||
`checkh(a, 5);
|
||||
`checkh(b, 10);
|
||||
|
||||
cls = new;
|
||||
b = cls.get_val_set_2(a);
|
||||
`checkh(a, 2);
|
||||
`checkh(b, 5);
|
||||
cls = new;
|
||||
b = cls.get_val_set_2(a);
|
||||
`checkh(a, 2);
|
||||
`checkh(b, 5);
|
||||
|
||||
mi = new(1);
|
||||
b = cls.get_val_set_2(mi.x);
|
||||
`checkh(mi.x, 2);
|
||||
`checkh(b, 1);
|
||||
mi = new(1);
|
||||
b = cls.get_val_set_2(mi.x);
|
||||
`checkh(mi.x, 2);
|
||||
`checkh(b, 1);
|
||||
|
||||
arr[0] = 10;
|
||||
b = cls.get_val_set_2(arr[0]);
|
||||
`checkh(arr[0], 2);
|
||||
`checkh(b, 10);
|
||||
arr[0] = 10;
|
||||
b = cls.get_val_set_2(arr[0]);
|
||||
`checkh(arr[0], 2);
|
||||
`checkh(b, 10);
|
||||
|
||||
$write("*-* All Finished *-*\n");
|
||||
$finish;
|
||||
end
|
||||
dyn_arr = new[3];
|
||||
dyn_arr[1] = 10;
|
||||
b = get_val_set_5(dyn_arr[1]);
|
||||
`checkh(dyn_arr[1], 5);
|
||||
`checkh(b, 10);
|
||||
b = cls.get_val_set_2(dyn_arr[1]);
|
||||
`checkh(dyn_arr[1], 2);
|
||||
`checkh(b, 5);
|
||||
|
||||
$write("*-* All Finished *-*\n");
|
||||
$finish;
|
||||
end
|
||||
endmodule
|
||||
|
|
|
|||
Loading…
Reference in New Issue