Verilog语法概述二:何为仿真?仿真可以在几个层面上进行?

news2024/12/23 8:47:46

Verilog 是一种用于数字逻辑电路设计的硬件描述语言,可以用来进行数字电路的仿真验证、时序分析、逻辑综合。

既是一种行为级(可用于电路的功能描述)描述语言又是一种结构性(可用于元器件及其之间的连接)描述语言。

Verilog 模块的基本概念

模块是Verilog的基本单位,除了编译指令,其他的所有的设计代码都必须放在一个或多个模块中。

一个模块内部可以使用其他模块,称为实例。上层模块可以引用底层任意层次模块的变量
模块内部可以包含若干个“块”。

Verilog模块总结:
Verilog 中的标示符可以是任意一组字母、数字、$符号和下划线符号的组合,但标示符的第一个字符必须是字母或者下划线。标示符区分大小写。

verilog 程序是有模块组成的,每个模块嵌套在module和endmodule声明语句中。模块是可以进行层次嵌套的

每个Verilog源文件中只准有一个顶层模块,其他为子模块。

每个模块要进行端口定义,并说明输入输出端口,然后对模块的功能进行行为逻辑描述
程序书写格式自由,一行可以写几个语句,一个语句可以分几行写,除了endmodule语句,begin…end语句,fork…join语句外,每个语句和数据定义的最后必须有分号。可用//和//…对程序的任何部分做注释,加上必要的注释,以增强程序的可度性和可维护性。

Verilog用于模块的测试

检查程序的功能是否正确要求:
需要有测试激励信号输入到被测模块
需要记录被测模块的输出信号
需要把用功能和行为描述的Verilog模块转换为门级电路互连的电路结构(综合);
需要对已经转换为门级电路结构的逻辑进行测试(门级电路仿真)
需要对布局布线后的电路结构进行测试(布局布线后仿真)

何为仿真?为何要仿真?

仿真是对电路模块进行动态的全面测试,通过观测被测试模块的输出信号是否符合要求可以调试和验证逻辑系统的设计和结构是否准确,并发现问题及时修改。
仿真可以在几个层面上进行?每个层面的仿真有什么意义?
仿真有:前(RTL)仿真,逻辑网表仿真,门级仿真和布线后仿真;
前仿真:前(RTL)仿真,逻辑网表仿真,门级仿真;可以调试和验证逻辑系统的设计和结构准确与否,并发现问题及时修改。
布线后仿真:分析设计模块运行是否正常;

模块的结构
Verilog 的基本设计单元是"模块(block)"
verilog 模块的结构由在module和endmodule关键字之间的4个主要部分组成:
在这里插入图片描述

逻辑功能的定义:

在Verilog中有3种方法可以描述电路的逻辑功能:

用assign语句(连续赋值语句,常用于描述组合逻辑)
assign x = (b &~c);

用元件例化(instance 门元件例化)
and(门元件关键字) u_and3(例化原件名)(f,a,b,c);
注1:元件例化即是调用Verilog提供的元件;
注2:元件例化包括门元件例化和模块元件例化;
注3:每个实例元件的名字必须唯一,以避免与其他调用元件的实例相混淆;
注4:例化元件名也可以省略。

用”always“块语句
在这里插入图片描述

注1:”always“块语句常用于描述时序逻辑,也可描述组合逻辑;
注2:”always“块可用多种手段来表达逻辑关系,如用if…else语句或case语句;
注3:”always“块语句与assign语句是并发执行的,assign语句一定要放在”always“块语句之外。

模块结构模板:
在这里插入图片描述
标示符:
任何用Verilog语言描述的东西都可以通过其名字来识别,这个名字被称为标示符;
如源文件名,模块名,端口名,变量名,常量名,实例名等
标示符可由字母,数字, 和下划线组成,但第一个字符必须是字母或下划线,不能是 和下划线组成,但第一个字符必须是字母或下划线,不能是 和下划线组成,但第一个字符必须是字母或下划线,不能是和数字
在Verilog中标示符是区分大小写的,且不能与关键字同名。

