[英]SystemVerilog: Creating an array of classes with different parameters
這個話題有一個類似我的問題。 但是他們沒有找到任何解決方案。
我已經定義了帶有子類的類。 子類包含一個向量,該向量在數組中的寬度應該不同。
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
試驗台:
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
在這種情況下,我正在創建具有相同寬度的類數組。 我該如何更改? 我嘗試了各種方法,但是我不知道是否有解決方案。
for e.g.
my_array[0].subclass.subsubclass.data3
and
my_array[1].subclass.subsubclass.data3
應該有所不同。 但是如何? 是的,因為在以后的許多for循環中都使用它,所以它需要一個數組。
簡化的類定義:
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;
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中擴展子類。
我得到這個錯誤
near "[": syntax error, unexpected '[', expecting IDENTIFIER or TYPE_IDENTIFIER
類包簡化
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的分配只是一個示例,但它應該可視化我在尋找什么。 我的目標是擁有一個相同類但具有不同數據寬度的數組。 稍后,我想通過for循環訪問分配(請參見上文)。 現在,我可以擴展層次結構,但仍然無法像“ my_array [x] ....” (modelsim的屏幕截圖)那樣訪問它。 有什么方法可以訪問參數化的“數據”並設置分配?
我收到此錯誤:字段/方法名稱(data1)不在'my_array'中
類包簡化
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中設置數據的任務。 初始begin塊內部是整個數組的任務調用。 我沒有收到任何錯誤消息,但問題是未設置數據。 編譯和仿真后,data2的值仍為零。 有什么建議嗎? 編輯:錯誤在類任務中使用“邏輯”而不是“整數”。
您需要創建一個公共基類變量,該變量可以存儲具有不同寬度參數的不同類專業的句柄。 然后,您需要在基類中有一個純虛擬方法,該方法返回用於訪問data3的通用類型,也許是預期的最大寬度。 您可以通過頂級課程來做到這一點
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()
並且my_array[4].get_data3()
值將右對齊。 還有很多其他方法可以返回數據,例如動態的位或字節流。
除了擴展頂級類,您還可以只為子子類創建基類。 然后,您不必參數化my_class和子類,除非這些類當然需要寬度。
這是一個完整的,獨立的示例
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.