在Verilog的建模中,时间尺度和延迟是非常重要的概念,设置好时间尺度和延迟,可以充分模拟逻辑电路发生的各种情况和事件发生的时间点,来评估数字IC设计的各种要求,达到充分评估和仿真的作用。注意延迟语句是不可综合的,只是用来数据建模或仿真。
1. 时间尺度
语法格式: `timescale 10ns/1ns
用关键字 `timescale标识,后面跟时间刻度,如:10ns/1ns,其中10ns表示基本时间刻度,就是每10ns作为一个刻度。1ns是精度,一般在仿真软件中的最小刻度。不同的仿真工具的精度不同,在modelsim中一般时间刻度为1ps,与`timescale 10 ns/1 ps的1 ps的设置是等效的。
例:在testbench 中时钟的建模:
`timescale 1ns/1ps //时间刻度为1 ns
 
module top_sim
(
 
);
 
reg CLK;
 
initial
begin
CLK = 1'b0;
#5;
 
forever
#5 CLK = ~CLK; //duty cycle 50%, period 10 ns; Frequency 100Mhz;
end
 
endmodule
Modelsim 波形
`timescale 1ns/1ps //时间刻度为1 ns
 
module top_sim
(
 
);
 
reg CLK;
 
initial
begin
CLK = 1'b0;
#4;
 
forever
#4 CLK = ~CLK; //duty cycle 50%, period 8 ns; frequency 125Mhz
end
 
endmodule
Modelsim 仿真波形
 
 
在设置时间尺度是也可直接指定时间单位或由关键字parameter定义的参数指定,修改缺省的 由`timeschale定义的时间尺度。
例:
parameter PERIOD = 10 ; reg CLK; initial begin CLK = 1'b0; #(PERIOD/2); forever #(PERIOD/2) CLK = ~CLK; end
2. 延迟:
赋值延时语句中的延时,用于控制任意操作数发生变化到语句左端变量赋值之间的时间延时。
  • 赋值延时分类:
  1.  
  2. 根据信号类型可分为连续赋值延时和寄存器赋值延时,
  3. 根据延迟特性分为内部延迟和外部延迟
 
  • 连续赋值时延:一般可分为普通赋值时延、隐式时延、声明时延;只有 外部时延。
  • 寄存器赋值延时:只有在使用时可分为内部时延 和 外部时延, 但没有声明延时。
 
  •  
  •  
  • 普通赋值时延
 
 
