首页 > 其他分享 >Verilog 时延与过程结构

Verilog 时延与过程结构

时间:2022-12-16 14:32:34浏览次数:52  
标签:语句 ai initial bi so Verilog 时延 结构

一、关键词:时延, 惯性时延

连续赋值延时语句中的延时,用于控制任意操作数发生变化到语句左端赋予新值之间的时间延时。

时延一般是不可综合的。

寄存器的时延也是可以控制的,这部分在时序控制里加以说明。

连续赋值时延一般可分为普通赋值时延、隐式时延、声明时延。

下面 3 个例子实现的功能是等效的,分别对应 3 种不同连续赋值时延的写法。

//普通时延,A&B计算结果延时10个时间单位赋值给Z
wire Z, A, B ;
assign #10 Z = A & B ;

//隐式时延,声明一个wire型变量时对其进行包含一定时延的连续赋值。
wire A, B;
wire #10 Z = A & B;

//声明时延,声明一个wire型变量是指定一个时延。因此对该变量所有的连续赋值都会被推迟到指定的时间。除非门级建模中,一般不推荐使用此类方法建模。
wire A, B;
wire #10 Z ;
assign Z =A & B

1、惯性时延

在上述例子中,A 或 B 任意一个变量发生变化,那么在 Z 得到新的值之前,会有 10 个时间单位的时延。如果在这 10 个时间单位内,即在 Z 获取新的值之前,A 或 B 任意一个值又发生了变化,那么计算 Z 的新值时会取 A 或 B 当前的新值。所以称之为惯性时延,即信号脉冲宽度小于时延时,对输出没有影响。

因此仿真时,时延一定要合理设置,防止某些信号不能进行有效的延迟。

对一个有延迟的与门逻辑进行时延仿真。

module time_delay_module(
input ai, bi,
output so_lose, so_get, so_normal);

assign #20 so_lose = ai & bi ;
assign #5 so_get = ai & bi ;
assign so_normal = ai & bi ;
endmodule

testbench 参考如下:

`timescale 1ns/1ns

module test ;
reg ai, bi ;
wire so_lose, so_get, so_normal ;

initial begin
ai = 0 ;
#25 ; ai = 1 ;
#35 ; ai = 0 ; //60ns
#40 ; ai = 1 ; //100ns
#10 ; ai = 0 ; //110ns
end

initial begin
bi = 1 ;
#70 ; bi = 0 ;
#20 ; bi = 1 ;
end

time_delay_module u_wire_delay(
.ai (ai),
.bi (bi),
.so_lose (so_lose),
.so_get (so_get),
.so_normal (so_normal));

initial begin
forever begin
#100;
//$display("---gyc---%d", $time);
if ($time >= 1000) begin
$finish ;
end
end
end

endmodule

仿真结果如下:

信号 so_normal 为正常的与逻辑。

由于所有的时延均大于 5ns,所以信号 so_get 的结果为与操作后再延迟 5ns 的结果。

信号 so_lose 前一段是与操作后再延迟 20ns 的结果。

由于信号 ai 第二个高电平持续时间小于 20ns,so_lose 信号会因惯性时延而漏掉对这个脉冲的延时检测,所以后半段 so_lose 信号仍然为 0。

Verilog 时延与过程结构_连续赋值

2、源码下载

​Download​

二、关键词:initial, always

过程结构语句有 2 种,initial 与 always 语句。它们是行为级建模的 2 种基本语句。

一个模块中可以包含多个 initial 和 always 语句,但 2 种语句不能嵌套使用。

这些语句在模块间并行执行,与其在模块的前后顺序没有关系。

但是 initial 语句或 always 语句内部可以理解为是顺序执行的(非阻塞赋值除外)。

每个 initial 语句或 always 语句都会产生一个独立的控制流,执行时间都是从 0 时刻开始。

1、initial语句

initial 语句从 0 时刻开始执行,只执行一次,多个 initial 块之间是相互独立的。

如果 initial 块内包含多个语句,需要使用关键字 begin 和 end 组成一个块语句。

如果 initial 块内只要一条语句,关键字 begin 和 end 可使用也可不使用。

initial 理论上来讲是不可综合的,多用于初始化、信号检测等。

对上一节代码稍作修改,进行仿真,代码如下。

`timescale 1ns/1ns

module test ;
reg ai, bi ;

initial begin
ai = 0 ;
#25 ; ai = 1 ;
#35 ; ai = 0 ; //absolute 60ns
#40 ; ai = 1 ; //absolute 100ns
#10 ; ai = 0 ; //absolute 110ns
end

