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

相关推荐
不可思议迷宫8 小时前
Verilog编程实现一个分秒计数器
单片机·嵌入式硬件·fpga开发
Terasic友晶科技12 小时前
第3篇:Linux程序访问控制FPGA端LEDR<一>
fpga开发·嵌入式系统·de1-soc开发板
双料毒狼_s12 小时前
【FPGA】状态机思想回顾流水灯
fpga开发
双料毒狼_s20 小时前
【FPGA实战】基于DE2-115实现数字秒表
fpga开发
Cynthia的梦1 天前
FPGA学习-基于 DE2-115 板的 Verilog 分秒计数器设计与按键功能实现
fpga开发
9527华安1 天前
Xilinx系列FPGA实现HDMI2.1视频收发,支持8K@60Hz分辨率,提供2套工程源码和技术支持
fpga开发·音视频·8k·hdmi2.1
大熊Superman1 天前
FPGA实现LED流水灯
fpga开发
泪水打湿三角裤2 天前
fpga:分秒计时器
fpga开发
奋斗的牛马2 天前
FPGA_AXI仿真回环(一)
fpga开发
LeeConstantine2 天前
FPGA FLASH烧写遇到的问题
fpga开发