关键字:
在这里插入图片描述

语汇代码编写标准:

(1)每个Verilog HDL源文件中只准编写一个顶层模块,也不能把一个顶层模块分成几部分写在几个源文件中。 (2)源文件名字应与文件内容有关,最好与顶层模块同名!源文件名字的第一个字符必须是字母或下划线,不能是数字或$符号! (3)每行只写一个声明语句或说明。 (4)源代码用层层缩进的格式来写。
(5)定义变量名的大小写应自始至终保持一致 (如变量名第一个字母均大写)。
(6)变量名应该有意义,而且含有一定的有关信息。局部变量名(如循环变量)应简单扼要。
(7)通过注释对源代码做必要的说明,尤其对接口(如模块参数端口、任务、函数变量) 做必要的注释很重要。
(8)常量尽可能多地使用参数定义和宏定义,而不要在语句中直接使用字母、数字和字符串。
·参数定义(用一个标识符来代表一个常量)的格式:parameter 参数名1=表达式,参数名2=表达式,…宏定义 (用一个简单的宏名来代替一个复杂的表达式)的格式:define 标志符(即宏名) 字符串(即宏内容)

综合代码编写标准:

(1)把设计分割成较小的功能块,每块用行为风格设计。除设计中对速度响应要求比较临界的部分外,都应避免门级描述。 (2) 建立一个好的时钟策略(如单时钟、多相位时钟,经过门产生的时钟、多时钟域等)。保证源代码中时钟和复位信号是干净的(即不是由组合逻辑或没有考虑到的门产生的)。C (3)建立一个好的测试策略,使所有触发器都是可复位的,使测试能通过外部管脚进行,又没有冗余的功能。(4)所有源代码都必须遵守并符合在always块语句的4种可综合标准模板之一。 (5)描述组合和锁存逻辑的always块,必须在always块开头的控制事件列表中列出所有的输入信号。
(6) 描述组合逻辑的always块,一定不能有不完全赋值,即所有输出变量必须被各输入值的组合值赋值,不能有例外。
(7)描述组合和锁存逻辑的always块一定不能包含反馈,即在always块中已被定义为输出的寄存器变量绝对不能再在该always块中读进来作为输入信号。
(8)时钟沿触发的always块必须是单时钟的,且任何异步控制输入(通常是复位或置位信号) 必须在控制事件列表中列出。例: always @(posedge clk or negedge set or negedge reset)
(9)避免生成不想要的锁存器。在无时钟的always块中,若有的输出变量被赋了某个信号变量值,而该信号变量并未在该always块的电平敏感控制事件中列出,则会在综合中生成不想要的锁存器。
(10)避免生成不想要的触发器。
在时钟沿触发的always块中,如果用非阻塞赋值语句对reg型变量赋值;或者当reg型变量经过多次循环其值仍保持不变,则会在综合中生成触发器。

用reg型变量生成触发器举例:module rw2( clk, d, outl);
input clk, d;output outl;reg outl ;
always @(posedge clk) //沿触发out1 <= d :
endmodule
若不想生成触发器,而是希望用reg型变量生成组合逻辑,则应使用电平触发:
module rw2( clk, d, outl);
input clk, d;
output outl;
reg out1 ;
always @(d) //电平触发out1 <= d ;endmodule

(11)所有内部状态寄存器必须是可复位的,这是为了使RTL级和门级描述能够被复位成同一个已知的状态,以便进行门级逻辑验证。
(12)对存在无效状态的有限状态机和其他时序电路(如4位十进制计数器有6个无效状态),必须明确描述所有的2的N次幂种状态下的行为(包括无效状态),才能综合出安全可靠的状态机。
(13)一般地,在赋值语句中不能使用延迟,否则是不可综合的。
(14)仔细检查代码中使用动态指针(如用指针或地址变量检索的位选择或存储单元)、循环声明或算术运算部分,因为这类代码在综合后会生成大量的门,且难以优化。

