页面加载中,请稍候
来源:ICer消食片发布时间:2022-04-011406浏览
询问 AI
在上一章, 我们创建了使用静态变量的类, 用来装狮子. 这个静态类很不错, 我们可以合理的运用全局资源了. 然而, 问题还是出现了.
我们要一个小鸡笼怎么办呢? 看 lion_cage 的代码, 我们会发现需要的 chicken_cage类跟 lion_cage 基本是一样的, 除了把队列的类型换成 chicken.
直觉是把狮子笼的代码拷出来弄一个小鸡笼. 不过这样犯了一个错误. 一个动物园要多烂才会只有狮子跟小鸡啊. 我们肯定是要为其他的动物准备不同的笼子. 然后我们还是拷代码?
可以想见的是很多情况下我们都会对笼子进行通用性的改动(比如添加一个 feed()方法),如果我们用的是代码拷贝, 这样要改动的话就需要每个地方都改. 这个很快就会失控, 之后我们不停的因为这些 bug 被问责.
幸运的是, SystemVerilog的"参数化类定义"可以解决这个问题. 更重要的是UVM里面大量的使用了这一套, 所以我们要把这个搞懂才行.
造一个动物cage
module RAM #(awidth, dwidth) (
input wire [awidth-1:0] address,
inout wire [dwidth-1:0] data,
input we);
initial $display("awidth: %0d dwidth %0d",awidth, dwidth);
// code to implement RAM
endmodule // RAM
virtual class animal;
protected int age=-1;
protected string name;
function new(int a, string n);
age = a;
name = n;
endfunction : new
function int get_age();
return age;
endfunction : get_age
function string get_name();
return name;
endfunction : get_name
pure virtual function void make_sound();
endclass : animal
class lion extends animal;
protected string name;
function new(int age, string n);
super.new(age, n);
endfunction : new
function void make_sound();
$display ("The lion, %s, says Roar", get_name());
endfunction : make_sound
endclass : lion
class chicken extends animal;
function new(int age, string n);
super.new(age, n);
endfunction : new
function void make_sound();
$display ("The Chicken, %s, says BECAWW", get_name());
endfunction : make_sound
endclass : chicken
class animal_cage #(type T);
protected static T cage[$];
static function void cage_animal(T l);
cage.push_back(l);
endfunction : cage_animal
static function void list_animals();
$display("Animals in cage:");
foreach (cage[i])
$display(cage[i].get_name());
endfunction : list_animals
endclass : animal_cage
module top;
initial begin
lion lion_h;
chicken chicken_h;
lion_h = new(15, "Mustafa");
animal_cage #(lion)::cage_animal(lion_h);
lion_h = new(15, "Simba");
animal_cage #(lion)::cage_animal(lion_h);
chicken_h = new(1, "Clucker");
animal_cage #(chicken)::cage_animal(chicken_h);
chicken_h = new(1, "Scratchy");
animal_cage #(chicken)::cage_animal(chicken_h);
$display("-- Lions --");
animal_cage #(lion)::list_animals();
$display("-- Chickens --");
animal_cage #(chicken)::list_animals();
end
endmodule : top
用参数来定义变量
virtual class animal;
protected int age=-1;
protected string name;
function new(int a, string n);
age = a;
name = n;
endfunction : new
function int get_age();
return age;
endfunction : get_age
function string get_name();
return name;
endfunction : get_name
pure virtual function void make_sound();
endclass : animal
class lion extends animal;
protected string name;
function new(int age, string n);
super.new(age, n);
endfunction : new
function void make_sound();
$display ("The lion, %s, says Roar", get_name());
endfunction : make_sound
endclass : lion
class chicken extends animal;
function new(int age, string n);
super.new(age, n);
endfunction : new
function void make_sound();
$display ("The Chicken, %s, says BECAWW", get_name());
endfunction : make_sound
endclass : chicken
class animal_cage #(type T);
protected T cage[$];
function void cage_animal(T l);
cage.push_back(l);
endfunction : cage_animal
function void list_animals();
$display("Animals in cage:");
foreach (cage[i])
$display(cage[i].get_name());
endfunction : list_animals
endclass : animal_cage
module top;
lion lion_h;
chicken chicken_h;
animal_cage #(lion) lion_cage;
animal_cage #(chicken) chicken_cage;
initial begin
lion_cage = new();
lion_h = new(15, "Mustafa");
lion_cage.cage_animal(lion_h);
lion_h = new(15, "Simba");
lion_cage.cage_animal(lion_h);
chicken_cage = new();
chicken_h = new(1, "Little Red Hen");
chicken_cage.cage_animal(chicken_h);
chicken_h = new(1, "Lady Clucksalot");
chicken_cage.cage_animal(chicken_h);
$display("-- Lions --");
lion_cage.list_animals();
$display("-- Chickens --");
chicken_cage.list_animals();
end
endmodule : top
新闻来源:ICer消食片,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!
2026-07-02

2026-06-25

一周前