【IC验证】verilog及systemverilog特殊特性的分析

verilog及systemverilog特殊特性的分析

  • 1.概述
  • 2.赋值延迟
    • (0)总结
    • (1)情况一:initial中进行阻塞赋值和非阻塞赋值(不延迟)
      • a代码
      • b 电路图
      • c 结果
    • (2)时钟
      • a 代码
      • b 电路图
      • c 结果
    • (3)always过程块实现时序逻辑(延迟)
      • a 代码
      • b 电路图
      • c 结果
    • (4)always过程块实现组合逻辑(延迟)
      • a 代码
      • b 电路图
      • c 结果
    • (5)assign连续赋值语句实现组合逻辑(延迟)
      • a 代码
      • b 电路图
      • c 结果
    • (6)接口中的时钟(延迟)
      • a 代码
      • b 电路图
      • c 结果
    • (7)触发事件(延迟)
      • a代码
      • b 电路图
      • c 结果
  • 3.仿真软件的采样时刻
    • (1)在过程块中:时钟触发沿和数据改变沿同时刻
      • a代码
      • b结果
    • (2)在clocking block中:时钟触发沿和数据改变沿同时刻(完全一致)
      • a代码
      • b结果
  • 4.并行块代码的执行
    • 1.代码的执行时间(按照仿真结果总结出的,不具有理论依据)
  • 5.对模块中成员的调用
    • (1)问题
    • (2)例子(以模块为例)

1.概述

本文主要汇总分析verilog及systemverilog学习过程中出现的特殊问题;

2.赋值延迟

(0)总结

always过程块实现时序逻辑和组合逻辑和连续赋值语句赋值要消耗仿真时间;
接口内部的时钟,会比外部提供的时钟,存在延迟;
触发事件,@xxx,存在延迟;

(1)情况一:initial中进行阻塞赋值和非阻塞赋值(不延迟)

a代码

module test_tb;reg [3:0]   data1;reg [3:0]   data2;initial begindata1 = 0;data2 <= 0;#5;data1 = 1;data2 <= 1;end
endmodule

b 电路图

initial过程块不可综合;

c 结果

结论:initial过程块中直接赋值不消耗时间;
在这里插入图片描述

(2)时钟

a 代码

module test_tb;reg clk;initial beginclk = 1'b0;endalways#(10) clk = !clk;
endmodule

b 电路图

延时语句不可综合;

c 结果

结论:时钟赋值不消耗时间;
在这里插入图片描述

(3)always过程块实现时序逻辑(延迟)

a 代码

module test_tb;parameter T =20;reg clk;reg rst_n;initial beginclk = 1'b0;rst_n = 1'b0;#(T);rst_n = 1'b1;endalways#(T/2) clk = !clk;reg [3:0] cnt1;always@(posedge clk or negedge rst_n)beginif(!rst_n)cnt1 <= 'd0;elsecnt1 <= cnt1+1'b1;end
endmodule

b 电路图

在这里插入图片描述

c 结果

结论:综合出寄存器,赋值需要消耗时间;
在这里插入图片描述

(4)always过程块实现组合逻辑(延迟)

a 代码

module test_tb;parameter T =20;reg clk;reg rst_n;initial beginclk = 1'b0;rst_n = 1'b0;#(T);rst_n = 1'b1;endalways#(T/2) clk = !clk;reg [3:0] cnt1;always@(posedge clk or negedge rst_n)beginif(!rst_n)cnt1 <= 'd0;elsecnt1 <= cnt1+1'b1;endreg [3:0] cnt2;always@(*)begincnt2 = cnt1;end
endmodule

b 电路图

在这里插入图片描述

c 结果

结论:综合出数据线,赋值需要消耗时间
在这里插入图片描述

(5)assign连续赋值语句实现组合逻辑(延迟)

a 代码

module test_tb;parameter T =20;reg clk;reg rst_n;initial beginclk = 1'b0;rst_n = 1'b0;#(T);rst_n = 1'b1;endalways#(T/2) clk = !clk;reg [3:0] cnt1;always@(posedge clk or negedge rst_n)beginif(!rst_n)cnt1 <= 'd0;elsecnt1 <= cnt1+1'b1;endwire [3:0] cnt2;assign cnt2 = (cnt1 == 1)?1'b1:1'b0;endmodule

