• 验证systemVerilog中激励的时序(clocking)


    1 背景介绍

    1.1 保留足够的setup time

    下图中在10ns时,没有建立(setup)时间,很容引起不确定情况发生,因此需要将write信号前移,留出足够长的setup time。
    在这里插入图片描述

    1.2 保留足够的hold time

    下图中,正确情况:

    • TB产生req信号,req信号拉高,DUT的grant信号拉高;
    • 当grant信号经过一个周期后,grant信号会被拉低,然后req信号也会拉低;
    • 若是hold time时间不够,req采到的grant为高电平(错误),那么req信号也无法拉低,出现错误。
      在这里插入图片描述

    1.3 总结

    驱动过晚或采样过早,都会引起竞争现象。在建立之前,稳定的驱动信号,可以避免竞争现象。

    2 clocking 模块控制同步信号

    clocking模块控制同步信号,要点:

    • clocking是关键字
    • systemVerilog中使用clocking模块控制同步信号
    • 在interface中定义clocking模块,将信号同步到某一个特定的时钟
    • clocking模块中所有信号都是同步驱动或采样,可以确保验证平台可以在正确的时间跟设计进行交互
    • clocking 模块主要使用在验证平台中,不能用作RTL设计
    • 一个interface中可以包含多个clocking模块

    2.1 用interface和clocking进行仿真

    • 从DUV的输出到testbench的输入有1个延迟
      • 需要在testbench的输入端加一个“虚拟的同步器”
    • 从testbench的输出到DUV的输入没有延迟
      default input #1 step output #0;(默认值,不写的话就是这个值,放置在clocking block)
      在这里插入图片描述

    2.2 定义input 和output skew,控制时序

    • input skew表示在时钟有效边沿采样信号的扭斜单位时间 output skew表示
    • 在时钟有效边沿驱动信号的扭斜单位时间
    clocking dram @(clk)
    	input #1ps address;
    	input #5
    	output #6 data;
    endclocking
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    2.3 clocking block举例和引用clocking模块中信号

    在这里插入图片描述自动将arbif.cb.request信号同步到clock上面。

    2.4 将信号同步到时钟有效边沿

    @arbif.cb; //等待接口arbif的时钟边沿
    repeat (3) @arbif.cb; //经过3个arbif接口的时钟上升沿
    
    • 1
    • 2

    2.5 同步到信号的任何一个边沿

    @arbif.grant; //等待接口grant信号的任意一个边沿
    @(posedge arbif.cb.grant); //等待grant信号的上升沿
    @(negedge arbif.cb.grant); //等待grant信号的下降沿
    wait (arbif.cb.grant==1) //等待grant信号为高电平,如果已经为高电平则没有延迟
    
    • 1
    • 2
    • 3
    • 4

    2.5 等待n个时钟周期 ##n 阻塞语句

    ##2 arbif.cb.requeset <= 0;//经过2个时钟周期后赋值
    
    • 1

    等效:repeat(2) @arbif.cb;

    2.6 引用clocking内的信号

    驱动信号必须用非阻塞赋值,采样信号用阻塞赋值

    arbif.cb.request <=1; //驱动输出信号
    value = arbif.cb.grant; //采样出入信号

    2.7 在下一个有效时钟边沿赋值

    如果不使用时间的推进语句如#1或者##1,仿真时间不会更新,会导致仿真悬挂

    forever begin
     if(request ==1)
     	grant <= 1;
     end	
    
    • 1
    • 2
    • 3
    • 4

    上面将会是死循环,直至内存写满,应该改成如下代码解决问题

    forever begin
    #1 ps
     if(request ==1)
     	grant <= 1;
     end	
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    循环掌控:深入理解C语言循环结构,高效实现重复性任务
    自动化更新包文件--shell脚本
    数据结构——栈和队列
    使用Microsoft.SemanticKernel基于本地运行的Ollama大语言模型实现Agent调用函数
    LeetCode:88. 合并两个有序数组
    醇酰基转移酶基因对猕猴桃酯生物合成的作用
    从您输入网站 URL 到其在屏幕上完成加载的整个过程
    react-route的路由
    Windows 系统服务器部署jar包时,推荐使用winsw,将jar包注册成服务,并设置开机启动。
    laravel 异步队列的使用
  • 原文地址:https://blog.csdn.net/qianniuwei321/article/details/127519230