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

Verilog 入门(八)(验证)

文章目录

  • 编写测试验证程序
  • 波形产生
    • 值序列
    • 重复模式
  • 测试验证程序实例
  • 从文本文件中读取向量
  • 实例:时序检测器

测试验证程序用于测试和验证设计方法的正确性。Verilog 提供强有力的结构来说明测试验证程序。

编写测试验证程序

测试验证程序有三个主要目的:

  1. 产生模拟激励(波形);
  2. 将输入激励加入到测试模块并收集其输出响应;
  3. 将响应输出与期望值进行比较。

典型的测试验证程序形式如下:

module test_bench;// 通常测试验证程序没有输入和输出端口Local_reg_and_net_declarationsGenerate_waveforms_using_initial_&_always_statementsInstantiate_module_under_testMonitor_output_and_compare_with_expected_values
endmodule

测试中,通过在测试验证程序中进行实例化,激励自动加载于测试模块。

波形产生

有两种产生激励值的主要方法:

  1. 产生波形,并在确定的离散时间间隔加载激励;
  2. 根据模块状态产生激励,即根据模块的输出响应产生激励。

通常需要两类波形。一类是具有重复模式的波形,例如时钟波形,另一类是一组指定的值确定的波形。

值序列

产生值序列的最佳方法是使用 initial 语句。例如:

initialbeginReset = 0;#100 Reset = 1;#80 Reset = 0;#30 Reset = 1;end

生成的波形如下图所示:

在这里插入图片描述
如果使用非阻塞性过程赋值产生如上所示的波形,则写法如下:

initialbeginReset <= 0;Reset <= #100 1;Reset <= #180 0;Reset <= #210 1;end

重复模式

重复模式的生成通过使用如下形式的连续赋值形式加以简化:

assign #(PERIOD/2) Clock = ~ Clock;

但是这种做法并不完全正确。问题在于 Clock 是一个线网(只有线网能够在连续赋值中被赋值),它的初始值是 z,并且,z 等于 x,~ x 等于 x。因此 Clock 的值永远固定为值 x。

下面是一个完整的时钟产生器模块:

module Gen_Clk_A(Clk_A);output Clk_A;reg Clk_A;parameter tPERIOD = 10;initialClk_A = 0;always #(tPERIOD/2) Clk_A = ~ Clk_A;

测试验证程序实例

下面是 2-4 解码器和它的测试验证程序:

