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

相关推荐
博览鸿蒙13 小时前
IC 和 FPGA,到底区别在哪?
fpga开发
思尔芯S2C13 小时前
FPGA原型验证实战:如何应对外设连接问题
fpga开发·risc-v·soc设计·prototyping·原型验证
Flamingˢ13 小时前
FPGA实战:VGA成像原理、时序详解与Verilog控制器设计与验证
fpga开发
FPGA_小田老师13 小时前
xilinx原语:OSERDES2(并串转换器)原语详解
fpga开发·lvds·xilinx原语·oserdese·并串转换
Blossom.11813 小时前
从数字大脑到物理实体:具身智能时代的大模型微调与部署实战
人工智能·python·深度学习·fpga开发·自然语言处理·矩阵·django
漂洋过海的鱼儿1 天前
HLS (High-Level Synthesis)对比PS运行速度
fpga开发
Aaron15881 天前
无线信道下的通信链路设计分析
大数据·网络·人工智能·算法·fpga开发·硬件工程·射频工程
碎碎思1 天前
当 FPGA 遇上 Python:Glasgow 如何玩转数字接口(开源硬件 & 软件)
fpga开发
CV@CV1 天前
FPGA时序优化实战指南:从理论到落地(附常见问题排查)
fpga开发
博览鸿蒙1 天前
成绩公布后,FPGA方向该如何规划下一步?
fpga开发