Verilog 入门(六)行为建模

文章目录

  • 过程结构
    • `initial` 语句
    • `always` 语句
  • 事件控制
  • 语句块
    • 顺序语句块
    • 并行语句块
  • 过程性赋值
    • 阻塞性过程赋值
    • 非阻塞性过程赋值

过程结构

下述两种语句是为一个设计的行为建模的主要机制:

  1. initial 语句
  2. always 语句

一个模块中可以包含任意多个 initialalways 语句。这些语句相互并行执行,即这些语句的执行顺序与其在模块中的顺序无关。一个 initialalways 语句的执行产生一个单独的控制流,所有的 initialalways 语句在 0 时刻开始并行执行。

initial 语句

initial 语句只执行一次。initial 语句在模拟开始时执行,即在 0 时刻开始执行。语法如下:

initial
[timing control] procedural_statement

procedural_statement 是下列语句之一:

  • procedural_assignment (blocking or non-blocking)
  • procedural_continuous_assignment
  • conditional_statement
  • case_statement
  • loop_statament
  • wait_statement
  • disable_statement
  • event_trigger
  • sequential_block
  • parallel_block
  • task_enable

顺序过程(begin...end)最常使用在进程语句中。这里的时序控制可以是时延控制,即等待一个确定的时间;或事件控制,即等待确定的事件发生或某一特定的条件为真。

always 语句

initial 语句相反,always 语句重复执行。与 initial 语句类似,always 语句语法如下:

always[timing control] procedural_statement

例如,产生时钟周期为 10 的波形:

always#5 clk = ~ clk;

下例是由事件控制的顺序过程的 always 语句:

reg[0:5] InstrReg;
reg[3:0] Accum;
wire ExecuteCycle;always@(ExecuteCycle)begincase(InstrReg[0:1])2'b00: Store(Accum, InstrReg[2:5]);2'b11: Load(Accum, InstrReg[2:5]);2'b01: Jump(InstrReg[2:5]);2'b10:;endcaseend// Store、Load 和 Jump 是在别处定义的用户自定义的任务

事件控制

在事件控制中,always 的过程语句基于事件执行。有两种类型的事件控制方式:

  1. 边沿触发事件控制
  2. 电平敏感事件控制

边沿触发事件控制如下:

@ event procedural_statement

如下例所示:

@(posedge clock)
curr_state = next_state

带有事件控制的进程或过程语句的执行,须等到指定事件发生。上例中,如果 clock 信号从低电平变为高电平(正沿),就执行赋值语句;否则进程被挂起,直到 clock 信号产生下一个正跳边沿。

在电平敏感事件控制中,进程语句或进程中的过程语句一直延迟到条件变为真后才执行。电平敏感事件控制以如下形式给出:

wait(Condition)procedural_statement

过程语句只有在条件为真时才执行,否则过程语句一直等待到条件为真。如果执行到该语句时条件已经为真,那么过程语句立即执行。在上面的表示形式中,过程语句是可选的。

语句块

语句块提供将两条或更多条语句组合成语法结构上相当于一条语句的机制。在 Verilog 中有两类语句块,即:

  1. 顺序语句块(begin...end):语句块中的语句按给定次序顺序执行。
  2. 并行语句块(fork...join):语句块中的语句并行执行。

顺序语句块

顺序语句块中的语句按顺序方式执行。每条语句中的时延值与其前面的语句执行的模拟时间相关。一旦顺序语句块执行结束,跟随顺序语句块过程的下一条语句继续执行。顺序语句块的语法如下:

begin[:block_id{declarations}]procedural_statement(s)
end

例如

begin#2 Stream = 1;#5 Stream = 0;#3 Stream = 1;#4 Stream = 0;#2 Stream = 1;#5 Stream = 0;
end

假定顺序语句块在第 10 个时间单位开始执行。两个时间单位后第 1 条语句执行,即第 12 个时间单位。此执行完成后,下 1 条语句在第 17 个时间单位执行(延迟 5 个时间单位)。然后下 1 条语句在第 20 个时间单位执行,以此类推。

并行语句块

并行语句块中的各语句并行执行。并行语句块内的各条语句指定的时延值都与语句块开始执行的时间相关。当并行语句块中最后的动作执行完成时(最后的动作并不一定是最后的语句),顺序语句块的语句继续执行。换一种说法就是并行语句块内的所有语句必须在控制转出语句块前完成执行。例如

