SystemVerilog Assertions实战:从基础语法到高级时序验证

1. 断言是什么?为什么你需要它?

如果你做过数字电路设计或者验证,肯定遇到过这种情况:辛辛苦苦跑了好几个小时的仿真,结果发现波形里某个信号在某个时间点出现了不该有的毛刺,或者两个信号同时有效了。这种问题,靠人眼盯着波形看,效率低不说,还特别容易漏掉。SystemVerilog Assertions(SVA) 就是为了解决这个痛点而生的。

简单来说,断言就是嵌入在你设计代码里的“监视器”和“预言家”。它用声明式的语言,明确地告诉仿真器:“我的设计应该满足这样的行为规则”。比如,“读信号和写信号绝对不能同时为高”,或者“一个请求发出后,必须在接下来的两个时钟周期内收到应答”。仿真过程中,一旦这些规则被违反,断言就会立刻报错,把问题暴露在萌芽状态,而不是等到功能彻底出错才发现。

我刚开始接触断言时,也觉得它是一堆复杂的语法符号。但用久了才发现,它其实是提升验证效率和代码质量的神器。想象一下,你把设计的关键接口协议、状态机跳转规则、数据一致性要求都用断言写清楚,它们就会在每次仿真中自动帮你检查,相当于请了一个不知疲倦的“代码审查员”。这比写一大堆定向测试用例去覆盖这些场景要高效得多。

断言主要分两大类:即时断言(Immediate Assertions)并发断言(Concurrent Assertions)。即时断言就像你写在 always 块里的 if 语句,在程序执行到那个点时立刻检查条件,主要用于检查静态的、不依赖于时钟的组合逻辑条件。而并发断言才是SVA的精华,它基于时钟事件来描述跨越多个时钟周期的时序行为,是验证协议、接口和复杂状态机的核心工具。我们这篇文章的重点,就是带你从最基础的并发断言语法开始,一步步深入到高级的时序验证场景。

2. 从零开始:理解并发断言的核心语法

要玩转并发断言,你得先熟悉它的几个核心构建块:序列(Sequence)属性(Property)。你可以把序列想象成乐高积木里的小方块,它描述的是一个简单的、有时序关系的事件链。而属性则是用这些小方块搭建起来的完整模型,它定义了设计必须遵守的行为规则。

2.1 序列:描述事件的时间线

序列的基本语法很简单,就是用 ## 操作符来连接不同时钟周期的事件。##n 表示延迟 n 个时钟周期。

sequence s_req_ack;
    req ##1 ack;
endsequence

这个序列 s_req_ack 描述的是:当 req 信号为高时,下一个时钟周期 ack 信号也必须为高。这常用来检查一个简单的握手协议。

但实际协议往往更灵活。比如,应答可能在1到3个周期内到来。这时就需要用到区间延迟操作符 ##[min:max]

sequence s_flexible_ack;
    req ##[1:3] ack;
endsequence

这个序列的意思是:req 为高后,ack 在接下来的第1、第2或第3个时钟周期为高都算匹配成功。这比写三个独立的序列方便多了。

2.2 属性:定义行为的规则

序列本身只是描述了“发生了什么”,我们需要用属性来声明“这应该发生”。属性用 property 关键字定义,里面可以包含序列,也可以直接写时序表达式。

property p_handshake;
    @(posedge clk) req |-> ##[1:3] ack;
endproperty

assert property (p_handshake);

这里出现了一个关键操作符:蕴含(Implication) |->。它是断言逻辑的灵魂。a |-> b 的意思是:如果前提 a 发生了,那么后果 b 必须发生。如果前提 a 根本没发生,那这个属性就“空真”(vacuously true),直接通过检查。这非常符合我们的直觉:我们只关心在特定条件下设计的行为是否正确。

上面这个属性 p_handshake 就断言:每当在时钟上升沿采样到 req 为高,那么在接下来的1到3个周期内,必须采样到 ack 为高。我们用 assert 语句来启动对这个属性的检查。

2.3 采样与边沿检测:$rose, $fell, $stable, $past

在并发断言的世界里,所有信号的检查都基于“采样值”,默认是在时钟沿前的Preponed区域采样的。这就引出了几个非常实用的

源码链接: https://pan.quark.cn/s/a4b39357ea24 银行信贷业务作为银行业务的关键构成部分,涵盖了银行向客户提供的各类融资服务,例如贷款、担保以及信用证等。此类业务致力于协助企业与个人解决资金需求问题,进而推动经济活动的开展。银行通过信贷业务获取利息收入,同时需承担相应风险,以保障资金的稳定与流转。 **信贷定义** 信贷意味着银行运用自身资本及信誉为客户提供资金支持,而客户则需以支付利息、费用并偿还本金为前提条件。这种业务模式不仅包含直接贷款,还包括为客户的债务承担提供担保。依照会计准则,信贷业务可分为表内业务与表外业务,前者对银行的资产负债表产生直接影响,后者则不直接关联。 **信贷业务划分标准** 1. **依据会计核算归属**:表内信贷(如贷款、贴现)和表外信贷(如承兑、保证)。 2. **根据期限划分**:短期(不超过1年)、中期(1至5年)与长期(超过5年)。 3. **按照担保方式分类**:信用信贷(无担保)和担保信贷(保证、抵押、质押)。 4. **按照币种区分**:本币信贷与外币信贷。 5. **按照性质和用途区分**:固定资产贷款、流动资金贷款、循环额度贷款、消费贷款等。 6. **按照贷款组织形式区分**:普通贷款、联合贷款和银团贷款。 7. **按照资金来源区分**:信贷资金贷款、委托贷款和境外筹资转贷款。 8. **按照授信对象区分**:公司类信贷与个人类信贷。 **信贷业务产品** 1. **流动资金贷款**:用于企业日常运营周转或临时性资金需求。 2. **固定资产贷款**:用于投资固定资产项目。 3. **房地产开发贷款**:用于土地开发及房屋建设所需资金。 4. **循环额度贷款**:满足企业...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值