• 验证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
  • 相关阅读:
    @KafkaListener注解详解(一)| 常用参数详解
    MES系统以全流程优化为核心,实现全闭环的生产
    Docker学习——容器
    C++怎么判断windows系统是64位还是32位
    Angular-03:组件模板
    NVMe-MI --- Message Servicing Model(消息服务模型)
    4700 万美元损失,Xn00d 合约漏洞攻击事件分析
    数组的子集不能累加出的最小正数
    C多线程编程- 近似求解π
    (原创)安卓Compose相关资料汇集
  • 原文地址:https://blog.csdn.net/qianniuwei321/article/details/127519230