fork#2 Stream = 1;#7 Stream = 0;#10 Stream = 1;#14 Stream = 0;#16 Stream = 1;#21 Stream = 0;
join

如果并行语句块在第 10 个时间单位开始执行,所有的语句并行执行并且所有的时延都是相对于时刻 10 的。例如,第 3 个赋值在第 20 个时间单位执行,并在第 26 个时间单位执行第 5 个赋值,以此类推。

过程性赋值

过程性赋值是在 initialalways 语句内的赋值,它只能对寄存器数据类型的变量赋值

过程性赋值分两类:

  1. 阻塞性过程赋值
  2. 非阻塞性过程赋值

阻塞性过程赋值

赋值操作符是 = 的过程赋值是阻塞性过程赋值。阻塞性过程赋值在其后所有语句执行前执行,即在下一语句执行前该赋值语句完成执行。

非阻塞性过程赋值

在非阻塞性过程赋值中,使用赋值符号 <=

在非阻塞性过程赋值中,对目标的赋值是非阻塞的(因为时延),但可预定在将来某个时间步发生(根据时延;如果是 0 时延,那么在当前时间步结束)。

beginLoad <= 32;RegA <= Load;RegB <= Store;
end

当非阻塞性过程赋值被执行时,计算右端表达式,右端值被赋于左端目标,并继续执行下一条语句。在上面的例子中,我们假设顺序语句块在时刻 10 执行。第一条语句促使 Load 在第 10 个时间单位结束时被赋值为 32;然后执行第 2 条语句, Load 的值不变(注意时间还没有前进,并且第 1 个赋值还没有被赋新值),RegA 的赋值被预定为在第 10 个时间步结束时。在所有的事件在第 10 个时间单位发生后,完成对左端目标的所有预定赋值。

下面是同时使用阻塞性和非阻塞性过程赋值的实例,注意它们的区别。

reg[0:2] Q_State;initial beginQ_state = 3'b011;Q_state <= 3'b100;$display("Current value of Q_State is %b", Q_State);#5;$display("The delayed value of Q_State is %b", Q_State);
end

执行 initial 语句产生如下结果:

Current value of Q_State is 011
The delayed value of Q_State is 100

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/189121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++11 语法/概念易错总结(1)

文章目录 缺省参数函数重载引用引用和指针内联宏的优缺点auto范围forNULL和nullptr 缺省参数 半缺省参数必须从右往左依次来给出&#xff0c;不能间隔着给 void Func(int a, int b 10, int c 20){cout<<"a "<<a<<endl;cout<<"b &…

一些ab命令

1.ab简介 ab是apache自带的压力测试工具&#xff0c;是apachebench命令的缩写。ab非常实用&#xff0c;它不仅可以对apache服务器进行网站访问压力测试&#xff0c;也可以对或其它类型的服务器如nginx、tomcat、IIS等进行压力测试。 ab的原理&#xff1a;ab命令会创建多个并发…

在编程中遇到的问题总结

IDEA空包粘黏问题 创建好目录以后会发现idea自动将空包合并在一起了&#xff0c;而且点击设置里面也没有Compact Middle Package Compact Middle Package如果不在设置的主面板上&#xff0c;则点击Tree Appearance&#xff0c;会发现Compact Middle Package在Tree Appearance里…

elupload base64

创作灵感也许就是这会儿还没有入睡吧&#xff0c;对接百度图片OCR功能&#xff0c;需要将图片转为BASE64上传调用百度的接口api&#xff0c;进行研究实现。页面如下&#xff0c;点击后选择图片文件后不是直接上传&#xff0c;而是获取图片的bytes数据&#xff01; <el-uploa…

516. 最长回文子序列

给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a; 输入&#xff1a;s "bbbab" 输出…

力扣117. 填充每个节点的下一个右侧节点指针 II

“递归” 思路&#xff1a; 基于节点&#xff0c;创建下一层&#xff08;L 1&#xff09;节点的 next 指针&#xff1a; 确定当前节点下一层节点 next 链表的起始节点&#xff0c;迭代到需要找非孩子的 next 节点时&#xff0c;根据其当层&#xff08;L&#xff09; next 链表…

IO / day01 作业。

1.使用fgets统计一个文件的行号 //使用fgets统计一个文件的行号#include <string.h> #include <stdlib.h> #include <stdio.h>int main(int argc, const char *argv[]) {if(argc<2) //获取文件名{printf("input error\n!");printf("usage…

将不同时间点的登录状态记录转化为不同时间段的相同登录状态SQL求解

