Verilog初级教程(1)认识 Verilog HDL
文章目录
- 背景
- 正文介绍
- Verilog有什么用途?
- 如何验证Verilog设计的功能?
- Verilog设计模板
- 参考资料汇总
背景
集成电路的设计经历了从原理图绘制(工程师在纸上绘制晶体管及其连接,以便对其设计,使其可以在硅上制造)到硬件描述语言的转变,这是因为大型的设计,如果使用原理图的方式进行设计会耗费大量的人力、时间和资源等,这催生着硬件描述语言的诞生!
硬件描述语言最开始出现的VHDL,它是1983年,应美国国防部要求开发的,目的是记录供应商公司将其包括在设备中的ASIC的行为。
硬件描述语言允许工程师描述所需硬件的功能,并使得EDA工具将该行为转换为组合逻辑以及时序逻辑之类的实际硬件单元,VHDL很快得到了发展!
Verilog的开发旨在简化开发流程,并使得硬件描述语言(HDL)更加的健壮和灵活。如果,Verilog已经成为全球使用地区最多的硬件描述语言。
如下图,来自于参考资料2,显示了使用Verilog以及VHDL的地域区别,
正文介绍
Verilog有什么用途?
Verilog创建了一种抽象级别,以帮助隐藏电路实现及其细节,让我们能关注于电路的行为。
举个例子:
module ctr (input up_down,input clk,input rstn,output reg [2:0] out);always @ (posedge clk)if (!rstn)out <= 0;else beginif (up_down)out <= out + 1;elseout <= out - 1;endendmodule
这段设计描述的电路是一种计数器,输入信号up_down有效时候,计数递增,否则递减!
这很清晰地让我们知道Verilog长什么样子,我们不需要描述电路的实现细节,而只需要描述电路的行为或者功能即可,这大大提高了开发效率!
如何验证Verilog设计的功能?
打个不恰当的比喻,也许能帮助理解,如果将Verilog描述的电路比作一个灯泡,那么验证的方式就是给灯泡通电,测试灯泡亮或不亮,以此达到验证的目的。
通过不同的方法对设计进行检查,统称为验证。验证的最普遍和广泛实践的方法是电路仿真。有一些软件工具可以了解Verilog中描述的硬件应如何工作并为设计模型提供各种输入刺激。然后对照预期值检查设计的输出,以查看设计在功能上是否正确。
所有仿真均由EDA(电子设计自动化)软件工具执行,并且Verilog设计RTL放置在称为testbench的平台内。在测试平台内,各种测试为设计提供了不同的刺激。下图显示了这样的测试平台。
Verilog设计模板
module [design_name] ( [port_list] );[list_of_input_ports][list_of_output_ports][declaration_of_other_signals][other_module_instantiations_if_required][behavioral_code_for_this_module]
endmodule
- 模块定义和端口列表声明
- 输入和输出端口列表
- 使用允许的Verilog数据类型声明其他信号
- 设计可能依赖于其他Verilog模块,因此它们的实例是通过模块实例化创建的
- 描述该模块行为的此模块的实际Verilog设计
例如下面的verilog设计显示了一个D触发器的行为:
// "dff" is the name of this module module dff (input d, // Inputs to the design should start with "input"input rstn,input clk,output reg q); // Outputs of the design should start with "output"always @ (posedge clk) begin // This block is executed at the positive edge of clk 0->1if (!rstn) // At the posedge, if rstn is 0 then q should get 0q <= 0;else q <= d; // At the posedge, if rstn is 1 then q should get dend
endmodule // End of module
对这段设计进行测试的仿真文件:
module tb;// 1. Declare input/output variables to drive to the designreg tb_clk;reg tb_d;reg tb_rstn;wire tb_q;// 2. Create an instance of the design// This is called design instantiationdff dff0 ( .clk (tb_clk), // Connect clock input with TB signal.d (tb_d), // Connect data input with TB signal.rstn (tb_rstn), // Connect reset input with TB signal.q (tb_q)); // Connect output q with TB signal// 3. The following is an example of a stimulus// Here we drive the signals tb_* with certain values// Since these tb_* signals are connected to the design inputs,// the design will be driven with the values in tb_*initial begintb_rsnt <= 1'b0;tb_clk <= 1'b0;tb_d <= 1'b0;end
endmodule
参考资料汇总
参考资料1
参考资料2
Verilog初级教程(1)认识 Verilog HDL相关推荐
- Verilog初级教程(2)Verilog HDL的初级语法
文章目录 前言 正文 注释 空格 操作符 数字格式 字符串 标识符 关键字 verilog修订 写在最后 前言 学习Verilog和学习任何一门编程语言一样,都需要从语法开始,不会语法去学习设计是几乎 ...
- Verilog初级教程(23)Verilog仿真中的显示任务
文章目录 前言 正文 Display/Write Tasks Verilog Strobes Verilog Continuous Monitors Verilog Format Specifiers ...
- Verilog初级教程(21)Verilog中的延迟控制语句
文章目录 前言 正文 延迟控制语句 事件控制语句 Named Events Event or operator 往期回顾 参考资料及推荐关注 前言 Verilog中的延迟控制有两种类型–延迟和事件表达 ...
- Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
文章目录 前言 正文 语法 示例 Testbench文件 往期回顾 参考资料及推荐关注 前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使 ...
- Verilog初级教程(15)Verilog中的阻塞与非阻塞语句
文章目录 前言 正文 阻塞赋值 非阻塞赋值 往期回顾 参考资料以及推荐关注 前言 本文通过仿真的方式,形象的说明阻塞赋值以及非阻塞赋值的区别,希望和其他教程相辅相成,共同辅助理解. 正文 阻塞赋值 阻 ...
- Verilog初级教程(14)Verilog中的赋值语句
文章目录 前言 正文 合理的左值 过程性赋值(Procedural assignment) 连续赋值 过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:a ...
- Verilog初级教程(12)Verilog中的generate块
文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...
- Verilog初级教程(11)Verilog中的initial块
文章目录 前言 正文 语法格式 initial块是用来干什么的? initial块何时开始又何时结束? 一个模块中允许有多少个initial块? 参考资料 写在最后 前言 仿真中通常会依次执行一组Ve ...
- Verilog初级教程(9)Verilog的运算符
博文目录 写在前面 正文 Verilog算术运算符 Verilog关系运算符 Verilog等价运算符 Verilog逻辑运算符 Verilog位元运算符 Verilog移位运算符 参考资料 交个朋友 ...
- Verilog初级教程(7)Verilog模块例化以及悬空端口的处理
博文目录 写在前面 正文 按顺序排列的端口连接 按名称排列的端口连接 未连接/悬空端口处理 关于模块端口的说明 参考资料 交个朋友 写在前面 此系列相关博文: Verilog初级教程(6)Verilo ...
最新文章
- 开发日记-20190825 关键词 管道和FIFO
- 安居客检测到网页抓取_安居客天津租房情况分析
- 从Google Maglev说起,如何造一个牛逼的负载均衡?
- [vue] vue生命周期的作用是什么?
- python-数据类型-字符串入门-定符串的定义-type函数-iput函数
- 查看回调函数执行在那个线程中的方法
- python图像边缘检测报告_python – 检测图像的最外边缘并基于它进行绘图
- 库克:5G iPhone目前还不是我们考虑的问题
- c语言智能车跑道检测程序,智能小车的循迹方法与流程
- 服务器基础设置:服务器设置PXE启动,
- 大道至简之四:透过现象看本质
- 网易笔试001(HR之声)
- ST17H66 低功耗蓝牙SOC开发(3)—— OSAL系统简介
- [M1]Daily Scum 9.27
- 蚂蚁区块链第10课 可信计算及TEE硬件隐私合约链智能合约开发实践
- VMware虚拟机怎么用U盘装win7系统
- Apache Tomcat优化
- linux 32位和64位的区别 内存,32位、64位的区别
- Linux设置非root用户启动程序
- signature=fd1093c9205f8af457ccc5f1d3251c78,An FDTD method for ELFE propagation in seawater.
热门文章
- 有状态会话Bean(SLSB)和无状态会话Bean(SFSB)的区别
- java io 文件复制_实例讲述Java IO文件复制
- 学业水平测试计算机都考什么,高中学业水平考试与高中会考有什么区别
- html动态生成榜单信息,排行榜.html
- k2677场效应管参数引脚_场效应管参数大全2.doc
- JS通过正则限制 input 输入框只能输入整数、小数(金额或者现金) 两位小数
- window.opener.document.getElementById(“a”)用标准的Jquery 语言怎么写
- notepad如何新建php,notepad新手怎么使用教程
- 智能车竞赛技术报告 | 智能车视觉 - 温州大学- 春华秋实
- 2021年春季学期-信号与系统-第十四次作业参考答案-第七小题参考答案