我是靠谱客的博主 个性朋友,最近开发中收集的这篇文章主要介绍Verilog中仿真事件中的不同延时方法5 C = A +B,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

link

Verilog中仿真事件中的不同延时方法

  1. 电路的延时
    在实际电路中存在两种延迟,惯性延迟 (Inertial delay) 和传导延迟 (Transport delay)。
    惯性延迟
    定义:若元件的输入信号的脉冲宽度小于一定值时,元件的输出没有响应,也就是说元件具有一定的惯性。
    产生原因:当脉冲到达时,由于脉冲宽度小于元件本身的延迟,当脉冲结束时,元件的新输出还未建立起来。考虑了电路中存在的大量分布电容。
    传导延迟
    定义:输入信号变化到对应输出信号变化经过的时间,类似于物理传输线的延迟。
    产生原因:载流子运动的速度有限,通过导线需要一定的时间。

  2. Verilog中的时序模型
    在分析Verilog HDL的仿真行为前,我们需要了解Verilog中时序模型。
    时序模型分为:门级时序模型、过程时序模型。
    门级时序模型
    适用范围:所有的连续赋值语句、过程连续赋值语句、门原语、用户自定义原语。
    特点:
    任意时刻输入发生变化,将重新计算输出。
    当之前的事件未执行完毕时又发生的新的变化,则会撤销之前的事件,开始新的事件。

