保姆级超硬核包会,​System Verilog SV接口(interface )

这篇具有很好参考价值的文章主要介绍了保姆级超硬核包会,​System Verilog SV接口(interface )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:SV中TB的构成主要包括Dut的例化、interface的例化、验证环境的例化三部分。接口类似于一条总线,把零碎的线包装在一起,给那些需要的模块。

1. interface

1.1 interface 是干什么的?

Verilog通过模块间的端口来完成模块间的通信,SV在Verilog的基础上扩展了接口interface。引入interface可以简化模块儿之间的连接,将一组相关的信号可以封装到一起。interface就像—个"插排", DUT与TB之间的数据驱动关系都可以使用interface这个插排来完成。

未使用interface:sv interface,System Verilog,fpga开发 使用interface:sv interface,System Verilog,fpga开发

1.2 interface概念

interface特点

  • 接口可以用作设计,也可以用作验证
  • 与module的使用性质很像,可以定义端口,也可以定义双向信号;可以使用 initial和always,也可以定义function和task
  • TB和DUT是相互独立的,通过interface连接,下图的红线
  • 在interface的端口列表中只需要定义时钟、复位等公共信号,或者不定义任何端口信号 interface中可以包含多个modport,
  • 定义interface的不同视图view(DUT、Test program)

interface与module的区别:

  • interface不能例化module的,module可以例化interface
  • 不能将module里面portlist含有另一个module的,可以含有interface
  • 如果function、task的端口声明中声明为ref,那么function、task必须是automatic
  • 在program或者module中,function、task默认都是static

1.3 interface的使用

interface的使用类似于module,声明示例如下:

interface module_if(input clk);//声明了clk的方向,其余信号没有方向
    logic port_a_0 ;
    logic port_a_1 ;
    logic port_b_0 ;
    logic port_b_1 ;
endinterface

索引interface中的某个信号可以通过module_if.port_a_0来实现。
假设有两个模块module_a与module_b,且在顶层分别例化与连接,示例如下:

module module_a(
    input clk,
    input rst_n,
    input port_a_0 ,
    input port_a_1 ,
    output port_b_0 ,
    output port_b_1
);
    ......
endmodule

module top();
    logic clk ;
    logic rst_n ;
    logic port_a_0 ;
    logic port_a_1 ;
    logic port_b_0 ;
    logic port_b_1 ;
    
    always #10 clk = ~clk ;
    initial begin
        rst_n = 0 ;
        #50;
        rst_n = 1 ;
    end
//例化模块A
    module_a U_A(
        .clk(clk),
        .rst_n(rst_n),
        .port_a_0(port_a_0),
        .port_a_1(port_a_1),
        .port_b_0(port_b_0),
        .port_b_1(port_b_1)
    );
endmodule

虽然代码非常简单,当需要根据设计需要增加模块接口信号时,就需要修改很多地方。比如模块A增加了一组交互信号port_c_0,此时需要修改module_a的声明位置, 例化U_A位置的代码。

interface module_if(input clk);//声明接口
    logic rst_n,
    logic port_a_0 ;
    logic port_a_1 ;
    logic port_b_0 ;
    logic port_b_1 ;
endinterface

module module_b( module_if U_IF);
    ......
endmodule

module top();
    logic clk ;
    always #10 clk = ~clk ;
    module_if U_IF(clk);//例化接口,并且抽象的clk与具体的lk实现了连接
    initial begin
        U_IF.rst_n = 0 ;
        #50;
        U_IF.rst_n = 1 ;
    end
 //例化模块
    module_b U_B(U_IF);//例化模块b,顶层U_B与U_IF相连
endmodule

这样一来,数据的连接简单了不少,而且当需要更改模块的接口设计时,仅需要在interface内部一处修改。
虽然解决了线数量很多的问题,但是现在出现了新的问题:
1.把数据完成了打包,但不是每一个模块都可以用到全部的信号。
2.假设有两个模块通过interface来连接,A模块输出信号到interface,interface作为输入送给模块B,目前的interface是无法完成的,因为接口中的信号是没有方向的。
这时候就需要用到modport。(约束信号的方向,是输入到模块还是输出到模块)

1.4 modport

modpot是module port的缩写,表示不同模块看到同一组信号时的视角(连接方向)。在接口声明modport,需要指明modport中各个信号的方向。
sv interface,System Verilog,fpga开发
示例中modport把interface中的信号约束了方向命名为A,在下面例子的顶层模块中通过U_if.A 来索引。

