SystemVerilog:创建具有不同参数的 类 数组
SystemVerilog: Creating an array of classes with different parameters
this topic has a similar question like mine.但是他们没有想出任何解决办法。
我已经用子class定义了一个class。 subclass 包含一个向量,其宽度在数组中应该不同。
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
等等。
与class的定义相同,只是向量的大小不同。
例子
Class-定义:
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
测试平台:
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
在这种情况下,我正在创建一个具有相同宽度的 classes 数组。我怎样才能改变这个?我尝试了各种方法,但不知道是否有解决方案。
for e.g.
my_array[0].subclass.subsubclass.data3
and
my_array[1].subclass.subsubclass.data3
应该不同。但是怎么办?
是的,需要它与数组一起使用,因为稍后会在许多 for 循环中使用它。
更新#1 @dave_59
简化Class-定义:
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];
测试平台:
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
我尝试了不同的定义:test0、test1 和 test2。我收到 "my_array" 是未知类型的错误。知道如何解决吗? :)
my_array[0] test0; // or
my_array test1; // or
my_array[0].get_data() test2;
更新#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
测试平台
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
我如何为汽车设置“1”?
我试过了
my_array[0].data1.auto2 = 1;
这很好,因为我需要做一些循环作业。
我无法在 modelsim 中扩展子classes。
我遇到了这个错误
near "[": syntax error, unexpected '[', expecting IDENTIFIER or TYPE_IDENTIFIER
更新#3
class 简化包
package classes;
class subclass#(int width);
logic [width-1:0] data2 = '1;
endclass
virtual class base;
logic auto2;
logic auto;
pure virtual function logic [511:0] get_data();
pure virtual function int get_width();
endclass
class my_class#(int width) extends base;
subclass#(width) data1 = new;
virtual function logic [511:0] get_data();
return data1.data2;
endfunction
virtual function int get_width();
return width;
endfunction
endclass
endpackage : classes
测试平台
module top;
import classes::*;
base my_array [0:4];
initial begin
my_array[0] = my_class#(2)::new;
my_array[1] = my_class#(4)::new;
my_array[2] = my_class#(8)::new;
my_array[3] = my_class#(16)::new;
my_array[4] = my_class#(32)::new;
end
genvar x;
int temp [4:0] = {3500, 600, 200, 10, 3};
generate
for (x=0; x<5; x++) begin
assign my_array[x].data1.data2 = temp[x];
end
endgenerate
endmodule : top
每个 data2 的分配只是一个例子,但它应该形象化我正在寻找的东西。我的目标是拥有一个 class 相同但数据宽度不同的数组。稍后我想通过 for 循环访问作业(见上文)。现在我可以扩展层次结构,但仍然无法像 "my_array[x]. ..." (screenshot of modelsim) 那样访问它。有什么方法可以访问参数化的 "data" 并设置赋值吗?
我收到此错误:Field/method 名称 (data1) 不在 'my_array'
中
更新#4(编辑:question/problem 修复)
class 简化包
package classes;
class subclass#(int width);
logic [width-1:0] data2;
endclass
virtual class base;
logic auto2;
logic auto;
pure virtual function logic [511:0] get_data();
pure virtual function int get_width();
pure virtual task set_data(int i);
endclass
class my_class#(int width) extends base;
subclass#(width) data1 = new;
virtual function logic [511:0] get_data();
return data1.data2;
endfunction
virtual function int get_width();
return width;
endfunction
virtual task set_data(int i);
data1.data2 = i;
endtask
endclass
endpackage : classes
测试平台
module top;
import classes::*;
base my_array [0:4];
initial begin
my_array[0] = my_class#(2)::new;
my_array[1] = my_class#(4)::new;
my_array[2] = my_class#(8)::new;
my_array[3] = my_class#(16)::new;
my_array[4] = my_class#(32)::new;
my_array[0].set_data(2);
my_array[1].set_data(4);
my_array[2].set_data(6);
my_array[3].set_data(8);
my_array[4].set_data(10);
end
/*
genvar x;
int temp [4:0] = {3500, 600, 200, 10, 3};
generate
for (x=0; x<5; x++) begin
assign my_array[x].data1.data2 = temp[x];
end
endgenerate
*/
endmodule : top
我更新了我的(简化的)示例,其中包含在 data2 中设置数据的任务。在初始开始块内是对整个数组的任务调用。我没有收到任何错误消息,但问题是数据未设置。在编译和仿真之后,data2 的值仍然为零。建议?
编辑:错误是在 class 任务中使用 "logic" 而不是 "integer"。
您需要创建一个公共基础 class 变量,该变量可以存储具有不同宽度参数的不同 class 专业化的句柄。然后你需要在基础 class 中有一个纯虚方法,return 是访问 data3 的通用类型,也许是预期的最大宽度。您可以使用顶层 class
执行此操作
virtual class base;
pure virtual function logic [63:0] get_data3();
pure virtual function int getwidth();
endclass
class my_class#(int width) extends base;
subclass #(width) data1 = new;
logic auto1;
virtual function logic [63:0] get_data3();
return data1.data2.data3;
endfunction
virtual function int getwidth(); return width; endfunction
endclass
base my_array [0:5];
initial begin
my_array[0] = my_class#(32)::new;
my_array[1] = my_class#(32)::new;
my_array[2] = my_class#(8)::new;
my_array[3] = my_class#(8)::new;
my_array[4] = my_class#(8)::new;
...
现在可以参考my_array[0].get_data3()
和my_array[4].get_data3()
,data3的值会右对齐。还有很多其他方法可以 return 数据,例如动态比特流或字节流。
除了扩展顶级 class,您还可以只为 subsubclass 创建一个基础 class。那么你不必参数化 my_class 和 subclass,当然除非那些 classes 需要宽度。
这是一个完整的、独立的示例
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
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
endmodule : top
this topic has a similar question like mine.但是他们没有想出任何解决办法。
我已经用子class定义了一个class。 subclass 包含一个向量,其宽度在数组中应该不同。
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
等等。
与class的定义相同,只是向量的大小不同。
例子
Class-定义:
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
测试平台:
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
在这种情况下,我正在创建一个具有相同宽度的 classes 数组。我怎样才能改变这个?我尝试了各种方法,但不知道是否有解决方案。
for e.g.
my_array[0].subclass.subsubclass.data3
and
my_array[1].subclass.subsubclass.data3
应该不同。但是怎么办? 是的,需要它与数组一起使用,因为稍后会在许多 for 循环中使用它。
更新#1 @dave_59
简化Class-定义:
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];
测试平台:
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
我尝试了不同的定义:test0、test1 和 test2。我收到 "my_array" 是未知类型的错误。知道如何解决吗? :)
my_array[0] test0; // or
my_array test1; // or
my_array[0].get_data() test2;
更新#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
测试平台
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
我如何为汽车设置“1”? 我试过了
my_array[0].data1.auto2 = 1;
这很好,因为我需要做一些循环作业。
我无法在 modelsim 中扩展子classes。
我遇到了这个错误
near "[": syntax error, unexpected '[', expecting IDENTIFIER or TYPE_IDENTIFIER
更新#3
class 简化包
package classes;
class subclass#(int width);
logic [width-1:0] data2 = '1;
endclass
virtual class base;
logic auto2;
logic auto;
pure virtual function logic [511:0] get_data();
pure virtual function int get_width();
endclass
class my_class#(int width) extends base;
subclass#(width) data1 = new;
virtual function logic [511:0] get_data();
return data1.data2;
endfunction
virtual function int get_width();
return width;
endfunction
endclass
endpackage : classes
测试平台
module top;
import classes::*;
base my_array [0:4];
initial begin
my_array[0] = my_class#(2)::new;
my_array[1] = my_class#(4)::new;
my_array[2] = my_class#(8)::new;
my_array[3] = my_class#(16)::new;
my_array[4] = my_class#(32)::new;
end
genvar x;
int temp [4:0] = {3500, 600, 200, 10, 3};
generate
for (x=0; x<5; x++) begin
assign my_array[x].data1.data2 = temp[x];
end
endgenerate
endmodule : top
每个 data2 的分配只是一个例子,但它应该形象化我正在寻找的东西。我的目标是拥有一个 class 相同但数据宽度不同的数组。稍后我想通过 for 循环访问作业(见上文)。现在我可以扩展层次结构,但仍然无法像 "my_array[x]. ..." (screenshot of modelsim) 那样访问它。有什么方法可以访问参数化的 "data" 并设置赋值吗?
我收到此错误:Field/method 名称 (data1) 不在 'my_array'
中更新#4(编辑:question/problem 修复)
class 简化包
package classes;
class subclass#(int width);
logic [width-1:0] data2;
endclass
virtual class base;
logic auto2;
logic auto;
pure virtual function logic [511:0] get_data();
pure virtual function int get_width();
pure virtual task set_data(int i);
endclass
class my_class#(int width) extends base;
subclass#(width) data1 = new;
virtual function logic [511:0] get_data();
return data1.data2;
endfunction
virtual function int get_width();
return width;
endfunction
virtual task set_data(int i);
data1.data2 = i;
endtask
endclass
endpackage : classes
测试平台
module top;
import classes::*;
base my_array [0:4];
initial begin
my_array[0] = my_class#(2)::new;
my_array[1] = my_class#(4)::new;
my_array[2] = my_class#(8)::new;
my_array[3] = my_class#(16)::new;
my_array[4] = my_class#(32)::new;
my_array[0].set_data(2);
my_array[1].set_data(4);
my_array[2].set_data(6);
my_array[3].set_data(8);
my_array[4].set_data(10);
end
/*
genvar x;
int temp [4:0] = {3500, 600, 200, 10, 3};
generate
for (x=0; x<5; x++) begin
assign my_array[x].data1.data2 = temp[x];
end
endgenerate
*/
endmodule : top
我更新了我的(简化的)示例,其中包含在 data2 中设置数据的任务。在初始开始块内是对整个数组的任务调用。我没有收到任何错误消息,但问题是数据未设置。在编译和仿真之后,data2 的值仍然为零。建议? 编辑:错误是在 class 任务中使用 "logic" 而不是 "integer"。
您需要创建一个公共基础 class 变量,该变量可以存储具有不同宽度参数的不同 class 专业化的句柄。然后你需要在基础 class 中有一个纯虚方法,return 是访问 data3 的通用类型,也许是预期的最大宽度。您可以使用顶层 class
执行此操作virtual class base;
pure virtual function logic [63:0] get_data3();
pure virtual function int getwidth();
endclass
class my_class#(int width) extends base;
subclass #(width) data1 = new;
logic auto1;
virtual function logic [63:0] get_data3();
return data1.data2.data3;
endfunction
virtual function int getwidth(); return width; endfunction
endclass
base my_array [0:5];
initial begin
my_array[0] = my_class#(32)::new;
my_array[1] = my_class#(32)::new;
my_array[2] = my_class#(8)::new;
my_array[3] = my_class#(8)::new;
my_array[4] = my_class#(8)::new;
...
现在可以参考my_array[0].get_data3()
和my_array[4].get_data3()
,data3的值会右对齐。还有很多其他方法可以 return 数据,例如动态比特流或字节流。
除了扩展顶级 class,您还可以只为 subsubclass 创建一个基础 class。那么你不必参数化 my_class 和 subclass,当然除非那些 classes 需要宽度。
这是一个完整的、独立的示例
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
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
endmodule : top