this topic has a similar question like mine. But they don't figured out any solution.
I have defined a class with subclasses. The subclass contains a vector, which width should be different in the array.
array[0] class with subclasses and vector width 32
array[1] class with subclasses and vector width 64
array[2] class with subclasses and vector width 128
and so on.
The definition of the class is the same, only the size of the vector differs.
Example
Class-definition:
package classes;
class subsubclass#(int width);
logic [width:0] data3;
endclass
class subclass#(int width);
subsubclass #(width) data2 = new;
logic auto2;
endclass
class my_class#(int width);
subclass #(width) data1 = new;
logic auto1;
endclass
endpackage
Testbench:
my_class#(32) my_array [0:5];
initial begin
int x;
for (int x=0; x<6; x++) begin
my_array[x] = new;
end
end
In this situation i am creating an array of classes with same width. How can i change this? I tried various things, but i can't figure out if there is a solution.
for e.g.
my_array[0].subclass.subsubclass.data3
and
my_array[1].subclass.subsubclass.data3
should differ. But how? And yes in need it with an array because of using it later in many for loops.
update#1 @dave_59
simplified Class-definition:
virtual class base;
pure virtual function logic [511:0] get_data();
pure virtual function int getwidth();
endclass
class my_class#(int width) extends base;
logic auto;
logic [width:0] data;
virtual function logic [511:0] get_data();
return data;
endfunction
virtual function int getwidth();
return width;
endfunction
endclass
base my_array [0:4];
Testbench:
initial begin
my_array[0] = my_class#(16)::new;
my_array[1] = my_class#(8)::new;
my_array[2] = my_class#(64)::new;
my_array[3] = my_class#(128)::new;
my_array[4] = my_class#(256)::new;
end
I tried different definitions: test0, test1 and test2. I got an error that "my_array" is an unkown type. Any idea how to fix it? :)
my_array[0] test0; // or
my_array test1; // or
my_array[0].get_data() test2;
update#2 @dave_59
package classes;
class subsubclass#(int width);
logic [width-1:0] data3 = '1;
endclass
class subclass#(int width);
subsubclass #(width) data2 = new;
logic auto2;
endclass
virtual class base;
pure virtual function logic [511:0] get_data();
pure virtual function int get_width();
endclass
class my_class#(int width) extends base;
logic auto;
subclass#(width) data1 = new;
virtual function logic [511:0] get_data();
return data1.data2.data3;
endfunction
virtual function int get_width();
return width;
endfunction
endclass
endpackage : classes
Testbench
module top;
import classes::*;
base my_array [0:4];
initial begin
my_array[0] = my_class#(16)::new;
my_array[1] = my_class#(8)::new;
my_array[2] = my_class#(64)::new;
my_array[3] = my_class#(128)::new;
my_array[4] = my_class#(256)::new;
foreach(my_array[i]) $display("i: %0d, width:%0d, data3:%0h",
i, my_array[i].get_width(), my_array[i].get_data());
end
my_array[0].data1.auto2 = 1;
endmodule : top
How can i set for example a "1" for auto? I tried
my_array[0].data1.auto2 = 1;
I got this error
near "[": syntax error, unexpected '[', expecting IDENTIFIER or TYPE_IDENTIFIER
Aucun commentaire:
Enregistrer un commentaire