interface module_if(input clk);
    logic rst_n,
    logic port_a_0 ;
    logic port_a_1 ;
    logic port_b_0 ;
    logic port_b_1 ;//声明信号
    
    modport A(
        input rst_n ,
        input port_a_0 ,
        input port_a_1 ,
        output port_b_0 ,
        output port_b_1
    );//A这一组信号的方向,只能声明在interface里的信号,modport只声明你需要规定方向的信号
endinterface

module module_a( module_if U_IF);
    ......
endmodule

module top();
    logic clk ;
    always #10 clk = ~clk ;
    module_if U_IF(clk);//例化接口
    initial begin
        U_IF.rst_n = 0 ;
        #50;
        U_IF.rst_n = 1 ;
    end
    module_a U_A(U_IF.A);  //例化模块a并与A组信号连接
endmodule

此时看起来仿真结构已经构建差不多了,但其实仿真时采样信号还存在着竞争的问题。下面这道题如果a显示=1,b应该显示多少呢?

always@(posedge clk or negedge rstn)begin
	if(rstn == 0) begin
		a = 0;
		b = 0;
		end
		elsebegin
			a = a + 1 ;
			b = a ;
			$display ( "@%0t a=%0d, b=%0d",$time,a ,b) ;
		end
	end

很明显上述代码中出现了竞争问题,在RTL仿真行中解决竞争问题一般采用非阻塞赋值或特定的信号延迟来解决同步的问题。这样的时序竞争问题在SV仿真行为中也同样存在。

SV仿真中的竞争问题:
在仿真中,同一组数据仿真两次可能会采样到不一样的值,这是为什么呢?现实生活中信号与信号之间的传输会存在一定的延迟,而在仿真中这个延迟无法做到那么精确,所以在仿真中规定了delta-cycle最小延迟。当两次采样发生在这个无限小的delta-cycle两边时,就会采样到不一样的值。

  • 时钟对于组合电路的驱动会添加一个无限小的延时(delta-cycle)的延迟,而该延迟无法用绝对时间单位衡量,它要比最小的时间单位精度还要小小小小的多而采样数据中的竞争问题会成为潜在影响仿真准确性的问题。

如何解决竞争问题呢?

  • 在驱动时,可以添加相应的人为延迟来模拟真实的延迟。或者在采样时间前的某段时刻中进行采样。
  • clocking(时序块)基于时钟周期对信号进行驱动或者采样,使得testbench不再考虑竞争的问题。

1.5 clocking时钟块

  • clocking可以用在module,也可以用在interface,一般用在interface中。
  • clocking中列举的信号由interface声明不可以自己定义。
  • clocking声明玩名字之后,伴随着定义默认的采样事件,‘default input/out event’。如果没有定义,默认在clocking采样事件前1step对输入进行采样在采样时间后的#0对输出驱动。(#0是一个时间片包括无穷个delta-cycle)
  • 除了定义默认的采样和驱动事件,还可以自己添加新的时间来覆盖默认事件。

以上几点在下面的例子中具体说明。

clocking bus @ ( posedge clock1) ;
	default input #10ns output #2ns;
	input data , ready , enable;
	output negedge ack ;
	input  #1step addr;
endclocking

第一行定义clocking块名字是bus,有clock1上升沿来驱动和采样。
第二行支出clocking中所有的信号在clock1上升沿的前10ns来对其进行输入采样,在时间的后2ns进行输出驱动。(模拟建立保持时间)
第三行声明了要对其采样的三个输入信号,data,ready和enable信号,这三个信号作为输入,默认输入时间为clock1上升沿的前10ns。
第四行声明了要驱动的ack信号,由时钟clock1的下降沿驱动,clock1上升沿后的2ns。
接下来的addr,采用自身定义的采样事件,clock1上升沿的1step。采样发生在clock1上升沿的上一个时间片采样区域,保证采样到的数据是上一个时钟周期的数据。

参考原文链接:https://blog.csdn.net/baidu_38317135/article/details/126174822

文章来源地址https://www.toymoban.com/news/detail-685805.html

