SystemVerilog学习(8)——包的使用

目录

一、包的定义

二、导出包的内容

1、可以通过域的索引符::号直接引用

2、可以指定索引一些需要的包中定义的类型到指定的容器中

3、通过通配符*来将包中所有的类别导入到指定容器中

三、包的使用


在进行本文的学习之前,首先需要对SV中类相关的内容有充分的认识,这部分内容在之前面向对象编程的部分有详细介绍:

SystemVerilog学习 (7)------面向对象编程https://blog.csdn.net/apple_53311083/article/details/134427859?spm=1001.2014.3001.5502

一、包的定义

为了使得可以在多个模块(硬件)或者类(软件)之间共享用户定义的类 型,SV添加了包(package)。包的概念参考于VHDL,用户自定义的类型譬如类、方法、变量、结构体、 枚举类等都可以在package...endpackage中定义。

package definitions; 
    parameter VERSION = "1.1"; 
    typedef enum {ADD, SUB, MUL} opcodes_t; 
    typedef struct { 
        logic [31:0] a, b; 
        opcodes_t opcode; 
    } instruction_t; 
    function automatic [31:0] multiplier(input[31:0] a, b); 
    return a * b;                                             // abstract multiplier 
    endfunction 
endpackage

二、导出包的内容

包给人的感觉有一点像我们C语言中的库,我们知道最简单的程序"hello world"在打印printf的时候需要include一个标准库,类似的,我们想要使用包的内容,就需要把包中的内容进行导出,这些内容一般来说有:module、interface、class等可以使用包中定义或者声明的内容。

1、可以通过域的索引符::号直接引用

module ALU(input definitions::instruction_t IW, 
           input logic clock, 
           output logic [31:0] result 
          );
 always_ff @(posedge clock) begin 
    case (IW.opcode) 
        definitions::ADD : result = IW.a + IW.b; 
        definitions::SUB : result = IW.a - IW.b; 
        definitions::MUL : result =  definitions::multiplier(IW.a, IW.b); 
    endcase 
 end 
endmodule

2、可以指定索引一些需要的包中定义的类型到指定的容器中

module ALU(...); 
    import definitions::ADD; 
    import definitions::SUB; 
    import definitions::MUL; 
    import definitions::multiplier; 
    always_comb begin 
        case (IW.opcode) 
            ADD : result = IW.a + IW.b; 
            SUB : result = IW.a - IW.b; 
            MUL : result = multiplier(IW.a, IW.b); 
        endcase 
    end 
endmodule

3、通过通配符*来将包中所有的类别导入到指定容器中

module ALU(...); 
    import definitions::*; // wildcard import 
    always_comb begin 
        case (IW.opcode) 
            ADD : result = IW.a + IW.b; 
            SUB : result = IW.a - IW.b; 
            MUL : result = multiplier(IW.a, IW.b); 
        endcase 
    end 
endmodule

这是我们实际使用中最为简单的一种方式,一般也是应用最多的方式。

三、包的使用

在实际的使用过程中,经常会把一个大的验证平台的创建和设计部分封装成一个包的形式,然后我们再通过另一个tb文件导出包的形式来完成我们的验证目标。这样做的好处一方面是增加我们验证流程的层次性和条理性,同时增加了代码的复用率。包中可以使用class,module,interface等一系列的内容。在认知上,我们就可以把包认知为我们C语言中的函数库,我们verilog中的IP核。

至此,其实我们已经可以完成一个相对完善的验证平台的搭建了,这样的一个验证平台可以包含有激励发生器(Stimulator),监测器(Monitor),比较器(Checker),这些部分都可以用类(class)来定义,在类中分别定义它们的数据和方法,然后再结合一部分操作,也封装成类的形式,将这些完整的部分都封装到包packet中,完成这部分后,独立编写测试平台testbench,按需要导入包的内容,在testbench中编写我们需要进行的验证操作,最后还可以结合Makefile,实现编译和操作展示的控制。

相关推荐
szxinmai主板定制专家28 分钟前
【国产NI替代】基于FPGA的32通道(24bits)高精度终端采集核心板卡
大数据·人工智能·fpga开发
HIZYUAN6 小时前
AGM FPGA如何配置上拉或者下拉电阻
fpga开发
∑狸猫不是猫6 小时前
(13)CT137A- 简易音乐盒设计
fpga开发
ThreeYear_s12 小时前
基于FPGA 的4位密码锁 矩阵键盘 数码管显示 报警仿真
fpga开发·矩阵·计算机外设
Anin蓝天(北京太速科技-陈)18 小时前
252-8路SATAII 6U VPX高速存储模块
fpga开发
如何学会学习?20 小时前
2. FPGA基础了解--全局网络
fpga开发
Anin蓝天(北京太速科技-陈)21 小时前
271-基于XC7V690T的12路光纤PCIe接口卡
嵌入式硬件·fpga开发
stm 学习ing21 小时前
HDLBits训练3
c语言·经验分享·笔记·算法·fpga·eda·verilog hdl
tiger1191 天前
制造研发企业与IPD管理体系
项目管理·制造·fpga·芯片·半导体·ipd
碎碎思1 天前
FPGA新闻速览-WiMi开发基于FPGA的数字量子计算机验证技术
fpga开发·量子计算