浅谈Verilog代码的执行顺序

verilog行为建模(五):条件语句 in的值赋给o1,但其每位赋值的强度及延迟可能不同。如果o1是一个标量(scalar)信号,则其延迟和前面的条件缓冲器上的门延迟相同。对向量线网(net)的赋值上的延迟情况不同。0赋值使用下降延迟,Z赋值使用关断延迟,所有其他赋值使用上升延迟。这种行为描述方式可以非常灵活的描述时钟,可以控制时钟的开始时间及周期占空比。while:只要表达式为真(不为0),则重复执行一条语句(或语句块)。上面的例子显示出持续赋值的灵活性和简单性。:赋值语句或空语句;:赋值语句或空语句; 阅读详情
AI摘要

本文围绕Verilog代码执行顺序展开,介绍了组合逻辑和时序逻辑的特点与执行情况,分析了阻塞赋值和非阻塞赋值的区别及使用场景,探讨了组合逻辑和时序逻辑中if语句、case语句的应用,还阐述了时序逻辑的清零及保持,以及组合逻辑中latch的产生、危害和避免方法。

一、组合逻辑和时序逻辑

         数字电路可以分成两大类,一类叫组合逻辑电路,另一类叫做时序逻辑电路。

        组合逻辑电路:由门电路组成,其某一时刻的输出状态只与该时刻的输入状态有关,而与电路原来的状态无关,并没有记忆功能。

        时序逻辑电路:由锁存器、触发器和寄存器等单元组成,其某一时刻的输出状态不仅与该时刻的输入状态有关,而且与电路原来的状态有关,具有记忆功能。

        而组合逻辑电路和时序逻辑在FPGA中并行执行这是毋庸置疑的,唯一不同的就是组合逻辑只要信号发生改变就随便改变,时序逻辑则需要随着时钟的上升沿或下降沿的到来而改变。

assign  result1 = a & b;

always @(*) begin
	if (~reset_n) begin
		result2 = 0;
	end
	else begin
		result2 = a & b;
	end
end

always @(posedge clk or negedge reset_n) begin
	if (~reset_n) begin
		result3 <= 0;
	end
	else begin
		result3 <= a & b;
	end
end

在第一个clk时reset_n低电平有效,因此result2和result3被置为0,而result1则因为assign语句被置为1;

在第一个clk结束后reset_n变为高电平,因此result2被置为1,result3则因为没有检测到clk上升沿仍被置为0;

在第二个clk结束后a从1变为0,此时组合逻辑的result1和result2随之变化,而时序逻辑result3则在第三个上升沿clk时被置为0。

二、阻塞赋值和非阻塞赋值

        阻塞赋值(=):在赋值时,先计算等号右手部分的值,再赋值给左边变量,直到该语句赋值完成,后面的语句才能执行,会阻塞后面的语句。

        非阻塞赋值(<=):执行赋值语句右边,然后将begin-end之间的所有赋值语句同时赋值到赋值语句的左边,但是左边的变量的值不会立即更新,直到always块所有语句执行完,才将左边变量的值更新。

always @(posedge clk or negedge reset_n) begin
	if (~reset_n) begin
			b <= 0;
			c <= 0;
		end
	else begin
		b <= a;
		c <= b;
	end
end 

always @(*) begin
	e = d;
	f = e;
end 

        可以简单这么理解:阻塞赋值时顺序执行,前一句执行完后才会执行后一句;非阻塞赋值时并行执行。

        这样也就很好解释了为什么什么是打拍。如下图仿真所示

非阻塞赋值:

在第一个clk时, reset_n为低电平有效,因此b、c被置为0;

在第二个clk时,执行赋值语句,因为是非阻塞赋值,将b的值置为a、将c的值置为b(注意此时b不等2,b的值仍为0),赋值结束后b=2、c=0

在第三个clk时,执行赋值语句,此时b=2,将c的值置为b,因此赋值结束后c=2

阻塞赋值:

先执行e=d,执行完毕后e=3;

再执行f=e,执行完毕后f=3。

         通过RTL图也可以理解,非阻塞赋值被综合成了两个D触发器,因此当一个clk到来时寄存器的值通过Q输出到c中,即b原来的0值,而a的值通过寄存器的D存进b里,;第二个clk到来时才会将b后来更新的值送到c寄存器。而阻塞赋值则被综合成了连线哈哈^_^

 针对阻塞赋值和非阻塞赋值的使用:

1、时序逻辑,使用非阻塞赋值;

2、锁存器建模,使用非阻塞赋值;

3、组合逻辑,使用阻塞赋值;

【verilog】在同一个 always 块中写了多个“看起来独立”的 if / if-else,到底谁先谁后,怎么执行?会不会冲突? 情况行为说明多个 if 控制不同变量并行谁条件满足谁执行,互不干扰多个 if 控制同一个变量顺序后面赋值覆盖前面if/else + case 控制同一变量顺序+可能冲突后面的 case 会覆盖前面 if 的赋值插入打拍语句合法不影响并行结构,但要注意覆盖风险多个嵌套 if按照语句顺序但并不表示电路是串行运行,是条件表达上的判断顺序。 阅读详情

相关推荐

Verilog中begin···end语句执行顺序,阻塞赋值与非阻塞赋值,always和assign,wire和reg

