路科验证V0实验lab1总结

本文详细介绍了Verilog中程序块的作用和使用方法,包括复位信号的处理,以及非阻塞赋值在时钟块中的应用。此外,还探讨了interface接口的功能,如信号连接和modport的优点与缺点。最后,展示了顶层模块router_test_top如何实例化和连接各个部分。通过示例代码和波形图,深入理解了Verilog设计的层次结构和信号交互。
摘要由CSDN通过智能技术生成

1.总共分三个部分,test.sv router_io.sv router_test_top.sv , router.v是DUT部分

1.1 test.sv部分是给出一个复位信号

代码如下:

program的作用:

1)验证程序执行的主要结构和入口

2)它提供了一个封装验证程序数据,函数,任务的结构

3)它提供了一个语法来指定在Reactive区域中的调度执行

使用方法和目的:

1)在程序块中,要采用非阻塞赋值语句(<=)对时钟块(clocking block)中的信号做驱动

2)在程序块中的本地变量进行赋值要采用阻塞赋值语句(=)

3)程序块中可以有任务,函数,类,initial块,但是不能有always块

4)对封装验证程序的程序块采用 automatic 来定义

其中,给出了一个复位的 task 模块,分别对 reset_n frame_n valid_n 进行复位,可以看到的是,9行是阻塞赋值,剩下的 10-12行中的信号都是非阻塞赋值可以得到cb(时钟块)中的信号必须使用非阻塞赋值。

而且可以在9行,12行,知道 异步复位,同步释放(为了防止亚稳态)

波形图:

 可以看到reset_n信号在 51ns 被拉高了

同样的frame_n 和 valid_n 也在51ns 被置为了高位,可代码中,明明写的是#2 复位信号才被置高,为什么它和下面两个信号在同一时间出现呢?

解答:可以看到复位信号被置为高时,是cb.reset_n  也就是属于时钟模块,那么就是非阻塞赋值,同步释放,等到cb模块被驱动才触发,时钟在50ns上升沿的时候,时钟模块里面也规定了,输入输出都是要延时1ns。

故整个复位代码执行顺序如下:

  1. 0ns进入,先执行reset_n = 0 ,因为是阻塞赋值
  2. 10行-12行都是非阻塞,故挂起,等待,要等到时钟模块被触发才顺序执行
  3. 执行13行 cb 时钟模块执行一次,50ns,
  4. 进而,因为cb模块第一次被触发,10行-12行可以顺序执行了,故开始时间是51ns,reset_n的2ns相在等待时钟模块的50ns已经消耗完了
  5. 整个过程是15次时钟触发,故总时间是50ns+14*100ns = 1450ns,
  6. 第十五次的时钟为什么没有完整呈现,只有上升沿?

整个的波形如下:

 

1.2. router_io.sv 是interface(接口)部分

代码如下:

接口部分作用:是为了连接router_test_top和test的

其中 modport TB(clocking cb, output reset_n),作用是 

interface中的 modport优缺点:
优点:
1、接口便于重用
2、接口可以用来代替原来需要反复声明并且位于代码内部的一系列信号,减少了连接错误的可能
3、要增加一个新的信号时,在接口中只需要声明一次,而不需要在更高层的模块声明
4、modport允许一个模块很方便的将接口中的一系列信号捆绑到一起,也可以为信号指定方向一方便工具自动检查。
缺点:
1)必须同时使用信号名与接口名、可能会使得模块变得更加冗长
2)连接两个不同的接口很困难。一个新的接口可能包含了现有的所有信号并新增了信号。你需要拆分出独立的信号并且正确地驱动。
 

1.3 router_test_top.sv 是顶层部分

代码如下:

 $timeformat(-9, 1, "ns", 10) 表示:10^(-9)单位是 ns

顶层模块的作用:对Program 和 DUT 实例化并连接,并实现 router_io  test  的实例化,

连接代码如下:

router_io top_io(SystemClock);

test t(top_io);

连接图:

SystemVerilog的听课学习笔记,包括讲义截取、知识点记录、注意事项等细节的标注。 目录如下: 第一章 SV环境构建常识 1 1.1 数据类型 1 四、二值逻辑 4 定宽数组 9 foreach 13 动态数组 16 队列 19 关联数组 21 枚举类型 23 字符串 25 1.2 过程块和方法 27 initial和always 30 function逻辑电路 33 task时序电路 35 动态 静态变量 39 1.3 设计例化和连接 45 第二章 验证的方法 393 动态仿真 395 静态检查 397 虚拟模型 403 硬件加速 405 效能验证 408 性能验证 410 第三章 SV组件实现 99 3.1 接口 100 什么是interface 101 接口的优势 108 3.2 采样和数据驱动 112 竞争问题 113 接口中的时序块clocking 123 利于clocking的驱动 133 3.3 测试的开始和结束 136 仿真开始 139 program隐式结束 143 program显式结束 145 软件域program 147 3.4 调试方法 150 第四章 验证的计划 166 4.1 计划概述 166 4.2 计划的内容 173 4.3 计划的实现 185 4.4 计划的进程评估 194 第五章 验证的管理 277 6.1 验证的周期检查 277 6.2 管理三要素 291 6.3 验证的收敛 303 6.4 问题追踪 314 6.5 团队建设 321 6.6 验证的专业化 330 第六章 验证平台的结构 48 2.1 测试平台 49 2.2 硬件设计描述 55 MCDF接口描述 58 MCDF接口时序 62 MCDF寄存器描述 65 2.3 激励发生器 67 channel initiator 72 register initiator 73 2.4 监测器 74 2.5 比较器 81 2.6 验证结构 95 第七章 激励发生封装:类 209 5.1 概述 209 5.2 类的成员 233 5.3 类的继承 245 三种类型权限 protected/local/public 247 this super 253 成员覆盖 257 5.4 句柄的使用 263 5.5 包的使用 269 第八章 激励发生的随机化 340 7.1 随机约束和分布 340 权重分布 353 条件约束 355 7.2 约束块控制 358 7.3 随机函数 366 7.4 数组约束 373 7.5 随机控制 388 第九章 线程与通信 432 9.1 线程的使用 432 9.2 线程的控制 441 三个fork...join 443 等待衍生线程 451 停止线程disable 451 9.3 线程的通信 458 第十章 进程评估:覆盖率 495 10.1 覆盖率类型 495 10.2 功能覆盖策略 510 10.3 覆盖组 516 10.4 数据采样 524 10.5 覆盖选项 544 10.6 数据分析 550 第十一章 SV语言核心进阶 552 11.1 类型转换 552 11.2 虚方法 564 11.3 对象拷贝 575 11.4 回调函数 584 11.5 参数化的类 590 第十二章 UVM简介 392 8.2 UVM简介 414 8.3 UVM组件 420 8.4 UVM环境 425
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值