verilog学习笔记4——verilog延时语句

文章目录

  • 前言
  • 一、延时语句分类
    • 1、阻塞赋值左侧延时
    • 2、阻塞赋值右侧延时
    • 3、非阻塞赋值左侧延时
    • 4、非阻塞赋值右侧延时
  • 二、比较及举例说明
    • 1、阻塞右侧延时和非阻塞右侧延时的区别
    • 2、举例


前言

2023.8.10


一、延时语句分类

1、阻塞赋值左侧延时

在10ns后,把10ns时刻的b+c值赋值给a,a拿到的是b+c的最新值

always@(*)
	#10 a = b + c;

2、阻塞赋值右侧延时

先把0时刻的b+c值暂存起来,在10ns后,把0时刻的b+c值赋值给a

always@(*)
	a = #10 b + c;
等效于
always@(*)
	temp = b + c;
	#10 a = temp;

如果0-10ns之间b、c的值发生了改变,那么不会影响a的值

3、非阻塞赋值左侧延时

在10ns后,把10ns时刻的b+c值赋值给a,a拿到的是b+c的最新值(和第一种情况相同)

always@(*)
	#10 a <= b + c;   //拿到的是最新值

4、非阻塞赋值右侧延时

只要b或c发生改变,引起always触发,就会把当前触发时刻的b+c赋值给a
如果b和c在0-10ns之间发生改变,改变也会体现在从改变时刻开始往后的10ns
也就是输出会随着输入变化,只是有10ns的延时

always@(*)
	a <= #10 b + c;

二、比较及举例说明

1、阻塞右侧延时和非阻塞右侧延时的区别

前者会忽略中间变量的改变,后者输入随输出改变

2、举例

第一个:

a = 0;
b = 0;
q = 0;
#5 a <= 1;
b <= 1;
q <= a & b;

在5ns时刻,三个非阻塞赋值并行运行,q的值为0
如果改成如下方式,则6ns时刻,q的值为1

#1 q <= a & b;

第二个:
前者会分别暂存此刻的a和b,等到5ns后再分别赋值给a和b
后者则在5ns分别给a和b赋值,会发生竞争冒险

fork
	a = #5 b;
	b = #5 a;
join
fork
	#5 a = b;
	#5 b = a;
join

你可能感兴趣的:(Verilog学习笔记,学习,verilog,延时,阻塞赋值)