b 电路图

在这里插入图片描述

c 结果

结论:综合出组合逻辑电路,赋值需要消耗时间
在这里插入图片描述

(6)接口中的时钟(延迟)

a 代码

interface my_if(input bit clk);bit [7:0] sig1;bit [7:0] sig2;clocking cb@(posedge clk);input sig1;output sig2;endclocking 
endinterface 
module test_blocking1_test;reg clk;my_if mif(clk);initial beginclk = 0;endalways#3 clk = !clk;endmodule

b 电路图

不可综合语句;

c 结果

结论:
接口中的时钟跳变,会比顶层时钟跳变,延迟;

(7)触发事件(延迟)

a代码

module test_tb;parameter T = 20;reg clk;reg rst_n;reg cnt;initial beginclk = 0;rst_n = 0;cnt = 0;#(T);rst_n = 1;#(T);@(posedge clk);cnt = 1;endalways#(T/2) clk = !clk;endmodule

b 电路图

不可综合语句;

c 结果

在这里插入图片描述

3.仿真软件的采样时刻

(1)在过程块中:时钟触发沿和数据改变沿同时刻

a代码

说明:时钟clk1T/2倍数处改变,输入数据in1 也在T/2倍数处改变;

module test_tb;parameter T = 20;reg             clk1;reg     [3:0]   in1;reg             rst_n;initial beginclk1 = 1'b0;rst_n = 1'b0;in1  = 'd0;#(T);rst_n = 1'b1;endalways#(T/2) in1 = in1 + 1'b1;always#(T/2) clk1 = !clk1;reg [3:0] data_out1;always@(posedge clk1 or negedge rst_n)beginif(!rst_n)data_out1 <= 'd0;else data_out1 <= in1;endendmodule

b结果

questasim:
结论:仿真器采样为数据跳变沿右侧的值;
在这里插入图片描述
vcs(DVE):
结论:仿真器采样为数据跳变沿右侧的值;
在这里插入图片描述
vcs(verdi):
结论:仿真器采样为数据跳变沿右侧的值;
在这里插入图片描述

(2)在clocking block中:时钟触发沿和数据改变沿同时刻(完全一致)

a代码

在这里插入图片描述

b结果

questasim:
结论:仿真器采样为采样时刻左侧的值;
在这里插入图片描述
vcs(DVE):
结论:仿真器采样为采样时刻右侧的值;
在这里插入图片描述

vcs(verdi):
结论:仿真器采样为采样时刻右侧的值;
在这里插入图片描述

说明:时钟clk13倍数处改变,输入数据sig1 第二次变化在时钟跳变沿处改变;


为什么两种clk翻转时刻不同???

4.并行块代码的执行

1.代码的执行时间(按照仿真结果总结出的,不具有理论依据)

(1)在verilog实现的硬件电路中,同一时刻不同过程块中的并行语句,是并行执行;
(2)在verilog和systemverilog仿真时,同一时刻同一过程块中的串行语句,是串行执行;
见例子1中,“aaa”、“bbb”、“ccc”的打印语句,是同一过程块中的串行语句,是串行执行;
(3)在verilog和systemverilog仿真时,同一时刻不同过程块中的并行语句,是串行执行;
见例子1中“aaa”、“bbb”、“ccc”三个打印语句和"eee"打印语句,是不同过程块中的并行语句,所以会串行执行;
(因为“aaa”、“bbb”、“ccc”打印语句过程块在前,优先打印)
(4)在verilog和systemverilog仿真时,部分语句会消耗一个很小的时刻的;
如:“#”
见例子2中,两过程块均延时1个时间单位,然后分别打印aaaccc,所以结果aaa在前、ccc在后;
而在第一个过程块中通过执行两次**#1表示延迟两个时间单位,第二个过程块通过执行一次#2同样表示延迟两个时间单位。但是过程块1用了两次#会消耗两个很小的时刻,过程块2只用了1次#只会消耗1个很小的时刻,所以会先打印ddd再打印bbb**
(5)例子
例子1

module test_ft_tb;initial begin$display("aaa");$display("bbb");$display("ccc");#10;$display("ddd");endinitial begin$display("eee");#10;$display("fff");end
endmodule

结果:
在这里插入图片描述
例子2