在这里插入图片描述

想要了解更多,就关注IC修真院吧,后续为大家持续更新,如果想要获取全文档,也可直接领哦~

这里放个口:Verilog概述全文

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

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

相关文章

day34_js

今日内容 零、 复习昨日 一、JS 零、 复习昨日 一、引言 1.1 JavaScript简介 JavaScript一种解释性脚本语言&#xff0c;是一种动态类型、弱类型、基于原型继承的语言&#xff0c;内置支持类型。它的解释器被称为JavaScript引擎&#xff0c;作为浏览器的一部分&#xff0c;广泛…

数据分类分级 数据识别-excel分类分级模版文件导入、解析

前面讲了数据分类分级 数据识别-实现部分敏感数据识别,本次针对模版导入展开,excel导入采用的是easyexcel 目录 easyexcel介绍easyexcel实战添加依赖读取数据监听器的实现数据读取方法读取结果上面图片是AI创作生成!如需咒语可私戳哦! easyexcel介绍 之前的excel导入解析…

全网最可”铐“最可“刑”的fiddler抓包教程

Fiddler 下载&#xff1a; https://telerik-fiddler.s3.amazonaws.com/fiddler/FiddlerSetup.exe 浏览器f12 选择“网络”&#xff0c;点选“保留日志” Fiddler 浏览器执行“去缓存刷新”&#xff1a;shiftf5 会话 即是 包 har文件在测试当中有什么作用?&#xff1a;h…

存储卡格式化后如何找回数据?一招轻松恢复数据

存储卡内存不足、存储卡中毒、存储卡损坏这几种情况都会导致我们把存储卡格式化操作&#xff0c;存储卡格式化后所有数据都会清空&#xff0c;这是众所皆知的&#xff0c;存储卡不小心格式化了怎么办&#xff1f; 其实是有方法恢复格式化的数据&#xff0c;我们可以通过专业的数…

香橙派4和树莓派4B构建K8S集群实践之五:端口公开访问配置

1. 应用场景说明 - 我们需用k8s集群提供开放特别的端口访问服务&#xff0c;如一些微服务端口 - 在团队开发环境中&#xff0c;通常要访问公共数据库&#xff0c;集群需提供统一的接口给大伙 接下来以实践四中设置的mariadb-galera为基础&#xff0c;公开端口3306&#xff0…

银豆信息张雪灿:钻石级合作伙伴的增长秘诀

编者按&#xff1a; 杭州银豆信息技术有限公司&#xff08;简称“银豆”&#xff09;&#xff0c;是一家专注于云计算服务的高科技企业&#xff0c;目前已为2000家企业级客户提供了专业的行业解决方案, 与人民网、光大银行、长安汽车金融、vivo金融、浙江省农科院、淄博市大数…

django部署在Centos7+python3+apache上教程

django在本地环境非常好配置使用自带的web服务就可以了但是部署到服务器上再使用自带的web就不方便了 一般是配合nginx或apache来使用。 这篇文章主要是教如何搭配apache的 1.升级sqlite3&#xff08;高版本django高版本不支持低版本sqlite3&#xff09; #一定要在安装python…

[ACTF新生赛2020]easyre 题解

1.查壳 32位文件&#xff0c;加了UPX壳 2.手动脱壳 使用Ollydbg UPX是一个压缩壳&#xff0c;运行了UPX将我们要运行的已经压缩的程序解压&#xff0c;才是真正的程序入口点OEP 我们需要将跟着汇编代码&#xff0c;找到程序真正的入口点 使用ESP定律可以快速定位 按下F7&…

Git设置代理

