首页 > 其他分享 >SV 接口 Interface 补充(调用传参举例)

SV 接口 Interface 补充(调用传参举例)

时间:2024-11-18 14:40:39浏览次数:1  
标签:传参 get bus SV 接口 模块 logic Interface data

SystemVerilog (SV) 中,接口可以作为模块的端口传递,也可以在任务和函数中传递作为参数。通过接口传递参数使得多个模块可以共享相同的信号集,减少冗余代码,提高设计的可重用性。

以下是一些例子,展示了如何在 模块任务/函数 中使用接口作为参数传递。


1. 接口作为模块的端口传递

首先,我们来看一个简单的例子,展示了如何在 模块间传递接口

定义接口

interface bus_if;
    logic clk;
    logic reset;
    logic [7:0] data;
endinterface

这个接口 bus_if 包含三个信号:

  • clk:时钟信号
  • reset:复位信号
  • data:数据总线

使用接口的模块

module producer(bus_if bus);
    // 生产者模块:每次时钟上升沿将数据增加 1
    always_ff @(posedge bus.clk or posedge bus.reset) begin
        if (bus.reset)
            bus.data <= 8'b0;  // 复位时,数据置为 0
        else
            bus.data <= bus.data + 1;  // 否则,数据加 1
    end
endmodule

module consumer(bus_if bus);
    // 消费者模块:每次时钟上升沿打印数据
    always_ff @(posedge bus.clk or posedge bus.reset) begin
        if (bus.reset)
            $display("Data reset to 0.");
        else
            $display("Data: %h", bus.data);  // 打印当前数据
    end
endmodule

顶层模块实例化接口

在顶层模块中,我们实例化接口,并将接口作为端口连接到不同的子模块。

module top;
    // 实例化接口
    bus_if bus();

    // 实例化子模块,并传递接口
    producer p1 (.bus(bus));
    consumer c1 (.bus(bus));

    // 时钟和复位信号生成
    initial begin
        bus.clk = 0;
        bus.reset = 0;
        bus.data = 8'b0;
        #5 bus.reset = 1;  // 复位信号
        #10 bus.reset = 0;
    end

    // 时钟信号生成
    always #5 bus.clk = ~bus.clk;
endmodule

在这个示例中:

  • producer 模块通过接口 bus_if 接收时钟和复位信号,并生成数据。
  • consumer 模块则通过同一个接口 bus_if 打印数据。
  • 顶层模块实例化接口并连接两个子模块。

2. 接口作为任务和函数的参数

接口也可以作为任务和函数的参数传递,这样可以方便地在多个地方访问接口中的信号。

定义接口

interface bus_if;
    logic clk;
    logic reset;
    logic [7:0] data;

    // 定义一个任务来设置数据
    task set_data(input logic [7:0] new_data);
        data = new_data;
    endtask

    // 定义一个函数来返回当前的数据值
    function logic [7:0] get_data();
        return data;
    endfunction
endinterface

任务/函数使用接口作为参数

接下来定义一个模块,该模块包含一个任务和一个函数,接收接口作为参数来操作接口中的信号。