initial begin
bi = 1 ;
#70 ; bi = 0 ; //absolute 70ns
#20 ; bi = 1 ; //absolute 90ns
end

//at proper time stop the simulation
initial begin
forever begin
#100;
//$display("---gyc---%d", $time);
if ($time >= 1000) begin
$finish ;
end
end
end

endmodule

仿真结果如下:

可以看出,2 个 initial 进程语句分别给信号 ai,bi 赋值时,相互间并没有影响。

信号 ai,bi 的值按照赋值顺序依次改变,所以 initial 内部语句也可以看做是顺序执行。

Verilog 时延与过程结构_连续赋值_02

2、always 语句

与 initial 语句相反,always 语句是重复执行的。always 语句块从 0 时刻开始执行其中的行为语句;当执行完最后一条语句后,便再次执行语句块中的第一条语句,如此循环反复。

由于循环执行的特点,always 语句多用于仿真时钟的产生,信号行为的检测等。

下面用 always 产生一个 100MHz 时钟源,并在 1010ns 时停止仿真代码如下。

代码如下:

`timescale 1ns/1ns

module test ;

parameter CLK_FREQ = 100 ; //100MHz
parameter CLK_CYCLE = 1e9 / (CLK_FREQ * 1e6) ; //switch to ns

reg clk ;
initial clk = 1'b0 ; //clk is initialized to "0"
always # (CLK_CYCLE/2) clk = ~clk ; //generating a real clock by reversing

always begin
#10;
if ($time >= 1000) begin
$finish ;
end
end

endmodule

仿真结果如下:

可见,时钟周期是我们想要得到的 100MHz。而且仿真在 1010ns 时停止。

Verilog 时延与过程结构_赋值_03

3、源码下载

​Download​

标签:语句,ai,initial,bi,so,Verilog,时延,结构
From: https://blog.51cto.com/u_15641375/5947435

相关文章

  • 一个项目结构--源自《learn python hard way》的项目结构总结
    问题:http://learnpythonthehardway.org/book/ex46.html一书exe46中提到了项目架构,这是之前写程序没有考虑的,一个项目一定有规范和标准,所以也算是一种新内容的学习,摘抄和补......
  • C语言《数据结构》课程设计任务书
    C语言《数据结构》课程设计任务书1.个人薪资管理系统[基本功能]1)个人工号及薪资使用线性表实现数据存储;2)可实现个人薪资信息的输入、修改、删除功能;3)能够对数据按......
  • 服务器的机箱结构分为哪些类别
    1、刀片式服务器刀片式服务器是较为低成本一种服务器类型。其中每一块刀片就是一块系统母版,就类似于一个独立的服务器。不同母版之间互相不影响,各自运行。目前市场上......
  • openharmony 军棋开发带你了解如何选择数据结构
    openharmony军棋开发带你了解如何选择数据结构一,引言数据结构不只是用于组织数据,它还极大地影响着代码的运行速度。因为数据结构不同,程序的运行速度可能相差多个数量级。......
  • MySQL技术内幕—第一章 体系结构和存储引擎
    MySQL被设计为一个单进程多线程架构的数据库,数据库实例在系统上的表现就是一个进程。当启动实例时,MySQL数据库会去读取配置文件,根据配置文件的参数来启动数据库实例。而......
  • 寡人的难题 - 2021算法与数据结构实验题
    算法与数据结构实验题10.23寡人的难题题目内容★实验任务寡人心系天下为国为民,想要在历史中留下点痕迹,就必须要让国家强盛起来,正所谓想致富先修路,寡人觉得去修路,那些......
  • 结构体定义 typedef struct 用法详解和用法小结
    typedef可以声明新的类型名来代替已有的类型名,但却不能增加新的类型。typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型......
  • 2.python-程序结构
    程序结构1模块Module1.1定义包含一系列数据、函数、类的文件,通常以.py结尾。1.2作用让一些相关的数据,函数,类有逻辑的组织在一起,使逻辑结构更加清晰。有利于多人合......
  • 一个开源的个人学习计算机科学知识成长记录(前后端,数据结构与算法)
    菜鸟进阶​​一个适合自学与巩固的学习记录​​​​前端项目积累​​​​前端入门​​​​HTML​​​​CSS​​​​JavaScript​​​​Browser​​​​Node​​​​DOM​​......
  • WinForm(十)项目框架结构
    看到下面的项目结构,是否曾经相识?不要笑,这也是一种项目结构,极简主义。   项目结构没有对错,合适就好,但也要有几个要求,至少要做到结构明确,清晰,当然上图的结构......