Verilog中 reg和wire 用法 以及always和assign的区别
1、从仿真角度来说,HDL语言面对的是编译器,相当于使用软件思路,此时:
wire对应于连续赋值,如assign;
reg对应于过程赋值,如always,initial;
2、从综合角度,HDL语言面对的是综合器,相当于从电路角度来思考,此时:
wire型变量综合出来一般情况下是一根导线。
reg变量在always中有两种情况:
**(1)always @(a or b or c)形式的,即不带时钟边沿的,综合出来还是组合逻辑;**
**(2)always @(posedge clk)形式的,即带有边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)**
3、设计中,输入信号一般来说不能判断出上一级是寄存器输出还是组合逻辑输出,对于本级来说,就当成一根导线,即wire型。而输出信号则由自己来决定是reg还是组合逻辑输出,wire和reg型都可以。但一般的,整个设计的外部输出(即最顶层模块的输出),要求是reg输出,这比较稳定、扇出能力好。
4、Verilog中何时要定义成wire型?
情况一:assign语句
例如:
reg a,b;
wire out;
......
assign out = a & b;
如果把out定义成reg型,对不起,编译器报错!
情况二:元件实例化时必须用wire型
例如:
wire dout;
ram u_ram
(
....
.out(dout);
)
wire为无逻辑连线,wire本身不带逻辑性,所以输入什么就的输出什么。所以如果用always语句对wire变量赋值,对不起,编译器报错。
那么你可能会问, assign c = a & b; 不是对wire的赋值吗?
并非如此,综合时是将 a & b综合成 a、b经过一个与门,而c是连接到与门输出线,真正综合出来的是与门&,不是c。
5、何时用reg、何时用wire?
大体来说,reg和wire类似于C、C++的变量,但若此变量要放在begin...end之内,则该变量只能是reg型;在begin...end之外,则用wire型;
使用wire型时,必须搭配assign;reg型可以不用。
input、output、inout预设值都是wire型。
在Verilog中使用reg型,并不表示综合出来就是暂存器register:在组合电路中使用reg,组合后只是net;在时序电路中使用reg,合成后才是以Flip-Flop形式表示的register触发器。
6、reg和wire的区别:
reg型数据保持最后一次的赋值,而wire型数据需要持续的驱动。wire用在连续赋值语句assign中;reg用于always过程赋值语句中。
在连续赋值语句assign中,表达式右侧的计算结果可以立即更新到表达式的左侧,可以理解为逻辑之后直接连接了一条线,这个逻辑对应于表达式的右侧,这条线对应于wire;
在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,这个变量可以声明成reg型,根据触发条件的不同,过程语句可以建模不同的硬件结构:
**(1)如果这个条件是时钟上升沿或下降沿,那硬件模型就是一个触发器,只有是指定了always@(posedge or negedge)才是触发器。
(2)如果这个条件是某一信号的高低电平,那这个硬件模型就是一个锁存器。
(3)如果这个条件是赋值语句右侧任意操作数的变化,那这个硬件模型就是一个组合逻辑。**
7、过程赋值语句always@和连续赋值语句assign的区别:
(1)wire型用于assign的赋值,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的足组合逻辑输出,所有复位时没有明确的值--即不确定状态,又因为always@(*)块内没有敏感信号变化,此时b信号一直保持不变,即不确定是啥,取决于b的初始状态。
转载:https://blog.csdn.net/u013025203/article/details/53410715
Verilog中 reg和wire 用法 以及always和assign的区别相关推荐
- reg类型变量综合电路_verilog中reg和wire类型的区别
verilog 中 reg 和 wire 类型的区别 reg 相当于存储单元, wire 相当于物理连线 Verilog 中变量的物理数据分为线型和寄存器型.这两种类型的变量在定义时要 设置位宽,缺省 ...
- Verilog中reg型与wire型区别
从以下方面区别 赋值语句 连续赋值语句 过程赋值语句 输入输出 综合 wire型变量 reg型变量 仿真文件 赋值语句 连续赋值语句 wire型数据只能被assign赋值,用以指定的组合逻辑信号. 如 ...
- Verilog中reg和SystemVerilog中logic的区别
关于reg和logic的区别,在SystemVerilog验证测试平台编写指南中有所提出,如下所示: SystemVerilog对经典的reg数据类型进行了改进,使得他除了作为一个变量以外,还可以被连 ...
- Verilog中generate语句的用法
在Verilog-2001中新增了语句generate,通过generate循环,可以产生一个对象(比如一个元件或者是一个模块)的多次例化,为可变尺度的设计提供了方便,generate语句一般在循环和 ...
- Verilog中Dump函数及用法
Verilog提供一系列系统任务用于记录信号值变化,常见的格式有vcd,fsdb等. 1,Dump VCD格式 $dumpfile("file. dump"); 打开一个VCD数据 ...
- Verilog中fork...join 的用法
特点 中间的语句并行执行:(延时不累加) 不能用于综合: 代码 module signal_gen; reg wave; parameter cycle = 5; initial beginforkw ...
- Verilog:generate-for 语句(用法,及与for语句区别)
文章目录 Abtract 1.generate语法 2.generate常用的几种情况举例说明 1). generate-for循环语句 2).generate-conditional条件语句 3). ...
- Android源码中final关键字的用法及final,finally,finalize的区别
Android开发的学习流程 final,finally,finalize的区别 Android的发展越来越快,Android开发人员越来越多,当两种情况碰撞,在诸多开发者中跟紧Android步伐脱颖 ...
- Verilog中generate语法和作用
Verilog中generate语句的用法 在Verilog-2001中新增了语句generate,通过generate循环,可以产生一个对象(比如一个元件或者是一个模块)的多次例化,为可变尺度的设计 ...
最新文章
- 读书笔记:《搞定3--平衡工作和生活的艺术》
- 【Linux+vscode】配置好秘钥之后还是不能ssh连接(离线配置)
- 原码一位乘法器设计_十分钟带你彻底搞懂原码、反码、补码
- java 正则表达式 手机号 邮箱(转载)
- java实现socket连接,向指定主机指定端口发送socket数据,并获取响应数据
- RxJava flatMap,switchMap,concatMap
- 第一节 42字符串基础
- 国产达梦数据库管理系统-通过Excel文件导入数据
- MySQL 新增、修改、删除 字段 sql语句
- AI中台——智能聊天机器人平台的架构与应用(分享实录)
- 二、python小项目模块(制作.npy形式数据集、图像添加随机噪声、将.npy的数据合成图像、创建文件夹)
- html的单元格加线,html表格单元格添加斜下框线的方法
- 迅雷边下边看实现过程分析
- 襄州区张家集镇社工站参与重点人群“敲门行动”
- [递推] 51Nod1383 整数分解为2的幂
- python用哪种字体比较好_你在用哪种编程字体?
- 视频转换中的码率是什么意思?它的大小有什么作用?
- 浅谈氢能源三大竞争优势
- 中国五十六个民族列表
- 使用Docker实现php代码在线测试执行工具-toolfk.com