module test_ft_tb;initial begin#1;$display("aaa");#1;#1;$display("bbb");endinitial begin#1;$display("ccc");#2;$display("ddd");end
endmodule

结果:
在这里插入图片描述

5.对模块中成员的调用

(1)问题

systemverilog中,在一个区域中,声明了一个类(或模块),那么在这个区域中就可以调用这个类(或模块)中的成员(变量和方法);

(2)例子(以模块为例)

代码:

module add_module;int data_arr [$];task automatic get_data(input int data_in);data_arr.push_back(data_in);endtask task automatic add_data(output int add_re);foreach(data_arr[i])beginadd_re = add_re + data_arr[i];endendtask
endmodule
module test_ft_tb1;add_module u1();initial beginint re;u1.get_data(1);u1.get_data(2);u1.get_data(3);$display("data_arr = %p",u1.data_arr);u1.add_data(re);$display("result is %0d",re);end
endmodule

结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hutool工具包的常用工具类的使用介绍

前言 Hutool 是一个轻量级的 Java 工具类库&#xff0c;提供了非常丰富的工具方法&#xff0c;可以大大减少开发时的重复性工作。它的目标是让 Java 开发更简单、更高效。Hutool 提供了多种常用功能&#xff0c;以下是一些常用工具类的使用介绍&#xff1a; 1. StrUtil - 字符…

考前96天 学习巩固 计算机、数学、英语

2024年12月24日到2025年3月29日共有 96​ 天 一、计算机基础 回顾&#xff1a; 三大思维&#xff1a; 数学 推理/理论 物理 证实/实验 计算机 构造/计算 本质——》抽象/自动化 计算复杂性&#xff1a;空间复杂性、时间复杂性 计算机系统的组成&#xff1a; 1️⃣硬件…

*【每日一题 基础题】 [蓝桥杯 2024 省 B] 好数

[蓝桥杯 2024 省 B] 好数 好数 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位……&#xff09;上的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位……&#xff09;上的数字是偶数&#xff0c;我们就称之为“好数”。 给定一…

如何用digital实现一个4位的减法器?

文件可以在下方链接下载&#xff1a; https://download.csdn.net/download/dashuchengtian/90178176 组件拼接如下图所示&#xff1a; 其中A和B是一个4位的输入&#xff0c;Cin表示有无借位&#xff0c;S表示和&#xff0c;Cout表示的是借位输出。 运行结果如下&#xff0c;以…

【人工智能】Python中的机器学习管道:如何用scikit-learn构建高效的ML管道

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在机器学习项目中,数据预处理、特征工程、模型训练与评估是不可或缺的环节。随着项目规模的扩大和复杂度的增加,手动管理这些步骤不仅繁琐…

C++之“流”-第5课.三军联动:流 +操作符+函数重载

如何针对特定函数类型重载流输出操作符&#xff1f;这样做有什么用处&#xff1f;C语言中&#xff0c;“流”、“操作符”、“函数重载” 这三大军团如何配合作战&#xff1f; 前言 C中&#xff0c;“流” 的日常运用&#xff0c;最基本的就是在你的代码里使用 << 和 &g…

Spring AOP 中记录日志