Verilog中分阻塞赋值和非阻塞赋值两种,组合逻辑多用阻塞赋值,此时使用begin···end语句,将一条执行完再执行下一句,即顺序执行。 而时序逻辑多是并行执行,多用非阻塞赋值,begin···end语句的作用只是相当于函数的花括号,将一段语句划分成块,但是在块里语句依然是并行执行的,在一个模块完成时会同时执行,所以在非阻塞赋值中begin···end语句并非顺序执行的。 ...

lxm920714的专栏 4779

【转载】浅谈阻塞和非阻塞语句的本质区别

阻塞和非阻塞语句作为verilog HDL语言的最大难点之一,一直困扰着FPGA设计者,即使是一个颇富经验的设计工程师,也很容易在这个点上犯下一些不必要的错误。阻塞和非阻塞可以说是血脉相连,但是又有着本质的差别。理解不清或运用不当,都往往会导致设计工程达不到预期的效果,而其中的错误又很隐晦。下面我给大家谈谈阻塞和非阻塞语句的本质区别和在FPGA设计中的不同运用。   阻塞语句   顾名思义,即

博乐Bar 2219

GAMES101:MacOS作业环境搭建

查看gcc/clang的位置产看gcc/clang的版本1.1.2 安装cmake。

weixin_38844255的博客 715

【阿里云大模型高级工程师ACP习题集】2.1 用大模型构建新人答疑机器人

【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配!

davidkorhenn的博客 2606

高通IPA硬件加速介绍

‌ 高通IPA (Internet Protocol Accelerator)模块是一种硬件加速模块,由高通公司(Qualcomm)提供,主要用于优化移动设备上的网络数据传输,特别是通过 LTE 、 5G 等移动网络的数据传输‌‌。IPA模块通过硬件加速,显著提高了数据传输的速度和效率,同时降低了设备的功耗,并提供了更稳定的网络连接,减少了数据传输中的丢包和延迟‌。

四儿家的小祖宗的博客 1622

基于深度学习的行人车辆检测与计数系统(UI界面+YOLOv8/v7/v6/v5代码+训练数据集)

从YOLOv1到最新的YOLOv8,其网络结构、训练策略和损失函数不断优化,性能持续提升。image_path, _ = QFileDialog.getOpenFileName(self, "选择图片文件", "", "Image Files (*.jpg *.png *.jpeg *.bmp)")video_path, _ = QFileDialog.getOpenFileName(self, "选择视频文件", "", "Video Files (*.mp4 *.avi *.mov *.mkv)")

YOLO 225

【学习系列】SAP RAP 18:Unmanaged场景开发示例-基本数据更新

本文介绍了在SAP RAP中unmanaged模式下从0到1的开发步骤。unmanaged模式下需要自行实现数据更新、权限检查等逻辑,适用于操作现有数据库表或复杂业务场景。文章以两层的采购订单对象为例,详细说明了创建技术对象(表、视图、行为定义等)的过程,并重点阐述了如何实现CRUD相关方法的核心逻辑。通过创建缓冲类来处理交互阶段和保存阶段的数据操作,确保事务一致性。完整代码展示了抬头层级的增删改查功能实现,为后续明细层级的开发奠定了基础。

DeveloperMrMeng的博客 637

减法平均优化器(SABO)算法详解:从数学原理到工程应用

减法平均优化器(SABO)是一种基于数学概念的新型元启发式优化算法,由Trojanovský和Dehghani于2023年提出。该算法通过v-减法运算和平均值计算实现搜索优化,核心创新是采用目标函数值差异符号引导搜索方向。SABO具有参数少、结构简单、收敛快等特点,在高维复杂问题中表现优异。算法通过种群平均值保持多样性,利用符号函数确保搜索方向改进,自然平衡探索与开发。MATLAB实现显示其计算复杂度为O(N²·D),与主流群体智能算法相当。SABO不依赖生物或物理隐喻,数学基础坚实,在工程优化和机器学习领

qq_42212808的博客 164

5实践报告撰写

一 项目流程 明确标准 确定分析目标 寻找分析数据 清洗数据 描述性分析 诊断性分析 提出建议 撰写报告 二 确定分析目标 什么是你感兴趣的? 什么是你熟悉的? 什么是你擅长的? 1 电商零售行业 商品销量分析 价格分析 评价分析 ...... 2 自媒体行业 广告投放力度分析 广告投放回报分析 不同类型的产品分析 ...... 3 金融行业 股票价格分析 信贷业务违约分析 客户画像分析 ...... ...

waywardG的博客 2830

C# 的 Dapper 库高级进阶:刨根问底的深度解析

通过今天的探索,我们了解了 Dapper 的一些高级功能,包括如何处理复杂的查询、执行批量操作以及如何优化性能。希望这篇深入浅出的文章能帮助你在实际项目中更好地运用 Dapper!🎈好了,小伙伴们,今天的分享就到这里啦!如果你有任何疑问或者想要分享自己的经验,请在评论区留言。我们下次再见!👋上述示例代码仅供参考,实际使用时请根据项目需求进行适当调整。✨Dapper 官方文档Dapper 性能优化指南Dapper 动态参数使用来同时执行多个查询。利用Execute和Query方法来简化 SQL 调用。

java专栏 812

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: FPGA时序分析与时序约束(二)——时钟约束
下一篇: FPGA时序分析与时序约束(三)——I/O接口约束
STATEABC
博客等级 码龄6年 537粉丝 127原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值