verilog 里面,always,assign和always@(*)区别
1.always@后面内容是敏感变量,always@(*)里面的敏感变量为*,意思是说敏感变量由综合器根据always里面的输入变量自动添加,也就是所有变量都是敏感列表,不用自己考虑。 2.如果没有@,那就是不会满足特定条件才执行,而是执行完一次后立马执行下一次,一直重复执行,比如testbench里面产生50Mhz的时钟就(假设时间尺度是1ns)可以写成 always #25 CLK_50Mhz = ~CLK_50Mhz;
一般always@(*)是指里面的语句是组合逻辑的。*代替了敏感变量。 而一般时序逻辑要写成always@(posedge clk or negedge rst)//时钟信号clk上升沿或者复位信号rst下降沿的时候执行always块内的代码。
assign 用于描述组合逻辑
always@(敏感事件列表) 用于描述时序逻辑
敏感事件 上升沿 posedge,下降沿 negedge,或电平
敏感事件列表中可以包含多个敏感事件,但不可以同时包括电平敏感事件和边沿敏感事件,也不可以同时包括同一个信号的上升沿和下降沿,这两个事件可以合并为一个电平敏感事件。
在新的verilog2001中“,”和“or”都可以用来分割敏感事件了,可以用“*”代表所有输入信号,这可以防止遗漏。
合法的写法:
always@ *
always@ (posedge clk1,negedge clk2)
always@ (a or b)
`timescale 100ns/100ns //定义仿真基本周期为100ns
always #1 clk=~clk //#1代表一个仿真周期即100ns
所有的assign 和 always 块都是并行发生的!
并行块、顺序块
将要并行执行的语句写在
fork
//语句并行执行
join
将要顺序执行的语句写在
begin
//语句顺序执行
end
并行块和顺序块都可以写在
initial 或 always@ 之后,也就是说写在块中的语句是时序逻辑的
对assign之后不能加块,实现组合逻辑只能用逐句的使用assign
组合逻辑如果不考虑门的延时的话当然可以理解为瞬时执行的,因此没有并行和顺序之分,并行和顺序是针对时序逻辑来说的。值得注意的是所有的时序块都是并行执行的。initial块只在信号进入模块后执行1次而always块是由敏感事件作为中断来触发执行的。
2:assign 组合逻辑和always@(*)组合逻辑
verilog描述组合逻辑一般常用的有两种:assign赋值语句和always@(*)语句。两者之间的差别有:
1. 被assign赋值的信号定义为wire型,被always@(*)结构块下的信号定义为reg型,值得注意的是,这里的reg并不是一个真正的触发器,只有敏感列表为上升沿触发的写法才会综合为触发器,在仿真时才具有触发器的特性。
2. 另外一个区别则是更细微的差别:举个例子,
wire a;
reg b;
assign a = 1'b0;
always@(*)
b = 1'b0;
在这种情况下,做仿真时a将会正常为0, 但是b却是不定态。这是为什么?verilog规定,always@(*)中的*是指该always块内的所有输入信号的变化为敏感列表,也就是仿真时只有当always@(*)块内的输入信号产生变化,该块内描述的信号才会产生变化,而像always@(*) b = 1'b0;
这种写法由于1'b0一直没有变化,所以b的信号状态一直没有改变,由于b是组合逻辑输出,所以复位时没有明确的值(不定态),而又因为always@(*)块内没有敏感信号变化,因此b的信号状态一直保持为不定态。事实上该语句的综合结果有可能跟assign一样(本人没有去尝试),但是在功能仿真时就差之千里了。
verilog 里面,always,assign和always@(*)区别相关推荐
- Verilog HDL组合逻辑与时序逻辑区别
1.1 Verilog HDL组合逻辑与时序逻辑区别 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Verilog HDL组合逻辑与时序逻辑区别: 5)结束语. 1.1 ...
- Verilog 中 wire 和 reg 数据类型区别
两者差别很大,完全不能取消. 在Verilog中,wire永远是wire,就是相当于一条连线,用来连接电路,不能存储数据,无驱动能力,是组合逻辑,只能在assign左侧赋值,不能在always @ 中 ...
- verilog中wire和reg的区别,什么时候用wire?什么时候用reg?
相信很多和我一样刚开始接触verilog语言的小白都会有这样的困惑,wire型变量和reg型变量到底有什么区别?什么情况下使用wire定义变量.什么情况下使用reg定义变量?下面就详细分析两者在使用中 ...
- Verilog语言- 和c语言的区别
1.Verilog基础 1.1 特别的数值种类 x 或 X:未知 z 或 Z:高阻 (Z 常见于信号(input, reg)没有驱动时的逻辑结果.例如一个 pad 的 input 呈现高阻状态时,其逻 ...
- assign与weak区别(面试)
weak 比 assign 多了一个功能就是当属性所指向的对象消失的时候(也就是内存引用计数为0)会自动赋值为 nil ,这样再向 weak 修饰的属性发送消息就不会导致野指针操作crash. 可能不 ...
- [初学Verilog笔记]使用assign还是always
一.在语法上 (1)assign属于数据流建模,为连续赋值语句.相当于连线,一般是将一个变量的值不间断地赋值给另一个变量,对应的被赋值变量为wire型,只要输入有变化,输出马上有反应. (2)alwa ...
- 【学习笔记-FPGA】verilog语言中assign的使用
个人笔记. assign在verilog语言中一般用于连接两个变量,将一个变量的值不断赋值给另一个变量,比如在顶层模块中调用另一模块的变量. 例: ///二级模块 module compile( in ...
- Verilog always和assign知识点
目录 always--------------过程赋值语句 1.输出类型reg 2.时序和组合 3.always @(*) (1)避免latch的方法 4.always @(posedge clk) ...
- verilog中always和initial的区别
verilog中的语句 赋值语句: 阻塞赋值语句(=).非阻塞赋值语句(<=) 块语句 : 顺序块(begin-end).并行块(fork-join) 条件语句: if-else语句.case语 ...
最新文章
- libuv 中文编程指南(零)前言
- linux内核设计与实现看不懂,Linux内核设计与实现读书笔记
- 【读书笔记】2015年考研英语二真题翻译(帮你克服艰难之路的真理+熟路效应)
- Python-使用jmespath来格式化处理json数据
- node升级命令_Vue CLI 4 发布:自动化升级过程,支持自定义包管理器
- 溢出检测单符号位法_设计经验:如何用三轴加速度传感器检测倾斜角?
- 【最短路】 Johnson 算法
- Oracle开窗函数
- python聊天室设计_基于python的GUI聊天室设计
- python爬虫(三)爬取js动态页面之b站粉丝数观看数点赞数爬取
- 2021年中国百香果果汁进出口贸易分析:贸易逆差明显,越南是主要进口国[图]
- Android Studio更新后导入项目报错问题解决(Minimum supported Gradle version is ×.×.×. Current version is ×.×.× )
- 【Joy of Cryptography 读书笔记】Chapter 5 伪随机数生成器(Pseudorandom Generator)
- 利用beef盗取浏览器cookie,并实现页面跳转
- ImageIO的图片压缩算法
- ROX-Filer 2.6
- 我的世界手机版虚拟人生服务器,我的世界大型虚拟人生整合包
- The ST Intranet updater server is unknown:mcucrossselector.codex.cro.st.com
- Outlook 2007 电子邮件数字签名和加密指南
- Timer和TimeTask类(定时调度)学习之秒表计时器
热门文章
- 地表车神争霸赛,且看第16届大学生智能汽车竞赛
- 第十六届无线节能信标灯规格说明
- 听说你有病,我这儿可有对症的药
- 解决git 提交出现这个错误fatal: Unable to create ‘project_path/.git/index.lock‘: File exists.
- linux 批量启动服务器,批量部署Linux操作系统systemimager 使用
- 路径字符串生成树形结构的思路_LeetCode 22. 括号生成
- 循环求100内质数 php_C8循环
- win下手动编译狂魔的必备C/C++编译环境
- linux php ftp扩展,Linux中如何安装 PHP 扩展?(方法介绍)
- 使用Capture画原理图