`timescale 1ns/1ns
module Dec2x4(A, B, Enable, Z);input A, B, Enable;output[0:3] Z;wire Abar, Bbar;not #(1, 2)V0(Abar, A);V1(Bbar, B);nand #(4, 3)N0(Z[0], Enable, Abar, Bbar);N0(Z[1], Enable, Abar, B);N0(Z[2], Enable, A, Bbar);N0(Z[3], Enable, A, B);
endmodulemodule Dec_Test;reg Da, Db, Dena;wire[0:3] Dz;Dec2x4 D1(Da, Db, Dena, Dz);initialbeginDena = 0;Da = 0;Db = 0;#10 Dena = 1;#10 Da = 1;#10 Db = 1;#10 Da = 0;#10 Db = 0;#10 $stop;endalways@(Dena or Da or Db or Dz)$display("At time %t, input is %b%b%b, output is %b", $time, Da, Db, Dena, Dz);
endmodule

从文本文件中读取向量

可用 $readmemb 系统任务从文本文件中读取向量(可能包含输入激励和输出期望值)。下面为测试 3 位全加器电路的例子。假定文件 "test.vec" 包含如下两个向量:

在这里插入图片描述
向量的前三位对应于输入 A,接下来的三位对应于输入 B,再接下来的位是进位,八到十位是期望的求和结果,最后一位是期望进位值的输出结果。下面是全加器模块和相应的测试验证程序:

module Adder1Bit(A, B, Cin, Sum, Cout);input A, B, Cin;output Sum, Cout;assign Sum = (A ^ B) ^ Cin;assign Cout = (A ^ B) | (A & Cin) | (B & Cin);
endmodulemodule Adder3Bit(First, Second, Carry_In, Sum_Out, Carry_Out);input[0:2] First, Second;input Carry_In;output[0:2] Sum_Out;output Carry_Out;wire[0:1] Car;Adder1BitA1(First[2], Second[2], Carry_In, Sum_Out[2], Car[1]),A1(First[1], Second[1], Car[1], Sum_Out[1], Car[0]),A1(First[0], Second[0], Car[0], Sum_Out[0], Carry_Out);
endmodulemodule TestBench;parameter BITS = 11, WORDS = 2;reg[1:BITS] Vmem[1:WORDS];reg[0:2] A, B, Sum_Ex;reg Cin, Cout_Ex;integer J;wire[0:2] Sum;wire Cout;Adder3Bit F1(A, B, Cin, Sum, Cout);initialbegin$readmemb("test.vec", Vmem);for(J=1, J<=WORDS; J=J+1)begin{A, B, Cin, Sum_Ex, Cout_Ex} = Vmem[J]#5;if((Sum !== Sum_Ex) || (Cout !== Cout_Ex))$display("****Mismatch on vector %b ****", Vmem[J]);else$display("No mismatch on vector %b", Vmem[J]);endend
endmodule

测试模块中首先定义存储器 Vmem,字长对应于每个向量的位数,存储器字数对应于文件中的向量数。

实例:时序检测器

检测数据线上连续三个 1 的序列。在时钟的每个下沿检查数据,状态图如下:

在这里插入图片描述

module Count3_1s(Data, Clock, Detect3_1s);input Data, Clock;output Detect3_1s;integer Count;reg Detect3_1s;initial beginCount = 0;Detect3_1s = 0;endalways@(negedge Clock) beginif(Data == 1)Count = Count + 1;elseCount = 0;if(Count >= 3)Detect3_1s = 1;else:Detect3_1s = 0;end
endmodulemodule Top;reg Data, Clock;wire Detect;integer Out_File;Count3_1s F1(Data, Clock, Detect);initial beginClock = 0;forever#5 Clock = ~ Clock;endinitial beginData = 0;#5 Data = 1;#40 Data = 0;#10 Data = 1;#40 Data = 0;#20 $stop;endinitial beginOut_File = $fopen("results.vectors");$montitor(Out_File, "Clock = %b, Data = %b, Detect = %b", Clock, Data, Detect);end
endmodule

相关文章:

Verilog 入门(八)(验证)

文章目录 编写测试验证程序波形产生值序列重复模式 测试验证程序实例从文本文件中读取向量实例&#xff1a;时序检测器 测试验证程序用于测试和验证设计方法的正确性。Verilog 提供强有力的结构来说明测试验证程序。 编写测试验证程序 测试验证程序有三个主要目的&#xff1a;…...

vue3 vue-router 导航守卫 (五)

在Vue 3中&#xff0c;导航守卫仍然是一个重要的概念&#xff0c;用于在路由切换时执行一些特定的逻辑。Vue Router提供了多个导航守卫&#xff0c;包括全局守卫、路由独享守卫和组件内守卫。可以在路由切换时执行一些特定的逻辑&#xff0c;例如身份验证、权限控制、数据加载等…...

Git命令---查看远程仓库

介绍 使用git命令查看绑定的远程仓库。 命令 git remote -v...

12.8作业

1. 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是…...

算法:有效的括号(入栈出栈)

时间复杂度 O(n) 空间复杂度 O(n∣Σ∣)&#xff0c;其中 Σ 表示字符集&#xff0c;本题中字符串只包含 6 种括号 /*** param {string} s* return {boolean}*/ var isValid function(s) {const map {"(":")","{":"}","["…...

vxworks常用的指令归纳

目的&#xff1a;方便自己查阅 tftpboot 0x10000000 vxworks bootelf 0x10000000 ifconfig "gem0 dowm" ifconfig "gem0 inet 192.168.0.81" ifconfig "gem0 lladdr 01:02:03:04:05:06:07" ifconfig "gem0 up" ld 0,1,"…...

线性回归实战

3.1 使用正规方程进行求解 3.1.1 简单线性回归 公式 &#xff1a; y w x b y wx b ywxb 一元一次方程&#xff0c;在机器学习中一元表示一个特征&#xff0c;b表示截距&#xff0c;y表示目标值。 使用代码进行实现&#xff1a; 导入包 import numpy as np import matp…...

stm32 使用18B20 测试温度

用18b20 测试温度是非常常用的&#xff0c;不过18B20的调试不是这么容易的&#xff0c;有些内容网上很多的&#xff0c;不再重复说了&#xff0c;我先把波形说一下&#xff0c;再说程序部分&#xff1a; 整个都温度数据的顺序是&#xff1a; 1.700uS的低电平复位并测试18B20的…...

【Delphi】一个函数实现ios,android震动功能 Vibrate(包括3D Touch 中 Peek 震动等)

一、前言 我们在开发移动端APP的时候&#xff0c;有时可能需要APP能够提供震动功能&#xff0c;以便提醒操作者&#xff0c;特别是ios提供的3D Touch触感功能&#xff0c;操作者操作时会有触感震动&#xff0c;给操作者的感觉很友好。那么&#xff0c;在Delphi的移动端FMX开发中…...

国产Type-C PD芯片—接口快充取电芯片

常用USB PDTYPE-C受电端&#xff0c;即设备端协议IC芯片&#xff08;PD Sink&#xff0c;也叫PD诱骗芯片&#xff09;&#xff0c;诱导取电芯片。 产品介绍 LDR6328: ◇ 采用 SOP-8 封装 ◇ 兼容 USB PD 3.0 规范&#xff0c;支持 USB PD 2.0 ◇ 兼容 QC 3.0 规范&#x…...

pytorch学习6-非线性变换(ReLU和sigmoid)

系列文章目录 pytorch学习1-数据加载以及Tensorboard可视化工具pytorch学习2-Transforms主要方法使用pytorch学习3-torchvisin和Dataloader的使用pytorch学习4-简易卷积实现pytorch学习5-最大池化层的使用pytorch学习6-非线性变换&#xff08;ReLU和sigmoid&#xff09;pytorc…...

详解Keras3.0 Models API: Whole model saving loading

1、save方法 Model.save(filepath, overwriteTrue, **kwargs) 将模型另存为.keras文件 参数说明 filepath: 保存模型的路径。必须以.keras结尾overwrite&#xff1a;布尔值&#xff0c;表示是否覆盖已存在的文件。默认为 True&#xff0c;即覆盖已存在的文件。save_format…...

Spring Cloud Gateway 网关的基础使用

1. 什么是网关&#xff1f;网关有什么用&#xff1f; 在微服务架构中&#xff0c;网关就是一个提供统一访问地址的组件&#xff0c;它解决了内部微服务与外部的交互问题。网关主要负责流量的路由和转发&#xff0c;将外部请求引到对应的微服务实例上。同时提供身份认证、授权、…...

小米手机锁屏时间设置为永不休眠_手机不息屏_保持亮屏

环境&#xff1a;打开手机自带的锁屏时间设置发现没有 永不息屏的选项 原因&#xff1a;采用了三星OLED屏幕&#xff0c;所以根据OLED屏幕特性&#xff0c;这个是为了防止烧屏而特意设计的。非OLED机型支持设置“永不” 解决方案1&#xff1a;原生系统是支持永不锁屏的&#…...

lightdb plorasql集合类型新增可变数组

文章目录 背景集合类型可变数组可变数组示例 背景 在信创适配中&#xff0c;从Oracle迁移过来的存储过程使用到可变数组。因此在LightDB-X 23.4版本中对现有的集合类型进行了增强&#xff0c;添加了可变数组类型。 集合类型 在LightDB-X 23.4版本开始plorasql支持的集合类型…...

算法--最短路

这里写目录标题 xmind单源最短路简介所有边权都是正朴素的Dijkstra算法思想例子题解 堆优化版的Dijkstra算法 存在负数权Bellman-Ford算法思想例子题解 spfa算法思想例子题解 spfa判断负环思想例子题解 多源汇最短路简介弗洛伊德算法思想例子题解 小tips xmind 上述中&#xff…...

Linux 定时任务备份MySQL数据库

Linux 定时任务基本知识 crontab yum install crontabs &#xff08;安装 crontabs&#xff09; systemctl enable crond &#xff08;设为开机启动&#xff09; systemctl start crond&#xff08;启动crond服务&#xff09; systemctl status crond &#xff08;查看状态&a…...

查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息

文章目录 摘要1. 查询CPU使用率命令&#xff1a;top -bn1 | grep \"Cpu(s)\" | awk {split($0,arr,\" \");print 100-arr[8]}2. 查询内存命令&#xff08;单位&#xff1a;G&#xff09;&#xff1a;top -bn1 | grep \"KiB Mem\" | awk {split($…...

外观模式 rust和java的实现

文章目录 外观模式介绍实现javarustrust仓库 外观模式 外观模式&#xff08;Facade Pattern&#xff09;隐藏系统的复杂性&#xff0c;它为子系统中的一组接口提供一个统一的高层接口&#xff0c;使得这些接口更加容易使用。外观模式通过封装子系统内部的复杂性&#xff0c;提…...

uniapp-hubildx配置

1.配置浏览器 &#xff08;1&#xff09;运行》运行到浏览器配置》配置web服务器 &#xff08;2&#xff09;选择浏览器安装路径 &#xff08;3&#xff09;浏览器安装路径&#xff1a; &#xff08;3.1&#xff09; 右键点击图标》属性 &#xff08;3.2&#xff09;选择目标&…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...