module processor;
    // 创建接口实例
    bus_if bus();

    // 任务:通过接口设置数据
    task process_data(input bus_if bus);  
        // 设置数据为某个值
        bus.set_data(8'hAA);  // 通过接口调用 set_data 任务
        $display("Processed Data: %h", bus.get_data());  // 获取并显示数据
    endtask

    // 初始块:调用任务,传递接口
    initial begin
        // 初始化接口数据
        bus.data = 8'hFF;
        $display("Initial Data: %h", bus.get_data());

        // 调用任务处理数据
        process_data(bus);
    end
endmodule

解释:

  • 在这个例子中,bus_if 接口被作为参数传递给任务 process_data
  • 任务 process_data 通过接口 bus 调用了 set_data 来设置数据,并使用 get_data 来获取并显示数据。
  • 顶层模块初始化了接口的数据,并调用任务来处理数据。

3. 接口作为函数的参数

接口也可以作为函数的参数传递,以下是一个简单的例子:

module processor;
    bus_if bus();  // 创建接口实例

    // 函数:获取并返回接口中的数据值
    function logic [7:0] get_and_process_data(input bus_if bus);
        return bus.get_data();  // 通过接口调用 get_data 函数
    endfunction

    // 初始块:调用函数并传递接口
    initial begin
        // 初始化接口数据
        bus.data = 8'hA5;
        $display("Data from function: %h", get_and_process_data(bus));  // 调用函数并传递接口
    end
endmodule

解释:

  • get_and_process_data 是一个函数,它接受接口 bus_if 作为参数,并从接口中获取数据。
  • 顶层模块调用该函数并传递接口实例 bus,获取数据并打印。

4. 接口传递示例:结合约束和访问控制

接口还可以包含约束和任务,使得信号的访问更加灵活。例如,限制数据的访问条件,或者在特定条件下修改数据。

interface bus_if;
    logic clk;
    logic reset;
    logic [7:0] data;

    // 定义一个约束:确保数据在特定范围
    constraint valid_data { data >= 8'h10 && data <= 8'hFF; }

    // 定义一个任务:设置数据
    task set_data(input logic [7:0] new_data);
        if (new_data >= 8'h10 && new_data <= 8'hFF) begin
            data = new_data;
        end else begin
            $display("Invalid data value: %h", new_data);
        end
    endtask
endinterface

module processor;
    bus_if bus();  // 创建接口实例

    // 任务:传递接口并设置数据
    task process_data(input bus_if bus);
        bus.set_data(8'h20);  // 设置数据为 0x20
        $display("Processed Data: %h", bus.data);
    endtask

    // 初始块:调用任务并传递接口
    initial begin
        bus.data = 8'hFF;  // 初始化数据
        $display("Initial Data: %h", bus.data);

        // 调用任务处理数据
        process_data(bus);
    end
endmodule

解释:

  • 在这个例子中,接口 bus_if 包含了一个约束,确保 data 的值始终在 0x100xFF 之间。
  • 任务 process_data 通过接口调用 set_data 设置数据,并检查值是否在合法范围内。
  • 顶层模块初始化了数据并调用任务进行处理。

总结

SystemVerilog 中,接口可以作为模块的端口传递,也可以作为任务和函数的参数。通过接口传递参数,可以实现不同模块或功能间的信号共享和访问。接口使得信号集合的管理更加方便,并且可以封装复杂的功能和约束,帮助简化设计和提高代码的可维护性。通过任务和函数,接口不仅传递信号,还可以封装行为,使得设计更加模块化和清晰。

标签:传参,get,bus,SV,接口,模块,logic,Interface,data
From: https://www.cnblogs.com/now-lll7/p/18552650

相关文章

  • 解读《华为鲲鹏920 TSV110微架构评测(上):初露锋芒,砥砺前行》
    前言近年来,纵使摩尔定律已死的论调甚嚣尘上,处理器性能还是迎来了一波爆发式增长;适逢DSA的黄金时代,巨头们对于自研微架构的热情空前高涨。众多因素加持下,处理器新秀们如雨后春笋般层出不穷。华为作为世界舞台的顶级玩家之一自然不会错过这场盛宴。在海思麒麟的光芒下鲲鹏系......
  • openEuler-22.03安装部署PrometheusV2.16.0
    环境下载安装包GIT下载地址:PrometheusV2.16.0下载使用GitHub文件加速-CSDN博客安装创建prometheus用户及组,并指定家目录[root@manager~]#groupaddprometheus[root@manager~]#useradd-gprometheusprometheus-d/opt/prometheus/将家目录做为prometheus的安装目......
  • A Text-based Interface for Energy Modeling
    UniversityofNottinghamNingboChinaArchitecturalEngineeringDesign1ComputingPartPythonMilestone2:AText-basedInterfaceforEnergyModelingInthispartofcoursework,youwillbeaskedtodevelopafewmorepythonfunctionsandatext-basedus......
  • 基于matlab改进的灰狼优化支持向量机SVM的数据分类预测
    基于改进的灰狼优化支持向量机SVM的数据分类预测介绍IGWO-SVM(ImprovedGreyWolfOptimizer-SupportVectorMachine)是一种结合了改进的灰狼优化算法(IGWO)和支持向量机(SVM)的数据分类方法。IGWO用于优化SVM的参数,旨在提高分类精度和泛化能力。通过这种方法,可以有效解决复杂......
  • 数据可视化SVG
    SVG优点SVG缺点SVG应用场景SVG和Canvas的区别初体验SVGXML和DTD声明......
  • 从零到一构建并打包 React + TypeScript + Less组件库教程(四、Icon 图标组件库自动生
    了解流行组件库的Icon组件本系列目录如下:项目初始化搭建+代码规范集成组件库多产物编译及文档编写turborepo集成Icon图标组件库自动生成svg组件点击查看此次commit本篇文章技术来源于semidesign,参考了semidesign的icon组件库设计观察我们经常使用的组件......
  • L4 垃圾邮件数据集分类延申 - NB/KNN/SVC/随机森林
    目录背景代码1.数据准备-1阶段2.数据探索3.数据准备-2阶段4.矢量化(向量化)5. 建立模型6.模型评价模型评价1.分别评价2.总体评价背景基于前文 (《【机器学习】Lesson4-朴素贝叶斯(NB)文本分类》)对于垃圾邮件数据集的分类处理,增加K邻居分类器(KNN)/支持向量......
  • python从旧库中导出csv并导入新库
    在线的游戏,迁移数据库,数据比较大,游戏不能停很久,先使用sqldump导入不变的表,再使用python导出可变的表到csv文件,导入到新库.找出各表中csv中最大的id,然后停服, 然后根据各表的id,从id位置开始再导出新增数据,再导入到新库.export.py"""导出msql表格"""impo......
  • HowTo —— SwiftUI2.0 使用ProgressView显示进度条
    HowTo——SwiftUI2.0使用ProgressView显示进度条东坡肘子​ ​关注他 6人赞同了该文章SwiftUI2.0新增了一些便捷的内置控件,比如说Label、ProgressView等。其基本形态都很普通,不过都支持自定义style。官方的意图也比较明显,通过内置控件,规范代码、提......
  • Python用CEEMDAN-LSTM-VMD金融股价数据预测及SVR、AR、HAR对比可视化
    全文链接:https://tecdat.cn/?p=38224原文出处:拓端数据部落公众号 分析师:Duqiao Han 股票市场是一个复杂的非线性系统,股价受到许多经济和社会因素的影响。因此,传统的线性或近线性预测模型很难有效、准确地预测股票指数的价格趋势。众所周知,深度学习通过逐层特征转换,将原始......