例:
wire [3:0] a, b, c;
assign #10 c = a + b;
含义:a,b中有任意一个发生变化,将a+b的结果延时10个时间单位,赋值给变量c。
作用:在连续赋值期间,如果a+b的结果不断变化,c并不跟随a+b 结果的变化,直到a,b变量稳定后,在指定的10个时间单位延迟到达后才赋值。
`timescale 1 ns/1 ps
 
module tb
(
 
);
 
reg [3:0] ta,tb;
 
wire [3:0] tc ,td;
 
assign #10 tc = ta + tb;
assign #10 td = ta - tb;
 
initial
begin
ta = 4'b0000;
tb = 4'b0000;
#2
 
tb = 4'b0001;
#2
 
ta = 4'b0010;
#2
 
tb = 4'b0100;
#2
 
ta = 4'b0010;
tb = 4'b1000;
#2
 
ta = 4'b0110;
tb = 4'b0001;
#20
 
tb = 4'b0111;
tb = 4'b0110;
#20
 
tb = 4'b1111;
tb = 4'b0110;
end
 
endmodule
仿真波形如下:
 
 
从波形可以看出,虽然开始ta,tb 有多次变化,由于变化的时间间隔都不足10个单位,因此tc并没有得到ta+tb的结果,只有在ta==4’b0110, tb==4’b0001的时刻开始,ta,tb稳定持续10个时间单位后,tc才得到ta+tb的值。所以连续赋值语句能否更新,是从参与计算的变量最近的时刻是否满足延迟时间的需求而定。
  •  
  • 隐式延时声明:
 
wire A, B; wire #10 Z = A & B;
声明一个wire型变量时对其进行包含一定时延的连续赋值。
  •  
  • 变量声明延时
 
wire A, B; wire #5 Z ; assign Z =A + B;
声明时延,声明一个wire型变量时指定一个时延。因此对该变量所有的连续赋值都会被推迟到指定的时间。除非门级建模中,一般不推荐使用此类方法建模。
  •  
  • 惯性延迟
 
惯性延迟,如上面的例子
reg [3:0] ta, tb ;
wire [3:0] tc ,td;
assign #10 tc = ta + tb;
assign #10 td = ta – tb;
如果在这 10 个时间单位内,即在 td 获取新的值之前,ta 或 tb 任意一个值又发生了变化,那么计算 tc, td 的新值时会取 ta 或 tb 当前的新值。所以称之为惯性时延,即信号脉冲宽度小于时延时,对输出没有影响。
因此仿真时,时延一定要合理设置,防止某些信号不能进行有效的延迟。
 
按时延特性 可以分为:
延迟还分内部延迟(intra _delay)和外部延迟(inter_delay)两种。上面介绍的例子都是外部延迟。
 
内部延迟
intra_delay: 是指在赋值语句内部的延迟。看下面三条语句就可以明白intra_delay 和inter_delay的区别。
例1:
wire co, y; assign {co, y} = a + b + ci; assign # inter_delay {co, y} = a + b + ci;
语句assign {co, y} = a + b + ci; 是连续赋值语句,赋值语句的左边LHS(left hand side) {co,y}始终追随右边RHS的变化,右边任何一个变量发生变化,赋值语句立即评估结果,并赋给左边变量。
 
语句assign # inter_delay {co, y} = a + b + ci;是外部延时语句,当RHS变量有变化时,等待 # inter_delay时间后评估RHS的值,并赋给LHS变量。
 
例2:
reg co, y;
always@(*)
{co, y} = #intra_delay a + b + ci;
语句{co, y} = #intra_delay a + b + ci;是内部延时语句,用在赋值语句内部,当RHS变量有变化时,立即评估a+b+ci的结果,延迟#intra_delay时间后,将评估的结果赋给LHS变量。
注:内部延时语句只能用在顺序语句中。
例: module tb
(
 
);
 
reg [3:0] ta,tb;
 
wire [3:0] tc_inter, tc_intra ,td;
 
assign #10 tc_inter = ta + tb;
assign #10 td = ta - tb;
 
initial
begin
ta = 4'b0000;
tb = 4'b0000;
#2
 
tb = 4'b0001;
#2
 
ta = 4'b0010;
#2
 
tb = 4'b0100;
#2
 
ta = 4'b0010;
tb = 4'b1000;
#2
 
ta = 4'b0110;
tb = 4'b0001;
#5
 
tb = 4'b0111;
tb = 4'b0110;
#20
 
tb = 4'b1111;
tb = 4'b0110;
end
 
always@(*)
tc_intra = #10 ta + tb;
 
endmodule
仿真波形如下:
 
 
从仿真波形可以清楚看出,内部延迟与外部延迟的区别。
在建模时应注意各种delay的选择与使用。

Verilog中的时间尺度与延迟的更多相关文章

  1. system verilog中的跳转操作

    在verilog中,使用disable声明来从执行流程中的某一点跳转到另一点.特别地,disable声明使执行流程跳转到标注名字的声明组末尾,或者一个任务的末尾. verilog中的disable命令 ...

  2. system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)

    类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...

  3. 一段比较有意思的代码——介绍system verilog中的新增幅值语句

    system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用. 下面是一段有意思的代码,覆盖了一些用法. package definitions; typedef ...

  4. GCD中使用dispatch_after函数延迟处理任务

    在实际的开发中,经常会遇到想要在指定的时间间隔后执行某个处理 <一>在GCD中提供了dispatch_after函数来完成这一操作 dispatch_after(dispatch_time ...

  5. 关于verilog中if与case语句不完整产生锁存器的问题 分类: FPGA 2014-11-08 17:39 260人阅读 评论(0) 收藏

    在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因. 一,什么是锁存器?锁存器与触发器 ...

  6. 关于Verilog 中的for语句的探讨

    在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...

  7. Verilog中锁存器与多路选择器

    Verilog中锁存器与多路选择器 Verilog是一种硬件描述语言,它代表的是硬件. Verilog代表的就是逻辑门和连接线. 对于一个always@(*)控制的块而言,只要块中的表达式包含的任意的 ...

  8. verilog中always块延时总结

    在上一篇博文中 verilog中连续性赋值中的延时中对assign的延时做了讨论,现在对always块中的延时做一个讨论. 观测下面的程序,@0时刻,输入的数据分别是0x13,0x14 . @2时刻, ...

  9. verilog中读取文件中的字符串_modelsim高级仿真

    今天给个程序大家玩玩.因为今天遇到一个问题,就是要向UART发送指令,指令非常多,都是字符串.一直copy 函数 UART ("COMM_1");  UART ("COM ...

  10. verilog中的有符号数运算

    verilog中的有符号数运算 http://hi.baidu.com/lixu1113/item/d00dc095f86aed48f142159a verilog中的有符号数运算 有符号数的计算:若 ...

随机推荐

  1. Java中如何判断两个对象是否相等

    参考:https://blog.csdn.net/u013063153/article/details/78808923 下面是自己开发过程中的实现 package com.***.***.entit ...

  2. 脚本执行sudo命令时: 免手动确认和免输入密码

    1.sudo 命令有时候需要手动输入yes来确认执行 或者 软件在安装包下载完毕后还需要你输入y进行确认安装 .那如果是用脚本执行sudo 命令就可以用-y 参数来确认执行 sudo yum inst ...

  3. MinGW、Linux GNU、MSVC编译和链接动态库的分析

    这几天研究CMake跨平台项目嘛,用了以下几种编译器: VS2019(MSVC) Linux GNU MinGW 编译之后发现链接动态库发现以下问题: VS2019中如果直接链接CMakeLists. ...

  4. 通过Jenkins在远程服务器上执行shell脚本

    1.Jenkins安装Publish over SSH插件 下载安装Publish over SSH插件 2.配置服务器相关信息 要先在jenkins所在的机器上生成秘钥.生成方式为: ssh-key ...

  5. HTML基本介绍与操作

    一,HTML介绍 HTML,全称是超文本标记语言(HyperText Markup Language),它是一种用于创建网页的标记语言.标记语言是一种将文本(Text)以及文本相关的其他信息结合起来, ...

  6. BIP弹框内容显示的隐藏

    viewModel.on("customInit", function (data) {         // 关闭或取消关原因详情--页面初始化         viewMode ...

  7. Vim文本编码之坑

    #20220503更新# 今天又遇到一个问题,即常见的"cat显示正常,vi显示异常"的问题. 有这样一个文件,它的编码是UTF-16(DOS),在windows下用UltraEd ...

  8. 19c 滚动升级

    一.环境说明   节点1 节点2 IP 192.168.3.77 192.168.3.88 DB 版本 Oracle 19.6.0.0.0 Oracle 19.6.0.0.0 OS 主机名 oadb1 ...

  9. GVK和GVR

    一.GVK与GVR 在Kubernetes体系中,资源是最重要的概念.Kubernetes使用Group.Version.Resource.Kind来描述 Group即资源组,在kubernetes中 ...

  10. 计数 dp 部分例题(十一~十五部分)

    十一.矩阵的利用(行列を用いたテクニック) 1. 快速幂(二分累乗) (1) 推导转移矩阵(行列の導出) 例题:Placing Squares 题解 (2) BM 优化递推(?)(コンパニオン行列の累 ...