Spring AOP 中记录日志 使用 AOP 和 Spring 提供的 RequestContextHolder 在通知中记录 HTTP 请求相关日志。以下是进阶添加日志功能的完整例子和说明。 完整示例 1. 切面类实现 Aspect Component public class LogAspect {Around("annotation(log)") // 拦截所有…

python+PyPDF2实现PDF的文本内容读取、多文件合并、旋转、裁剪、缩放、加解密、添加水印

目录 读取内容 合并文件 旋转 缩放 裁剪 加密和解密 添加水印 安装&#xff1a;pip install PyPDF2 -i https://pypi.tuna.tsinghua.edu.cn/simple 读取内容 from PyPDF2 import PdfReader, PdfMerger, PdfWriterdef read_pdf(pdf_path):pdf_reader PdfReader(pdf_p…

POD 存储、PV、PVC

目录 容器如何持久化存储&#xff1f; PV和PVC 为什么不能直接在 Pod 或容器中存储数据&#xff1f; 什么是 PV和 PVC&#xff1f; 可以使用本地磁盘空间创建PV吗&#xff1f; 如何让客户端通过ftp上传到远端服务器的POD里面&#xff1f; 另一个POD想访问ftp的POD里面的…

并发编程(19)——引用计数型无锁栈

文章目录 十九、day191. 引用计数2. 代码实现2.1 单引用计数器无锁栈2.2 双引用计数器无锁栈 3. 本节的一些理解 十九、day19 上一节我们学习通过侯删链表以及风险指针与侯删链表的组合两种方式实现了并发无锁栈&#xff0c;但是这两种方式有以下缺点&#xff1a; 第一种方式…

【微信小程序】2|轮播图 | 我的咖啡店-综合实训

轮播图 引言 在微信小程序中&#xff0c;轮播图是一种常见的用户界面元素&#xff0c;用于展示广告、产品图片等。本文将通过“我的咖啡店”小程序的轮播图实现&#xff0c;详细介绍如何在微信小程序中创建和管理轮播图。 轮播图数据准备 首先&#xff0c;在home.js文件中&a…

tortoisegit推送失败

tortoisegit推送失败 git.exe push --progress -- "origin" testLidar:testLidar /usr/bin/bash: gitgithub.com: No such file or directory fatal: Could not read from remote repository. Please make sure you have the correct access rights and the reposit…

京准电钟解读,NTP网络授时服务器如何提升DCS系统效率

京准电钟解读&#xff0c;NTP网络授时服务器如何提升DCS系统效率 京准电钟解读&#xff0c;NTP网络授时服务器如何提升DCS系统效率 NTP 网络授时服务器为防火墙内的网络设备、终端、服务器提供准确、可靠和安全的高精度卫星时间参考&#xff0c;可为它支持数万台支持标准的网…

WebGIS实战开源项目:智慧机场三维可视化(学习笔记)

From&#xff1a;新中地 1.简介 智慧机场解决方案&#xff0c;基于数字化大平台&#xff0c;融合AI、大数据、IoT、视频云、云计算等技术&#xff0c;围绕机场“运控、安防、服务”三大业务领域&#xff0c;构建“出行一张脸”及“运行一张图”两大场景化解决方案。 https://…

Codesoft许可证迁移到新计算机的操作步骤

随着科技的不断发展&#xff0c;我们时常需要升级或更换计算机设备以适应更高的工作要求。然而&#xff0c;在迁移至新计算机时&#xff0c;如何确保Codesoft软件的许可证能够顺利转移并继续在新设备上使用&#xff0c;成为许多用户关心的问题。本文将为您详细介绍Codesoft许可…

C++----类与对象(下篇)

再谈构造函数 回顾函数体内赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date{ public: Date(int year, int month, int day) { _year year; _month month; _day day; } private: int _year; int _mo…

重装系统后的那点事儿

每次重装系统完&#xff0c;总是有这有那的问题&#xff0c;比如这几个常见问题&#xff0c;各种C盘的数据最好在重装系统前备份哦&#xff0c;不然有点小麻烦&#xff0c;要下载好多东西&#xff01;&#xff01; 文章目录 需要新应用打开此 ms-paint新链接搜索框不见了 需要…

ROS2中通过launch读取.yaml配置文件启动节点

环境&#xff1a;Ubuntu22.04&#xff0c;ROS2-humble 通过修改.yaml配置文件中的参数&#xff0c;可以不用重新编译源代码进行软件调试。 1.yaml文件格式 bag_to_image_node&#xff1a;运行的ROS2节点名称 参数格式参考如下&#xff1a; bag_to_image_node:ros__parameters…

Vue + ECharts 实现山东地图展示与交互

这篇文章中&#xff0c;我将逐步介绍如何使用 Vue 和 ECharts 实现一个互动式的地图展示组件&#xff0c;其中支持返回上一层地图、点击查看不同城市的详细信息&#xff0c;以及根据数据动态展示不同的统计信息。 效果图&#xff1a;玩转山东地图&#xff1a;用Echarts打造交互…

【es6复习笔记】迭代器(10)

什么是迭代器&#xff1f; 迭代器&#xff08;Iterator&#xff09;是一种对象&#xff0c;它能够遍历并访问一个集合中的元素。在 JavaScript 中&#xff0c;迭代器提供了一种统一的方式来处理各种集合&#xff0c;如数组、字符串、Map、Set 等。通过迭代器&#xff0c;我们可…