题目 有不同时间点的登录状态记录表state_log如下 请使用sql将其转化为如下表的不同时间段的相同登录状态记录 思路分析&#xff1a; 此类问题需要用到lag或lead函数取上下行对应的数据&#xff0c;然后对前后结果做比较打标签&#xff08;0或1&#xff09;&#xff0c;再…

pycharm中绘制一个3D曲线

import numpy as np import matplotlib.pyplot as plt # 中文的设置 import matplotlib as mp1 from mpl_toolkits.mplot3d import Axes3D mp1.rcParams["font.sans-serif"] ["kaiti"] mp1.rcParams["axes.unicode_minus"] False # 数据创建 X…

基于SSM的经典电影推荐网站设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

从react到xflow

从react到xflow 注意&#xff1a;xflow 1.0版本已经停止维护&#xff0c;2.0版本目前没有任何文档&#xff0c;也不太推荐使用 0、学习目标 可以使用react框架构建出前端web页面&#xff0c;并且使用xflow插入流程图 1、为什么要使用react&#xff1f; 优点&#xff1a;使用…

解决VSCode按住Ctrl(or Command) 点击鼠标左键不跳转的问题(不能Go to Definition)

问题出现 往往在升级了VSCode以后&#xff0c;就会出现按住Ctrl&#xff08;or Command&#xff09; 点击鼠标左键不跳转的问题&#xff0c;这个问题很常见。 解决办法 1 进入VScode的首选项&#xff0c;选择设置 2 输入Go to definition&#xff0c;找到如下两个设置&#…

如何创建百科?建立百科词条的意义何在?九问百科营销

在营销工作实践中&#xff0c;小马识途营销顾问经常接到关于百科营销的咨询&#xff0c;现整理了最受关注的九个问题分享给热爱营销工作的小伙伴。 一、什么是百科营销&#xff1f; 百科营销是借助百科知识传播&#xff0c;可以将企业、品牌、人物所拥有的对用户有价值的信息&a…

【存储测试】fio存储性能测试工具

一、前言 GitHub地址&#xff1a;fio 官方文档&#xff1a;HOWTO 1、介绍 fio&#xff08;flexible I/O Tester&#xff09; 是一款由 Jens Axboe 开发的用于测评和压力/硬件验证的自由开源的软件&#xff0c;适用于文件及块接口性能测试。 fio常用的I/O引擎主要分为以下两种…

熬夜会秃头——beta冲刺Day3

这个作业属于哪个课程2301-计算机学院-软件工程社区-CSDN社区云这个作业要求在哪里团队作业—beta冲刺事后诸葛亮-CSDN社区这个作业的目标记录beta冲刺Day3团队名称熬夜会秃头团队置顶集合随笔链接熬夜会秃头——Beta冲刺置顶随笔-CSDN社区 目录 一、团队成员会议总结 1、成员…

【算法】单调栈题单——字典序最小⭐(一种类型的模板题)

文章目录 题目列表316. 去除重复字母⭐⭐⭐⭐⭐&#xff08;类型题模板&#xff1a;单调栈&#xff0c;字典序最小&#xff09;221021天池-03. 整理书架&#xff08;保留数量为 limit 的字典序最小&#xff09;402. 移掉 K 位数字&#xff08;最多删除 k 次 前导零的处理&…

springboot + vue 智能物流管理系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

『 Linux 』环境变量

文章目录 &#x1f680;什么是环境变量&#x1f680;&#x1f680;查看环境变量&#x1f680;&#x1f579;️和环境变量有关的命令&#x1f579;️ &#x1f680;PATH环境变量&#x1f680;&#x1f579;️设置PATH环境变量&#x1f579;️ &#x1f680;HOME环境变量&#x1…

三、C语言常见概念

目录 1. C语言是什么&#xff1f; 3. 编译器的选择 3.1 编译和链接 3.2 编译器的对比 6. main函数 7. printf 和 库函数 8. 关键字介绍 8.1 什么是预编译&#xff1f; 8.2 static 的关键词作用&#xff1f; 8.3 const 的作用 8.4 voliate 的作用 8.5 typedef 的作用…

Python---文件和文件夹操作

os模块 在Python中文件和文件夹的操作要借助os模块里面的相关功能&#xff0c;具体步骤如下&#xff1a; 第一步&#xff1a;导入os模块 import os 第二步&#xff1a;调用os模块中的相关方法 os.函数名() 与文件操作相关方法 编号函数功能1os.rename(目标文件名称&…