过程时序模型
适用范围:过程语句。
特点:
当敏感列表发生变化时触发执行。
当之前的事件未执行完毕时又发生的新的变化,则不撤销原有事件,同时开始新的事件,如果同时有几个更新事件,它们的执行顺序是不确定的。

  1. Verilog中的仿真延迟语句
    Verilog 中的仿真延时语句为 #n,n表示延时时间,将该语句加在语句中,延迟n个时间单位。
    延时的添加方法有两种:正规延迟和内定延迟
    正规延迟 (#在外面)

5 C = A +B

在 T 时刻执行到该语句时,等待 5 个时间单位,然后计算等号右边的值赋给 C,此时使用的 A B 的值是 T+5 时刻的值。
内定延迟 (#在里面)
C = #5 A +B
在 T 时刻执行到该语句时,先计算 A+B 的值,计算后等待 5 个时间单位将值赋给 C,使用的 A B 的值是 T 时刻的值。

  1. 在 Verilog 建模中增加延时
    两种延时的添加方式和三种赋值方式 (连续赋值、阻塞赋值、非阻塞赋值) 一共形成六中添加延迟的方式。

// 1. 连续赋值+ 正规延迟
assign #5 C = A +B;
// 2. 连续赋值+ 内定延迟
assign C = #5 A +B;
// 3. 阻塞赋值 + 正规延迟
always @(*) begin
#5 C = A +B;
end
// 4. 阻塞赋值 + 内定延迟
always @(*) begin
C = #5 A +B;
end
// 5. 非阻塞赋值 + 正规延迟
always @(*) begin
#5 C <= A +B;
end
// 6. 非阻塞赋值 + 内定延迟
always @(*) begin
C <= #5 A +B;
end

下面对这六种方式逐一分析:

1.连续赋值+ 正规延迟
在 T 时刻执行到该语句时,等待 5 个时间单位,然后计算等号右边的值赋给 A。
使用的 A B 的值是 T+5 时刻的值。
若在等待过程中 A B 的值发生变化再次触发 assign block,根据 assign block 的门级时序模型特点,仿真器会撤销先前的等待事件,然后重新执行语句。
当变化脉冲小于 5 个时间单位时,等待事件会被撤销,该脉冲将不起作用。
仿真结果:

可以看出在 6ns、8ns、9ns、10ns 时刻 A 发生了变化,但皆因持续时间小于 5ns,所以都没有对 C1 产生影响,只有在 12ns 和 18ns 的变化持续时间超过 5ns,作用到 C1 上。

2.连续赋值+ 内定延迟
在 T 时刻执行到该语句时,计算等号右边的值,等待 5 个时间单位后赋给 A。
使用的 A B 的值是 T 时刻的值。
若在等待过程中 A B 的值发生变化再次触发 assign block,根据 assign block 的门级时序模型特点,仿真器会撤销先前的等待事件,然后重新执行语句。
当变化脉冲小于 5 个时间单位时,等待事件会被撤销,该脉冲将不起作用。
该种方式有记忆属性,与连续赋值原则不符,为非法语句,编译不能通过。

  1. 阻塞赋值 + 正规延迟
    在 T 时刻执行到该语句时,等待 5 个时间单位,然后计算等号右边的值阻塞赋给 A。
    使用的 A B 的值是 T+5 时刻的值。
    若在等待过程中 A B 的值发生变化再次触发 always block,根据 always block 的过程时序模型特点,此时还在等待过程,always 语句还未执行结束,不会开始新一轮的事件,仿真器不会对敏感列表反应。
    仿真器忽略延迟时间段的数据变化。
    仿真结果:

在 6ns 时刻 A 的值发生变化,always block 开始执行,经过 5ns,用 11ns 时刻的 A B 的值计算出结果赋给 C3,而忽略了 8ns 和 10ns 时刻的变化。

  1. 阻塞赋值 + 内定延迟
    在 T 时刻执行到该语句时,计算等号右边的值,等待 5 个时间单位后赋给 A。
    使用的 A B 的值是 T 时刻的值。
    若在等待过程中 A B 的值发生变化再次触发 always block,根据 always block 的过程时序模型特点,由于赋值方式为阻塞赋值,此时 always 语句还未执行结束,不会开始新一轮的事件,仿真器不会对敏感列表反应。
    仿真器忽略延迟时间段的数据变化。
    仿真结果:

在 6ns 时刻 A 的值发生变化,always block 开始执行,经过 5ns,用 6ns 时刻的 A B 的变化后的值计算出结果赋给 C4,而忽略了 8ns 和 10ns 时刻的变化。

  1. 非阻塞赋值 + 正规延迟
    在 T 时刻执行到该语句时,等待 5 个时间单位,然后计算等号右边的值阻塞赋给 A。
    使用的 A B 的值是 T+5 时刻的值。
    若在等待过程中 A B 的值发生变化再次触发 always block,根据 always block 的过程时序模型特点,此时还在等待过程,always 语句还未执行结束,不会开始新一轮的事件,仿真器不会对敏感列表反应。
    仿真器忽略延迟时间段的数据变化。
    仿真结果:

在 6ns 时刻 A 的值发生变化,always block 开始执行,经过 5ns,用 11ns 时刻的 A B 的值计算出结果赋给 C5,而忽略了 8ns 和 10ns 时刻的变化。

  1. 非阻塞赋值 + 内定延迟
    在 T 时刻执行到该语句时,计算等号右边的值,等待 5 个时间单位后赋给 A。
    使用的 A B 的值是 T 时刻的值。
    若在等待过程中 A B 的值发生变化再次触发 always block,根据 always block 的过程时序模型特点,由于赋值方式为非阻塞赋值,将赋值事件放进事件队列后,always 语句执行结束,等待下一次的触发,触发来到时开始新一轮的事件。
    仿真器接受延迟时间段的数据变化,输入的变化延迟会全部反应在输出上。
    仿真结果:

A B 的每一次变化都触发 always block 的执行,每一次变化都延时 5ns 后反应在 C6 上。

下图为 always block 中的四种延时方式的仿真流程:


// 仿真源码
`timescale 1ns/1ps
module Testbench;
reg A,B;
wire C1,C2;
reg C3,C4,C5,C6;
initial begin
A = 0; B = 0;
C3 = 0; C4 = 0; C5 = 0; C6 = 0;
#6 A = 1;
#2 A = 0;
#1 A = 1;
#1 A = 0;
#2 A = 1;
#6 A = 0;
end
// 1. 连续赋值+ 正规延迟
assign #5 C1 = A +B;
// 3. 阻塞赋值 + 正规延迟
always @(*) begin
#5 C3 = A +B;
end
// 4. 阻塞赋值 + 内定延迟
always @(*) begin
C4 = #5 A +B;
end
// 5. 非阻塞赋值 + 正规延迟
always @(*) begin
#5 C5 <= A +B;
end
// 6. 非阻塞赋值 + 内定延迟
always @(*) begin
C6 <= #5 A +B;
end
endmodule
  1. 总结
    根据上述分析,容易看出惯性延时对应于连续赋值中的正规延迟,而传导延时对应于非阻塞赋值中的内定延迟。
    所以仿真中常用 “连续赋值 + 正规延迟“ 模拟惯性延迟,用 ”非阻塞赋值 + 内定延迟“ 模拟传导延迟。
分类: Verilog
<div id="blog_post_info">
好文要顶 关注我 收藏该文
SOC验证工程师
粉丝 - 26 关注 - 19
0
0
<div class="clear"></div>
<div id="post_next_prev"></div>

posted on 2022-08-12 22:27  SOC验证工程师  阅读(211)  评论(0)  编辑  收藏  举报

最后

以上就是个性朋友为你收集整理的Verilog中仿真事件中的不同延时方法5 C = A +B的全部内容,希望文章能够帮你解决Verilog中仿真事件中的不同延时方法5 C = A +B所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部