到了这里,关于保姆级超硬核包会,​System Verilog SV接口(interface )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DFS(深度优先搜索算法)入门保姆级超详解

    如题,本篇创作目的在于更精细化理解DFS的运作,篇幅不长,也只是作者的一家之言,只为提供一个对入门者的更精细的解释。 DFS,深度优先搜索算法,首先我们看中文,可以很清楚的理解到这个算法是指搜索操作中优先进行深度也就是纵向的数据筛查。 看搜索的基本思路

    2024年02月07日
    浏览(49)
  • 【Unity InputSystem】基础教程(保姆级超详细超基础!!!)

    随着Unity的不断发展,开发者们对Unity的项目输入系统要求也越来越高,经常会有项目在做多平台适配和跨平台移植时对变更输入系统而感到烦恼。而InputSystem这款插件正是Unity官方为了解决广大开发者而推出的一款新的输入方式。 相较于旧版的InputManager,InputSystem的操作虽然

    2024年02月11日
    浏览(39)
  • Yolov5 + Deepsort 重新训练自己的数据(保姆级超详细)

    从下面github库中拿代码: https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch GitHub - Sharpiless/Yolov5-Deepsort: 最新版本yolov5+deepsort目标检测和追踪,能够显示目标类别,支持5.0版本可训练自己数据集 最新版本yolov5+deepsort目标检测和追踪,能够

    2024年01月19日
    浏览(60)
  • Kubeadm高可用部署K8S 1.24版本---保姆级超详细!!!

    目录 一、前言 二、基础环境部署 1)前期准备(所有节点) 1、修改主机名和配置 hosts 2、配置 ssh 互信 3、时间同步 4、关闭防火墙 5、关闭 swap 6、禁用 SELinux 7、允许 iptables 检查桥接流量(可选,所有节点) 2)安装容器 docker(所有节点) 3)配置 k8s yum 源(所有节点) 4)

    2023年04月14日
    浏览(44)
  • sv,verilog

    在 Verilog 中,敏感列表(Sensitive List)指的是在 always 语句块中使用时钟信号的列表。敏感列表用于指定 always 块所监控的输入信号,在这些信号状态发生变化时, always 块会被触发执行。 在 Verilog 中, always 块有两种敏感列表: 电平敏感列表(Level-Sensitive List):较早的 Ver

    2024年02月04日
    浏览(38)
  • JDBC 技术 | Java连接MySQL数据库(四万字零基础保姆级超全详解)

    管他啥是啥,看就完了!如果觉得博主写的不错,可以点赞关注支持一下博主哦!有什么地方存在不足或者错误的,烦请各位大佬在评论区指正。万分感谢!! 本文结合了韩顺平零基础学java,黑马程序员零基础学 JavaWeb,等多个视频的相关知识内容整理而来。花费了很多很多

    2024年02月05日
    浏览(69)
  • 数据结构——双向链表(保姆级教程,包学包会)

    双向链表就是带头双向循环链表 我们在学完单链表之后,就感觉这个非常简单了,他的主要表现就是拥有头节点,链表永不为空,不需要二级指针;可以通过一个节点找到上一个或者下一个节点;头尾相连呈环状。 他主要结构是由 prev、next、data ,这三个结构组成,通过pr

    2024年02月03日
    浏览(37)
  • Zookeeper+Hadoop+Spark+Flink+Kafka+Hbase+Hive 完全分布式高可用集群搭建(保姆级超详细含图文)

    说明: 本篇将详细介绍用二进制安装包部署hadoop等组件,注意事项,各组件的使用,常用的一些命令,以及在部署中遇到的问题解决思路等等,都将详细介绍。 ip hostname 192.168.1.11 node1 192.168.1.12 node2 192.168.1.13 node3 1.2.1系统版本 1.2.2内存建议最少4g、2cpu、50G以上的磁盘容量 本次

    2024年02月12日
    浏览(53)
  • 保姆级教程——将springboot项目部署到阿里云服务器(小白包会)

    昨天本想着看论文,结果发现找的论文和课题不一致。那干点什么好呢?那就把我的毕业设计(一个springboot项目)部署到服务器上,随便试试喽。网上的教程发现大部分都是一知半解,只能东拼西凑的查,费了不少时间。希望这篇博文能帮助一下刚入手的像我一样的小白!

    2023年04月18日
    浏览(39)
  • Maven详见及在Idea中的使用方法[保姆级包学包会]

    maven是什么? maven能干什么? maven是如何工作的? maven中你遇到过什么问题,是通过什么方法,手段定位的问题,然后如何解决的? maven简介 Maven 是一个项目管理和综合工具。Maven 提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven 使用标准

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包