• SystemVerilog Assertions应用指南 Chapter1.34 :SVA中的多时钟定义


            SVA允许序列或者属性使用多个时钟定义来采样独立的信号或者子序列。SVA会自动地同步不同信号或子序列使用的时钟域下面的代码显示了一个序列使用多个时钟的简单例子。

    1. sequence s_multiple_clocks;
    2. @(posedge clk1) a ##1 @(posedge clk2) b;
    3. endsequence

            序列 s_multiple_clocks检验在时钟“clkl”的任何上升沿,信号“a”为高,接着在时钟“clk2”的上升沿,信号“b”为高。当信号“a”在时钟“clk1”的任意给定上升沿为高时,序列开始匹配。接着“##1”延迟构造将检验时间移到时钟“clk2”的最近的。
            上升沿,检查信号“b”是否为高。当在一个序列中使用了多个时钟信号时,只允许使用“##1”延迟构造。序列 s_multiple_clocks不能被重写成下面这种形式。

    1. sequence s_multiple_clock_illegall;
    2. @(posedge clk1) a ##0 @(posedge clk2) b;
    3. endsequence
    4. sequence s_multiple_clock_illegal2:
    5. @(posedge clk1) a ##2 @(posedge clk2) b;
    6. endsequence

            使用“##0”会产生混淆,即在信号“a”匹配后究竟哪个时钟信号才是最近的时钟。这将引起竞争,因此不允许使用。使用#2也不允许,因为不可能同步到时钟“ck2”的最近的上升沿。相似的技术可以用来建立具有多个时钟的属性。如下面的例子所示:

    1. property p_multiple_clocks;
    2. @(posedge clk1) s1 ##1 @(posedge clk2) s2;
    3. endproperty

            它假定序列s1没有被时钟驱动,或者它的时钟定义和“clk1”样。它又假定序列s2没有被时钟驱动,或者它的时钟定义和“clk2”一样。同样的,属性可以在序列定义之间使用非交叠蕴含运算符。下面是一个简单的例子:

    1. property p_multiple_clocks_implied;
    2. @(posedge clk1) s1 |=> @(posedge clk2) s2;
    3. endproperty

            禁止在两个不同时钟驱动的序列之间使用交叠藴含运算符。因为先行算子的结束和后续算子的开始重叠,可能引起竞争的情况,这是非法的。下面的代码显示了这种非法的编码方式:

    1. property p_multiple_clocks_implied_illegal;
    2. @(posedge clk1) s1 |-> @(posedge clk2) s2;
    3. endproperty

  • 相关阅读:
    axios+跨域-笔记
    cola架构:cola源码中访问者模式应用浅析
    若依微服务项目本地启动
    UE4两种点击空间UI弹窗的方式
    BUUCTF reverse wp 91 - 95
    WPF基础的一些基本操作
    docker容器启动rabbitmq
    谢邀,ADconf安全大会
    Python实现猎人猎物优化算法(HPO)优化Catboost分类模型(CatBoostClassifier算法)项目实战
    DTSE Tech Talk | 第11期:深入浅出畅谈华为云低时延直播技术
  • 原文地址:https://blog.csdn.net/qq_33300585/article/details/133935648