Verilog学习总结
1.多个always语句不能对同一变量赋值。
2.assign语句只能进行阻塞赋值,用来描述组合逻辑。
3.verilog描述方式:结构描述(门级描述和模块调用)、数据流描述(assign,wire型)、行为描述(initial、always,reg型)。
4.数据流描述根据信号(变量)之间的逻辑关系,采用连续赋值语句描述逻辑电路的方式,称为数据流描述。狭义理解:将传统意义上的“逻辑表达式”,运用VerilogHDL中的运算符,改变成连续赋值语句(assign语句)中的表达式。
assign 连线型变量名= 赋值表达式;
wire型变量没有数据保持能力,只有被连续驱动后,才能取得确定值。(而寄存器型变量只要在某时刻得到过一次过程赋值,就能一直保持该值,直到下一次过程赋值。)若一个连线型变量没有得到任何连续驱动,它的取值将是不定态“x”。assign连续赋值语句就是实现对连线型变量进行连续驱动的一种方法。
进一步讲,assign持续赋值语句对wire型变量赋值后,始终监视赋值表达式中的每一个操作数,只要赋值表达式中任一操作数发生变化,立即对wire型变量进行更新操作,以保持对wire型变量的连续驱动。体现了组合逻辑电路的特征——任何输入的变化,立即影响输出。所以,可根据组合电路的逻辑表达式,用assign持续赋值语句进行描述。数据类型缺省为wire型。
而reg型的驱动可以通过过程赋值语句实现,变量被赋值后在接受下一次的过程赋值之前,将保持原值不变。
5.永远不要忘记写default,以避免因为没有考虑完整case的所有分支而引入了不必要的锁存器。若正常功能的所有情况都包含在了case的显示条件判断分支中,则在default语句中,可以给输出变量赋x值。在仿真时,错误的x值可以传播,可以更容易发现因为case分支没有写全造成的错误。而在综合时,综合工具会自动选区最合适的固定值在default情况下赋值给输出信号,以生成最优化的电路。
6.在设计一个模块电路时,应尽量采用参数化的设计,即多用parameter定义一些可配置的电路参数。这样,该模块可以被更灵活的使用。在模块实例化时可重定义模块参数或使用defparam。如:fulladder #(2,3) u_fulladder。
7.多模块设计。建模思想。
8.分别用Quartus和ModelSim进行功能仿真和时序仿真。
9.当begin-end块中定义了局部变量时,必须有一个模块名。
10.FPGA上电寄存器初始值问题。
You can apply the Quartus II integrated synthesis Power-Up Level logic option to a
specific register or to a design entity, module or subdesign. If you do so, every register
in that block receives the value. Registers power up to 0 by default; therefore you can
use this assignment to force all registers to power up to 1 using NOT gate push-back.
如果要规定寄存器上电的电平
需要在Analysis & Synthesis Settings 中去掉Power-Up Don't Care 选项,
如果选择这个选项会让编译器按照逻辑优化对寄存器初值任意取值,或者根本就不关心是什么值。
而它是默认选中的。
当去掉这个选项之后,就可以在你的HDL源文件中,为寄存器变量赋初值了。
如Verilog中:
reg q = 1'b1;
11.时序的精确控制,定时计数器。
12.Verilog具有强大的位操作能力。
13.else,in RTL
inout use in top module(PAD)
dont use inout(tri) in sub module
也就是说,在内部模块最好不要出现inout,如果确实需要,那么用两个port实现,到顶层的时候再用三态实现。理由是:在非顶层模块用双向口的话,该双向口必然有它的上层跟它相连。既然是双向口,则上层至少有一个输入口和一个输出口联到该双向口上,则发生两个内部输出单元连接到一起的情况出现,这样在综合时往往会出错。
14.组合逻辑复杂时,优先always语句,语句中被赋值的必须是reg类型,可以实现较复杂的语句。
15.设计电路时要区分组合电路和时序电路。
16.要用到值的上一次值时,需要寄存器保存该值。
17.对于组合逻辑多输出,在case语句之前先赋给默认值,这样做避免了锁存器的产生,减少了在每一个case分支语句中对于其他输出的赋值,且强调了分支语句中某个输出的改变。
18.进入FPGA的信号先进行同步,保证同步设计时序,提高系统工作频率。
19.Verilog层次事件队列,优先级高到低:1.活跃事件:连续赋值(assign)、阻塞赋值、非阻塞赋值右式计算、$display、原语元件事件;2.非活跃事件:显示0延时的阻塞赋值、带PLI例程的回调过程;3.非阻塞赋值左值更新;4.监控事件:$monitor、$strobe;5.未来事件:未来非活跃事件、未来非阻塞赋值更新事件。
20.状态机跳转判断条件不应有较大的计数器(大于4位),应该移到状态机外部产生使能信号进行判断。
21.顶层尽量只做模块例化,不出现胶连逻辑,包括与非或门和选择器。
22.推荐模块间数据传递要寄存器化。
23.利用时钟使能电路解决设计中可能的多时钟,进而避免了不必要的亚稳态发生,在降低设计复杂度的同时也提高了设计的可靠性。详见http://www.cnblogs.com/qiweiwang/archive/2010/12/18/1910186.html#2690007和http://blog.163.com/xupengee@126/blog/static/141308243201052384539804/。
24.延迟n个时钟利用拼接运算符{}完成辅以assign,详见http://www.cnblogs.com/oomusou/archive/2009/06/15/verilog_dly_n_clk.html。
25.不要同时使用同一时钟的上升沿和下降沿,可以考虑利用PLL将原时钟倍频或者相移180度。
26.使能信号扇出过大,可以逻辑赋值或者打拍。
27.时序应该是先设计好,再实现。调试的时候可以通过SignalTap抓信号比对时序,进行修改(状态机输出信号)。
28.多周期约束能解决的问题:(1) 组合逻辑延时大,不可能在下一个时钟沿达到;(2) 不需要在下一时钟沿稳定; (3) 不同时钟域,但是有确定相位关系。
29.ALTERA的RAM宏模块默认输出时寄存一拍的,可以根据实际需要不寄存输出。
30.利用Modelsim、Matlab和SignalTap进行互相验证,尤其是Modelsim和Matlab的联调(基于读文本txt的方式),详见http://www.cnblogs.com/aikimi7/archive/2013/06/06/3122573.html。
31.ModelSim仿真出现“Unresolved reference to'...'”.,后续端口大小不匹配,原因是模块例化时端口前面没有加一点!!!
32.重要:更改状态机状态参数和其他parameter型参数时,为了使修改后的参数生效,务必重新生成bsf,用以顶层模块连接!!
33.Verilog-2001将`bz和`bx赋值扩展到变量的全部宽度,即wire [63:0] my_data = `bz,64位都为高阻值; 支持对数或者幂运算符“**”;带符号的算法运算;
Verilog介绍:http://zh.wikipedia.org/wiki/Verilog_HDL,Verilog-2001新特性:http://blog.sina.com.cn/s/blog_6e44841b0100mm91.html。
34.FIFO的作用:跨时钟域、数据缓冲、总线宽度转换等。
Verilog学习总结的更多相关文章
- Emacs 编辑verilog 学习日记
终于开始写博客啦.以前一直打算写.由于工作忙一次次延期了.写博客的好处不必多说. 以前有一些学习心得总是用一个word,或者note记录一些.时间久了都不知道弄哪儿去了.. 从今天开始记录学习中 ...
- Verilog学习笔记简单功能实现(二)...............全加器
先以一位全加器为例:Xi.Yi代表两个加数,Cin是地位进位信号,Cout是向高位的进位信号.列表有: Xi Yi Cin Sum Cout 0 0 0 0 0 0 0 1 1 0 ...
- Verilog学习笔记基本语法篇(十二)········ 编译预处理
h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...
- Verilog学习笔记基本语法篇(十一)········ 常用系统函数
1)系统任务:$monitor 格式: $monitor(p1,p2,p3...pn); $monitor; $monitoron; $monitoroff; 任务$monitor提供了监控输出列 ...
- Verilog学习笔记基本语法篇(十三)...............Gate门
Verilog中已有一些建立好的逻辑门和开关的模型.在所涉及的模块中,可通过实例引用这些门与开关模型,从而对模块进行结构化的描述. 逻辑门: and (output,input,...) nand ( ...
- Verilog学习笔记简单功能实现(六)...............计数分频电路
在分频器电路中最重要的概念有两个:1)奇分频/偶分频:2)占空比. A)其中最简单的就是二分频电路,占空比为50%,其Verilog程序为 module half_clk(clr,clk_in,clk ...
- Verilog学习笔记简单功能实现(五)...............序列检测设计
这里采用夏宇闻教授第十五章的序列检测为例来学习; 从以上的状态转换图可以写出状态机的程序: module seqdet(x,out,clk,rst); input x,clk,rst; output ...
- Verilog学习笔记设计和验证篇(五)...............层次化事件队列
详细的了解层次化事件队列有助于理解Verilog的阻塞赋值和非阻塞赋值功能.所谓层次化事件队列指的是用于调度仿真时间的不同Verilog事件队列.在IEEE的5.3节中定义了层次化事件队列在逻辑上分为 ...
- Verilog学习笔记设计和验证篇(三)...............同步有限状态机的指导原则
因为大多数的FPGA内部的触发器数目相当多,又加上独热码状态机(one hot code machine)的译码逻辑最为简单,所以在FPGA实现状态机时,往往采用独热码状态机(即每个状态只有一个寄存器 ...
- Verilog学习笔记简单功能实现(三)...............同步有限状态机
在Verilog中可以采用多种方法来描述有限状态机最常见的方法就是用always和case语句.如下图所示的状态转移图就表示了一个简单的有限状态机: 图中:图表示了一个四状态的状态机,输入为A和Res ...
随机推荐
- Prerender Application Level Middleware - ASP.NET Core Middleware
In the previous post Use Prerender to improve AngularJS SEO, I have explained different solutions at ...
- SpringBoot 获取前端页面参数的集中方式总结
SpringBoot的一个好处就是通过注解可以轻松获取前端页面的参数,之后尅将参数经过一系列处理传送到后台数据库,前端时间正好用到.大致分为一下几种: 1.指定前端URL请求参数名称与方法名称一致,这 ...
- 成功抓取csdn阅读量过万博文
http://images.cnblogs.com/cnblogs_com/elesos/1120632/o_111.png var commentscount = 1; 嵌套的评论算一条,这个可能有 ...
- WCF系列 基础概念
WCF全称Windows Communication Foundation,是微软构建面向服务的分布式编程框架.而它其实是统一了COM和.Net Remoting等分布式技术提供一个完整,通用,可靠的 ...
- Prime triplets (Project Euler 196)
original version hackerrank programming version 题目大意是定义了一个正整数的表,第一行是1,第二行是1,2,第三行1,2,3...定义prime tri ...
- 根本上解决npm install 报错“ajv-keywords@3.4.0 requires a peer of ajv@^6.9.1 but none is installed. You must install peer dependencies yourself.“
每次项目npm install 的时候都报这个错误, 然后网上找的方法就把这个 ajv重新安装下,感觉有点麻烦, 后来有次我把npm更新了一下(我的版本是: 6.1.0),更新到了最新版本,这个问题就 ...
- Page_ClientValidate 用法
JS script function ConfirmMe(){ return confirm("Do you want to proceed?");} ASPX <asp ...
- boost数据结构tuple
boost数据结构tuple tuple(元组)定义了一个有固定数目元素的容器,其中每个元素类型可以不相同,这与其它容器有着本质的区别!vector和array虽然可以容纳很多元素,但是元素的类型必须 ...
- flask-第三方组件
flask-script 离线脚本 from flask_demo import create_app from flask_script import Manager app = create_a ...
- Setting up PhoneGap on Ubuntu for Android app development
This is just some notes I made, mostly taken from http://docs.phonegap.com/en/3.0.0/guide_overview_i ...