SV的参数化类

参数化类的重载

相关参考:UVM factory机制如何重载带参数的object - 知乎


需求背景:需要重载参数化的predictor;

参数化类:参数不同意味着不同类!(所以能重载的前提,参数一致)

基类:(参数需要有默认值,不然会报编译错误)

子类:

env里面的例化:

重载的调试(在env里调用:实例名.print_override_info;白皮书也有):

test里面实行重载:

虽然调试这里识别不了,但是实际上已经替换成功;

参数化类的注册虽然看上去没有注册进去,但实际运行结果的确可以重载成功;


uvm源码注释里面有一个参考例子:


一个#号编译的问题:

在Bytedance这边遇到了一个#号编译的问题:

问题定位:是没有把文件include进来;(没有报类型不存在编译错误);


重载新增属性选择,需要cast

A_scb从base_scb中继承而来,增加了新变量xx_mode,在test这一层进行env.scb.xx_mode=1;

会报编译问题,因为基类的确没有这个变量;需要用cast的进行类型转换;声明子类句柄A_handle;

$cast(A_handle,env.scb);//最好检查一下是否转换成功

再A_handle.xx_mode=1


参数化类:声明句柄时要带上相应的参数;

class  abc #(type T=classx  ,int  port=3)  extend  uvm_object;

声明句柄:abc#(classxx,9)    ref_class;

new/create的时候也需要带上;

### SystemVerilog 中参数化结构体的实现 在 SystemVerilog 中,可以利用 `typedef` 和参数化技术来创建灵活且易于维护的数据结构。通过定义带参数的结构体,可以在不同上下文中重用相同的结构模板而无需重复编写代码。 #### 定义参数化结构体 为了使结构体能够接受不同的宽度或其他属性作为参数,在声明时应先使用 `parameter` 关键字指定这些可变特性。接着借助于 `typedef` 来关联具体的参数实例与结构体布局: ```systemverilog // 声明带有参数的结构体型 typedef struct { logic [WIDTH-1:0] addr; logic [DATA_WIDTH-1:0] data; } reg_bus #(parameter int WIDTH=8, parameter int DATA_WIDTH=32); ``` 上述例子展示了如何构建一个名为 `reg_bus` 的寄存器总线接口结构体,其中地址位宽 (`addr`) 和数据位宽 (`data`) 可以被外部配置,默认情况下分别为 8-bit 地址和 32-bit 数据[^5]。 #### 实例化参数化结构体 一旦定义好了参数化的结构体型,则可以通过提供具体数值来实例化该型的对象。这允许设计者根据不同需求调整内部字段大小而不必修改原始定义: ```systemverilog // 创建两个具有不同参数设置的具体结构体变量 reg_bus #(.WIDTH(16), .DATA_WIDTH(64)) wide_regbus; reg_bus narrow_regbus; // 使用默认参数值 ``` 这里分别创建了一个更宽版本(16-bit 地址/64-bit 数据)以及标准版(8-bit 地址/32-bit 数据)的寄存器总线结构体实例。 #### 应用于模块端口或任务函数间通信 由于综合工具支持结构体通过模块端口传递,并且也能够在任务和函数之间交换信息,因此这种灵活性对于提高硬件描述语言编程效率非常有用[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值