当前位置: 首页 > news >正文

SystemVerilog 教程第一章:简介

SystemVerilog 教程

像 Verilog 和 VHDL 之类的硬件描述语言 (HDL) 主要用于描述硬件行为,以便将其转换为由组合门电路和时序元件组成的数字块。为了验证 HDL 中的硬件描述正确无误,就需要具有更多功能特性的面向对象的编程语言 (OOP) 来支持复杂的测试过程,这种语言通常被称为硬件验证语言 (HVL)。

SystemVerilog 是 Verilog 的扩展,具有诸多此类验证功能,能支持工程师在仿真中使用复杂的测试激励文件结构和随机激励来验证设计。

为何不首选使用 Verilog?

回望 20 世纪 90 年代,Verilog 是验证设计功能的主要语言,这类设计较小、并不太复杂并且所含功能特性较少。但随着设计变得越来越复杂,对于使用更好的工具来完成设计并进行验证的需求也与日俱增。相比于 Verilog,SystemVerilog 的主要优势体现在它能够执行受约束的随机激励、在测试激励文件构造中使用 OOP 功能特性、功能覆盖范围、断言等等。

什么是验证?

验证是确保给定硬件设计能按期望方式来工作的过程。芯片设计是极为昂贵且耗时的过程,制造更是需要花费数百万。如果能够在设计进程中尽早发现设计中的功能缺陷,就能有助于节省成本。如果在设计流程晚期才发现设计缺陷,那么就必须重复所有设计步骤,这将耗用更多资源、金钱和时间。如果不得不重复整个设计流程,那么这被称为芯片流片。

那 Vera、e 和其它类似的 HVL 又如何?

这些语言由来已久。SystemVerilog 能够被视作为 Verilog(最常用的 HDL)的扩展,在 SystemVerilog 中验证 Verilog 设计自然是合情合理的。并且,SystemVerilog 支持 OOP,故而能在更高抽象层次进行设计验证。

如何在验证过程中使用 SystemVerilog?

硬件设计主要由多个 Verilog (.v) 文件构成,并包含一个顶层模块,其中所有其它子模块都会通过例化来达成所需的行为和功能。对给定 Verilog 设计进行验证需要一个称为测试激励文件的环境,近年来,该环境通常都是以 SystemVerilog 编写的。利用不同激励来驱动设计的意图是通过观测其输出,并将其与期望的值进行比较,从而观察设计行为是否与期望相符。

为此,顶层设计模块会在测试激励文件环境内进行例化,设计输入/输出端口会与相应的测试激励文件组件信号相连接。我们利用已知能使设计正常运作的某些值来驱动设计输入。通过分析输出,并将其与期望的值进行比对,来查看设计行为是否正确。

示例

这里提供了一个简单的 D 触发器 Verilog 设计验证示例。DFF 的功能是 Q 输出管脚被锁存到每个正时钟沿的 D 输入管脚中的值,使其成为正时钟沿触发的触发器。同时,我们假定该触发器具有低电平有效复位管脚和时钟。

// File : d_ff.v
module d_ff (clk, resetn, q, d);input clk;input resetn;input d;output q;reg q;always @ (posedge clk)if (! resetn)q <= 0;elseq <= d;endmodule

我们需要为此设计构建一个测试激励文件,以便将某些信号值驱动到其输入管脚 clkresetd,并观测输出结果。通过驱动相应的激励并检查结果,即可确认其功能行为正常。随后,综合工具即可将此设计转化为真实的硬件逻辑和门电路。

// File : tb_top.sv
module tb_top ();reg clk;reg resetn;reg d;wire q;// Instantiate the designd_ff  d_ff0 (	.clk (clk),.resetn (resetn),.d (d),.q (q));// Create a clockalways #10 clk <= ~clk;initial beginresetn <= 0;d <= 0;#10 resetn <= 1;#5      d <= 1;#8      d <= 0;#2      d <= 1;#10     d <= 0;end
endmodule

tb_top 文件表示一个简单的测试激励文件,您在其中已创建一个 d_ff0 设计的对象,并将其端口与测试激励文件中的信号相连接。随后,您只需在测试激励文件中分配或驱动信号即可,这些信号将会被传递到设计上。

http://www.lryc.cn/news/39433.html

相关文章:

  • 【Java|基础篇】逻辑控制-顺序结构、分支结构和循环结构
  • 【数据挖掘实战】——家用电器用户行为分析及事件识别(BP神经网络)
  • Kmeans聚类算法-python
  • Linux|奇怪的知识|locate命令---文件管理小工具
  • Cadence Allegro 导出Function Pin Report报告详解
  • 蓝桥杯2018年第九题-缩位求和
  • 基于Yolv5s的口罩检测
  • Linux基本命令
  • 云原生场景下的安全左移
  • mysql面试经典问题
  • 微信小程序|基于小程序+C#制作一个考试答题小程序
  • 【1605. 给定行和列的和求可行矩阵】
  • Linux命令之nano命令
  • IT项目管理(作业1)
  • 蓝桥杯嵌入式(G4系列):串口收发
  • 「兔了个兔」玉兔踏青,纯CSS实现瑞兔日历(附源码)
  • 第17章 关于局部波动率的一些总结
  • 反转链表合并两个有序链表链表分割链表的回文结构相交链表
  • 联想触摸板只能单击,二指三指失效
  • mysql 删除表卡死,或是截断(truncate)卡死解决办法
  • ORACLE P6 EPPM 架构及套件介绍(源自Oracle Help)
  • Android开发面试:数据结构与算法知识答案精解
  • 京东前端手写面试题集锦
  • 【JDK动态代理】及【CGLib动态代理】:Java的两种动态代理方式
  • 《程序员面试金典(第6版)》面试题 04.05. 合法二叉搜索树
  • Nginx 反向代理技术梳理
  • 华为OD机试 - 整数编码(Java) | 机试题+算法思路+考点+代码解析 【2023】
  • 蓝桥杯冲击01 - 质数篇
  • 【WEB前端进阶之路】 HTML 全路线学习知识点梳理(下)
  • MySQL索引分类