verilog程序设计及SystemVerilog验证
1.Verilog测试程序设计基础
1.1Testbench及其结构
在仿真的时候Testbench用来产生测试激励给待验证设计( Design Under Verification, DUV),或者称为待测设计(Design UnderTest, DUT) 。
测试程序的一般结构:
Testbench是一个测试平台,信号集成在模块内部,没有输入输出。在Testbench模块内,例化待测设计的顶层模块,并把测试行为的代码封装在内,直接对待测系统提供测试激励。
例:T触发器测试程序
module TFF_tb;
reg clk, rst_n, T;
wire data_out;
TFF U1(.data_out(data_out), .T(T), .clk(clk), .rst_n(rst_n)); //对被测模块实例化
always
#5 clk = ~clk;
Initial
begin
clk = 0;
#3 rst_n = 0;
#5 rst_n = 1;
T = 1;
#30 T = 0;
#20 T = 1;
end
Initial
begin
$monitor($time,"T=%b, clk=%b,rst_n=%b,data_out=%b", T, clk, rst_n,data_out);
end
endmodule
T触发器的波形仿真和文本输出:
从下图可以清晰地看出Testbench的主要功能:
(1)为DUT提供激励信号0。
(2)正确实例化DUT。
(3)将仿真数据显示在终端或者存为文件,也可以显示在波形窗口中以供分析检查。
(4)复杂设计可以使用EDA工具,或者通过用户接口自动比较仿真结果与理想值,实现结果的自动检查。
在编写Testbench时需要注意的问题:
(1)testbench代码不需要可综合
Testbench代码只是硬件行为描述不是硬件设计。
(2)行为级描述效率高
Verilog HDL语言具备5个描述层次,分别为开关级、门级、RTL级、算法级和系统级。
(3)掌握结构化、程式化的描述方式
结构化的描述有利于设计维护,可通过initial、always以及assign语句将不同的测试激励划分开来。
一般不要将所有的测试都放在一个语句块中
2.2测试平台举例
测试平台需要产生时钟信号、复位信号和一系列的仿真向量,观察DUT的响应,确认仿真结果。
(1)组合逻辑电路仿真环境搭建
全加器真值表:
module adder1 (a, b, ci, so, co);
input a, b, ci ;
output so, co ;
assign { co , so } = a + b + ci ;
endmodule
根据全加器的真值表编写的全加器测试程序如下:
module adder1_tb ;
wire so, co;
reg a, b, ci;
adder1 U1(a, b, ci, so, co); //模块例化
initial //测试信号产生
begin
a = 0; b = 0; ci = 0;
#20 a = 0; b = 0; ci = 1;
#20 a = 0; b = 1; ci = 0;
#20 a = 0; b = 1; ci = 1;
#20 a = 1; b = 0; ci = 0;
#20 a = 1; b = 0; ci = 1;
#20 a = 1; b = 1; ci = 0;
#20 a = 1; b = 1; ci = 1;
#200 $finish;
end
endmodule
全加器的输入a、b和ci定义为reg型变量,把输出so和co定义为wire型变量;用模块例化语句
"adder1 U1(a,b,ci,so,co);"把全加器设计电路例化到测试仿真环境中;用initial块语句改变输入的变化并生成测试条件,输入的变化语句完全根据全加器的真值表编写
(2)时序逻辑电路仿真环境的搭建
在于时序逻辑电路仿真环境中,需要考虑时序、定时信息和全局复位、置位等信号,并定义这些信号。
用Verilog编写的十进制加法计数器:
module cnt10(cIk ,rst, ena, q, cout);
input clk,rst,ena;
output [3:0] q;
output cout;
reg [3:0] q;
always@(posedge clk or posedge rst)
begin
if(rst)q=4’b0000;
else if(ena)
begin
if(q<9)
q=q+1;
else
q=0;
end
end
assign cout=q[3]&q[0];
endmodule
测试程序代码:
module cnt10_tb;
reg clk, rst, ena;
wire [3:0] q;
wire cout;
cnt10 U1(clk ,rst, ena, q, cout);
always #50 clk = ~clk;
initial
begin
clk=0;rst=0;ena=1;
#1200 rst=1;
#120 rst=0;
#2000 ena=0;
#200 ena=1;
#20000 $finish;
end
endmodule
实例化语句"cnt10 U1(clk,rst,ena,q,cout);“把十进制计数模块例化到仿真环境中;
在always中用语句”#50 clk=~clk;"产生周期为100(标准时间单位)的时钟方波;
用initial块生成复位信号rst和使能控制信号ena的测试条件。
测试结果如图:
2.3Verilog仿真结果确认
(1)直接观察波形
通过直接观察各信号波形的输出,比较测试值和期望值的大小,来确定仿真结果的正确性。
(2)打印文本输出法
module adder1_tb;
wire so,co;
reg a,b,ci;
adderl U1(a,b,ci,so,co);
initial
begin
a=0;b=0;ci=0;
#20 a=0;b=0;ci=1;
#20 a=0;b=1 ;ci=0;
#20 a=0;b=1 ;ci=1;
#20 a=1 ;b=0;ci=0;
#20 a=1 ;b=0;ci=1;
#20 a=1 ;b=1 ;ci=0;
#20 a=1;b=1;ci=1;
#200 $finish;
end
$monitor($time, "%b %b %b -> %b %b”,a, b, ci, so, co);
endmodule
输出结果:
0 0 0 0 -> 0 0
20 0 0 1 -> 1 0
40 0 1 0 -> 1 0
60 0 1 1 -> 0 1
80 1 0 0-> 1 0
系统任务打印任务:
$display:直接输出到标准输出设备;
$monitor:监控参数变化;
$fdisplay:输出到文件等。
(3)自动检查仿真结果
自动检查仿真结果是通过在设计代码中的关键节点添加断言监控器,形成对电路逻辑综合的注释或是对设计特点的说明,以提高设计模块的观察性。
(4)使用VCD文件
Verilog提供一系列系统任务用于记录信号值变化保存到标准的VCD(Value Change Dump)格式数据库中。VCD文件是一种标准格式的波形记录文件,只记录发生变化的波形。
2.4Verilog仿真效率
因为要通过串行软件代码完成并行语义的转化,Verilog行为级仿真代码的执行时间比较长。
提高Verilog HDL代码的仿真代码执行时间:
(1)减小层次结构
仿真代码的层次越少,执行时间就越短。
(2) 减少门级代码的使用
由于门级建模属于结构级建模,建议仿真代码尽量使用行为级语句,建模层次越抽象,执行时间就越短。
(3) 仿真精度越高,效率越低
计时单位值与计时精度值的差距越大,则模拟时间越长。`timescale仿真时间标度。
(4) 进程越少,效率越高
代码中的语句块越少仿真越快,这是因为仿真器在不同进程之间进行切换也需要时间。
(5) 减少仿真器的输出显小
Verilog语言包含一些系统任务,可以在仿真器的控制台显示窗口输出一些提示信息,但会降低仿真器的执行效率。
相关文章:
verilog程序设计及SystemVerilog验证
1.Verilog测试程序设计基础 1.1Testbench及其结构 在仿真的时候Testbench用来产生测试激励给待验证设计( Design Under Verification, DUV),或者称为待测设计(Design UnderTest, DUT) 。 测试程序的一般结构: Testbench是一个测试平台,信号…...
Unity DeepSeek API 聊天接入教程(0基础教学)
Unity DeepSeek API 聊天接入教程(0基础教学) 1.DeepSeek 介绍 DeepSeek是杭州深度求索人工智能基础技术研究有限公司推出的一款大语言模型。2025年1月20日,DeepSeek-R1正式上线,和当前市面上的主流AI相比,它在仅有极少标注数据的情况下&am…...
力扣 乘积最大子数组
动态规划,注意负负得正,dp交换。 题目 注意这里的dp的乘积要求最大,而两个很大的负数相乘也是大的,因此在每遍历到一个数时要存一个最大值的dp与一个最小值的dp,然后遍历完后再去存ans的dp。由于存在负数,…...
ABP - 事件总线之分布式事件总线
ABP - 事件总线之分布式事件总线 1. 分布式事件总线的集成1.2 基于 RabbitMQ 的分布式事件总线 2. 分布式事件总线的使用2.1 发布2.2 订阅2.3 事务和异常处理 3. 自己扩展的分布式事件总线实现 事件总线可以实现代码逻辑的解耦,使代码模块之间功能职责更清晰。而分布…...
osgearth控件显示中文(八)
当前自己知道的方法大概有以下两种: (一)直接转成utf8 其实在前面的文章中已经有了。 osgEarth::Annotation::PlaceNode *pn = new osgEarth::Annotation::PlaceNode(GeoPoint(geoSRS, 110, 34), String2UTF8("中国"), style);std::wstring String2Wstring(con…...
基于opencv的 24色卡IQA评测算法源码-可完全替代Imatest
1.概要 利用24色卡可以很快的分析到曝光误差,白平衡误差,噪声,色差,饱和度,gamma值。IQA或tuning工程一般用Imatest来手动计算,不便于产测部署,现利用opencv实现了imatest的全部功能,…...
webpack打包优化策略
1. 减少打包体积 减少打包文件的大小是为了提高加载速度,降低网络带宽消耗,提升用户体验。常见的减少打包体积的优化策略包括: 代码分割(Code Splitting):将代码拆分成多个小文件,让浏览器按需…...
Kafka日志数据深度解析:从基础查看到高级操作全攻略
#作者:孙德新 文章目录 查看log日志文件(kafka-dump-log.sh)1、查看Log文件基本数据信息2、index文件健康性检查(--index-sanity-check)3、转储文件(--max-message-size)4、偏移量解码(--offsets-decoder)5、日志数据解析(--transaction-log-decoder)6、查询Log文件…...
DeepSeek-R1使用生存指南
文章目录 1.为什么普通人一定要使用DeepSeek2.DeepSeek的几种使用方式2.1网页端直接使用2.2手机端app使用2.3其他第三方平台 3.网页端按钮的说明4.正确的提问技巧4.1不要定义过程4.2明确受众4.3记忆时间有限4.4输出长度限制4.5如何清除上下文的记忆 5.几个避坑点5.1冗长提示词污…...
Code::Blocks 创建 C 项目 二
Code::Blocks 创建 C 项目 二 Code::Blocks 安装请看 Code::Blocks 安装 启动 Code Blocks 选择 Create a new project 弹出界面选择 Projects -> Console application -> Go 选择 C :表示创建的是 C 语言项目 点击 Next Project title:项目名 …...
pyqt写一个待办程序
ToDoApp 框架选择 一个简单的GUI程序,可以使用pyqt完成。pyqt是qt的python实现版本。 界面搭建 设计一个美观 简洁的界面 class ToDoApp(QWidget):def __init__(self):super().__init__()# 设置窗口属性self.setWindowTitle("Daily To Do List")self…...
总结前端常用数据结构 之 数组篇【JavaScript -包含常用数组方法】
【亲爱的读者,爱博主记得一键三连噢噢ooo~~ 啾咪】 创建数组: 以字面量的形式创建新数组:let arr1 [1, 2, 3];通过 Array 构造函数并传入一组元素(4,5,6)来创建一个新数组:let arr2 new Array(4, 5, 6);…...
利率掉期(Interest Rate Swap):运作原理、收益模式及市场角色解析(中英双语)
利率掉期(Interest Rate Swap):运作原理、收益模式及市场角色解析 引言 利率掉期(Interest Rate Swap, IRS) 是金融市场中最常见的衍生品之一,它允许两方交换固定利率和浮动利率,以优化融资成…...
Mac 开发工具推荐
Homebrew 软件安装管理必备神器,相当于 Linux 上的 yum,安装了homebrew之后,以下软件都可以通过brew cask install 和 brew install进行直接安装 IntelliJ IDEA Java开发ide 相关插件: 1)lombok 2)Aliba…...
NCHAR_CS和CHAR_CS,导致UNION ALL 时,提示SQL 错误 [12704] [72000]: ORA-12704: 字符集不匹配
检查涉及的数据表和列的字符集设置 -- 查询表的字符集 SELECT parameter, value FROM nls_database_parameters WHERE parameter LIKE NLS_CHARACTERSET;-- 查询列的字符集(对于特定表) SELECT column_name, character_set_name FROM all_tab_columns W…...
使用 Python paramiko 自动备份设备配置实验
一、实验拓扑: 要求:交换机 SW1 做为 SSH 服务端,桥接本地虚拟虚拟网卡;本地主机通过 python paramiko 库功能登录到 SW1 上进行配置备份;AR1 做为测试 SW1 的 SSH 客户端 二、实验环境搭建: 1、SW1 配置…...
goland2022.3.3 安装过程
到csdn下载安装包 开始安装 安装完后,安装中文包...
工业级推荐系统冷启动解决方案:基于元迁移学习与动态知识图谱的混合架构设计与实践
技术原理与数学模型 1. 元学习冷启动适配器(MAML改进) 数学原理: \min_\theta \sum_{\mathcal{T}_i\sim p(\mathcal{T})} \mathcal{L}_{\mathcal{T}_i}(U_i(\theta - \alpha\nabla_\theta\mathcal{L}_{\mathcal{T}_i}^{sup}(\theta))))其中…...
小小小病毒(3)(~_~|)
一分耕耘一分收获 声明: 仅供损害电脑,不得用于非法。损坏电脑,作者一律不负责。此作为作者原创,转载请经过同意。 欢迎来到小小小病毒(3) 感谢大家的支持 还是那句话:上代码! …...
在 WSL上的 Ubuntu 中通过 Docker 来运行 Redis,并在微服务项目中使用redis
通过在 WSL(Windows Subsystem for Linux)上的 Ubuntu 虚拟机中通过 Docker 来运行 Redis,然后再微服务项目中使用redis 以下是步骤: 1. 安装 Docker(如果还未安装) 首先,确保你已经在 WSL 的…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