有时会国内会因为github克隆速度非常慢&#xff0c;中途各种错误断开造成克隆项目失败&#xff0c;可以尝试设置代理解决。 1、http、https协议 //设置全局代理 //http git config --global https.proxy http://127.0.0.1:1080 //https git config --global https.proxy http…

图神经网络:(节点分类)在KarateClub数据集上动手实现图神经网络

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8888。 文章目录 文献阅读&#xff1a;代码实操&#xff1a; 文献阅读&#xff1a; 参考文…

一个由“API未授权漏洞”引发的百万级敏感数据泄露

2023年4月的某一天&#xff0c;腾讯安全专家Leo正在为某家医院的重保防护做第一轮的安全风险排查。 医院的专用APP是外部网络访问最高的&#xff0c;也就是最大的风险敞口&#xff0c;需要重点排查。 Leo下载APP进行测试后&#xff0c;发现该医院存在一个严重的问题&#xff…

图像复原与重建MATLAB实验

文章目录 一、实验目的二、实验内容1. 噪声图像及其直方图。2. 空间噪声滤波器。3. 逆滤波。 一、实验目的 了解一些常用随机噪声的生成方法。掌握根据指定退化函数对图像进行退化的方法。掌握当模糊图像只存在噪声时的几种滤波复原方法。掌握当模糊图像同时存在线性退化和噪声…

学会搭建小程序生鲜商城,开启生鲜电商新模式

电商平台的出现&#xff0c;为人们带来了极大的便利。然而&#xff0c;传统的电商平台已经不能满足消费者对于购物体验的要求。如今&#xff0c;小程序生鲜商城因其轻量化、高效率等特点&#xff0c;成为了众多卖家的首选。本文将介绍如何学会搭建小程序生鲜商城&#xff0c;并…

二分特训上------刷题部分----Week4(附带LeetCode特训)

二分特训上------理论部分----Week4(附带LeetCode特训)_小杰312的博客-CSDN博客 如果需要理论&#xff0c;请移步上一篇. /***** 注意&#xff1a;我们把 0000001111111模型中&#xff1a;0称呼为左边区间&#xff0c;1称呼为右边区间 (答案第一个1在右区间) 1111…

浅谈Redis

一、Redis的简介 1.开源免费的缓存中间件,性能高,读可达110000次/s,写可达81000次/s。 2.redis的单线程讨论&#xff1a; V4.0之前&#xff1a;是单线程的&#xff0c;所有任务处理都在一个线程内完成. V4.0&#xff1a;引入多线程&#xff0c;异步线程用于处理一些耗…

机器学习基础学习之线性回归

文章目录 首先从**目标函数**开始梯度下降法结合两个公式&#xff0c;让目标函数梯度下降多项式回归&#xff0c;多重回归解决办法&#xff1a;随机梯度下降 首先从目标函数开始 假设下图反映了 投入多少广告费&#xff0c;产生了多少销售量的关系 图中每个点都是一个数据&a…

Spring Security

1、这是securityConfigpackage com.ruoyi.framework.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.http.HttpMethod; import org.springframework.security.authe…

【JAVA】Java中方法的使用,理解方法重载和递归

目录 1.方法的概念及使用 1.1什么是方法 1.2方法的定义 1.3方法调用的执行过程 1.4实参和形参 2.方法重载 2.1为什么需要使用方法重载 2.2什么是方法重载 3.递归 3.1什么是递归 3.2递归执行的过程 3.3递归的使用 1.方法的概念及使用 1.1什么是方法 方法就是一个代…

消息队列:RabbitMQ

文章目录 消息队列&#xff08;RabbitMQ&#xff09;概念优势技术亮点可靠性灵活的路由集群联合高可用的队列多协议广泛的客户端可视化管理工具追踪插件系统 原理&#xff1a;AMQP 0-9-1 模型简介 消息队列&#xff08;RabbitMQ&#xff09; 概念 一种异步通信中间件 优势 消…