Arrays SystemVerilog:创建具有不同参数的类数组
但他们没有找到任何解决办法 我定义了一个带有子类的类。子类包含一个向量,该向量在数组中的宽度应该不同Arrays SystemVerilog:创建具有不同参数的类数组,arrays,polymorphism,subclass,system-verilog,Arrays,Polymorphism,Subclass,System Verilog,但他们没有找到任何解决办法 我定义了一个带有子类的类。子类包含一个向量,该向量在数组中的宽度应该不同 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 等等 类的定义是相同的,只是向量的大小不同 例子 类别定义: package cla
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
等等
类的定义是相同的,只是向量的大小不同
例子
类别定义:
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
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];
试验台:
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
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
应该有所不同。但是怎么做呢?
是的,我们需要一个数组,因为以后在许多for循环中使用它
更新#1@dave#u 59
简化类定义:
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
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];
试验台:
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
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。我得到一个错误,“我的数组”是未知类型。你知道怎么修吗?:)
更新#2@dave#u 59
试验台
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
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
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
我如何为自动设置例如“1”?
我试过了
这将是很好的,因为我需要做一些循环作业
我无法扩展modelsim中的子类
我犯了这个错误
near "[": syntax error, unexpected '[', expecting IDENTIFIER or TYPE_IDENTIFIER
更新#3
类包简化
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
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#(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
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
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
试验台
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
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
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
模块顶部;
导入类::*;
基于我的_数组[0:4];
初始开始
my_数组[0]=my_类(2)::新建;
my_数组[1]=my_类(4)::新建;
my_数组[2]=my_类(8)::新建;
my_数组[3]=my_类#(16)::新建;
my_数组[4]=my_类(32)::新建;
my_数组[0]。设置_数据(2);
my_数组[1]。设置_数据(4);
my_数组[2]。设置_数据(6);
my_数组[3]。设置_数据(8);
my_数组[4]。设置_数据(10);
结束
/*
genvar x;
int-temp[4:0]={3500、600、200、10、3};
生成
对于(x=0;x您需要创建一个公共基类变量,该变量可以存储具有不同宽度参数的不同类专门化的句柄。然后,您需要在基类中有一个纯虚方法,该方法返回访问数据3的公共类型,可能是预期宽度的最大大小。您可以使用顶级类来执行此操作
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值将正确对齐。您还可以使用许多其他方法返回数据,如位或字节的动态流
除了扩展顶级类,您还可以为子类创建一个基类。然后您不必参数化my_类和子类,除非这些类需要宽度
下面是一个完整的、自包含的示例
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
感谢您的快速响应。我收到一个错误,类“my_Class”已参数化。当前不支持参数化嵌套类。在“基my_数组[0:5];”之前或之后是否应该有“endclass”?如果修复了示例。我复制了class我的_class
行。好的,我已经解决了输入错误,谢谢。我在第一条消息中更新了示例,但出现了“未知类型”错误(见上文).建议?提供一个完整的、自包含的示例总是有帮助的。好的,谢谢。我已经更新了我的第一篇文章。如何将例如逻辑auto2设置为我的_数组[0]的“1”?如下所示:我的_数组[0]。data1.auto2=1(见上文);