Always语句和assign的用法

2024-06-04 22:52
文章标签 用法 语句 always assign

本文主要是介绍Always语句和assign的用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Always语句

简介

always语句块从仿真0时刻开始执行其中的行为语句;最后一条执行完成后,再开始执行其中的第一条语句,如此往复循环,直到整个仿真结束。因此,always语句块常用于对数字电路中一组反复执行的活动进行建模。

应用场景

always块是Verilog中用来描述组合逻辑以及时序逻辑的语法。

在这上面的语法小节中也说过了。

需要补充的是一个设计中可以有多个always块,或者说一定有很多个always块。

这些硬件块都是相互独立同时工作的。每个块之间的连接是决定数据流的原因。为了模拟这种行为,一个always块被做成一个连续的过程(硬件不可能断断续续工作),当敏感列表中的一个信号变化时,它就会被触发并执行一些动作(always块内的语句)

语法简介

always 和 always@(*) 的区别

有@时,是每次执行语句时,必须满足括号内的条件才能继续执行语句,否则不执行。

always@(敏感事件列表) 用于描述时序逻辑;

敏感事件(上升沿 posedge、下降沿 negedge);always @ (posedge clk)

或电平。Always@(a)

verilog规定,always@()中的是指该always块内的所有输入信号的变化为敏感列表,也就是仿真时只有当always@(*)块内的输入信号产生变化,该块内描述的信号才会产生变化。

若没有@,则是一般在testbench 中产生时钟信号,指不会满足特定的条件,执行完一次后立马继续执行下一次,一直重复执行。always #5 CLK=~CLK;

有@时,是每次执行语句时,必须满足括号内的条件才能继续执行语句,否则不执行

always@()语句的意思是always模块中的任何一个输入信号或电平发生变化时,

该语句下方的模块将被执行。
1、always语句有两种触发方式。第一种是电平触发,例如always @(a or b or c),a、b、c均为变量,当其中一个发生变化时,下方的语句将被执行。
2、第二种是沿触发,例如always @(posedge clk or negedge rstn),即当时钟处在上升沿或下降沿时,语句被执行。
3、而对于always@(),意思是以上两种触发方式都包含在内,任意一种发生变化都会触发该语句。

敏感列表: 触发always块内部语句的条件。

只有一条语句,不需要使用begin -end;第二种是有多条语法,需要使用begin end包裹起来。推荐全部都用begin end包裹起来,这样形式比较固定,比较方面阅读以及形成固定风格。

Assigin语句

简介:

assign相当于一条连线,将表达式右边的电路直接通过wire(线)连接到左边,左边信号必须是wire型。当右边变化了左边立马变化,方便用来描述简单的组合逻辑

应用场景:

wire类型或类似于wire数据类型的信号需要连续赋值。类比用于连接面包板上零件的电线。只要+5V电池施加在导线的一端,连接到导线另一端的部件就会获得所需的电压。

在Verilog中,这个概念是通过assign语句实现的,其中任何或其他类似的wire数据类型都可以用一个值连续驱动。该值可以是常数,也可以是由一组信号组成的表达式。

使用规则:

LHS(左值) 应该始终是wire类型的标量或向量网络, 或者标量或矢量网络的串联, 而绝对不能是reg类型的标量或矢量寄存器。(这是扩展一个知识点:

Reg与wire的区别,wire用于连续赋值语句,而reg用于过程赋值语句,reg会保持上一次赋值,而wire在持续不断的改变,在电路理解上来说,wire相当于一根导线,而reg,则相当于在wire中间加了一个寄存器,有条件的赋值,这就需要根据敏感信号来判定)

RHS 可以包含标量或向量寄存器以及函数调用。

只要 RHS 上的任何操作数的值发生变化, LHS 就会使用新值进行更新。

assign 语句也称为连续赋值, 并且始终处于活动状态。

这篇关于Always语句和assign的用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031357

相关文章

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问