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,实现编译和操作展示的控制。

相关推荐
IM_DALLA4 小时前
【Verilog学习日常】—牛客网刷题—Verilog进阶挑战—VL25
学习·fpga开发·verilog学习
辣个蓝人QEX4 小时前
【FPGA开发】Modelsim如何给信号分组
fpga开发·modelsim·zynq
li星野8 小时前
ZYNQ:点亮LED灯
fpga开发·zynq·7010
9527华安8 小时前
FPGA实现PCIE视频采集转HDMI输出,基于XDMA中断架构,提供3套工程源码和技术支持
fpga开发·音视频·pcie·xdma·ov5640·hdmi
乌恩大侠9 小时前
【Xcode Command Line Tools】安装指南
macos·fpga开发·c
apple_ttt9 小时前
从零开始讲PCIe(9)——PCIe总线体系结构
fpga开发·fpga·pcie
Little Tian12 小时前
信号用wire类型还是reg类型定义
fpga开发
XiaoChaoZhiNeng1 天前
基于Zynq SDIO WiFi移植二(支持2.4/5G)
5g·fpga·zynq·sdio
apple_ttt1 天前
从零开始讲PCIe(6)——PCI-X概述
fpga开发·fpga·pcie
水饺编程1 天前
【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-2
linux·嵌入式硬件·fpga开发