【System Verilog基础】automatic自动存储--用堆栈区存储局部变量
文章目录
- 一、C语言的内存分配:BSS、Data、Text、Heap(堆)、Stack(栈)
- 1、1、静态内存分配:BSS、Data
- 1、2、程序执行代码:Text
- 1、3、动态内存分配:Heap(堆)、Stack(栈)
- 1、4、示例
- 二、Verilog内存分配:静态分配、automatic自动存储
- 三、System Verilog内存分配:静态分配、automatic自动存储
- 3、1、举一个栗子
一、C语言的内存分配:BSS、Data、Text、Heap(堆)、Stack(栈)
- 1、静态存储:在变量定义时就分配了固定的内存地址与内存大小并一直保持不变,直至整个程序结束;
- 2、动态存储:由程序控制,运行时才分配内存和地址,且每次分配到的内存和地址不固定
1、1、静态内存分配:BSS、Data
- 1、
BSS段(Bss Segment):存放程序中未初始化的全局变量,属于静态内存分配 - 2、
Data段(Data Segement):存放已初始化的全局变量和static声明的局部变量,属于静态内存分配
1、2、程序执行代码:Text
Text段(Text Segment):通常是指用来存放程序执行代码的一块内存区域,这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
1、3、动态内存分配:Heap(堆)、Stack(栈)
- 1、
Heap(堆):存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减- ①、
堆扩张:进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上 - ②、
堆缩减:利用free等函数释放内存时,被释放的内存从堆中被剔除
- ①、
- 2、
Stack(栈):存放程序临时创建的局部变量(static声明的局部变量除外)、函数的参数值、返回值等栈具有:**先进后出(FILO)**的特点,栈特别方便用来保存/恢复调用现场栈由系统自动分配内存,速度较快
1、4、示例
- 一个程序本质上都是由 Bss段、Data段、Text段三个组成的。
//main.cpp
int a = 0; //data段
int a = 0; //data段
char *p1; //bss段
main() {int b; //局部变量,存放在栈中char s[] = "abc"; //局部变量,存放在栈中char *p2; //局部变量,存放在栈中char *p3 = "123456"; //123456\0在常量区,p3在栈上static int c = 0; //静态变量,data段//分配得来得10和20字节的区域就在堆区。p1 = (char *)malloc(10);p2 = (char *)malloc(20);strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
二、Verilog内存分配:静态分配、automatic自动存储
-
1、在出现automatic之前,Verilog的所有对象都是静态分配的
- 局部变量共用一块内存,会导致不同线程之间窜用局部变量的情况
- 不能对任务或函数进行多次调用
-
2、之后,可以指定任务、函数和模块使用automatic自动存储,迫使仿真器使用堆栈区存储局部变量
- 这意味着每次调用同一个任务时,都会为其中的变量分配不同的内存和地址
-
3、示例:
function int auto_static_cnt(input a);int cnt = 0; //cnt为静态存储,虽然函数调用了两次,但每次的cnt都是同一个内存cnt += a;return cnt;endfunction$display("@1 auto_static_cnt = %0d", auto_static_cnt(1)); $display("@2 auto_static_cnt = %0d", auto_static_cnt(1));//结果:虽然函数调用了两次,但每次的cnt都是同一个内存
# @1 auto_static_cnt = 1
# @2 auto_static_cnt = 2
function automatic int auto_cnt(input a);int cnt = 0; //定义为automatic后,cnt默认为automaticcnt += a;return cnt;endfunction$display("@1 auto_cnt = %0d", auto_cnt(1));$display("@2 auto_cnt = %0d", auto_cnt(1));//结果:函数调用了两次,两次的cnt分配不同的内存
# @1 auto_cnt = 1
# @2 auto_cnt = 1
三、System Verilog内存分配:静态分配、automatic自动存储
- 1、在System Verilog中,默认也是静态存储
- 注意!!!!!
类class中定义的任务和函数是自动automatic的 - 如果一个程序是静态的,那么所有的子程序只能共享一个内存空间,子程序的每次执行都会覆盖之前子程序运行产生的结果
- 注意!!!!!
- 2、如果要使用自动存储,则必须加入
automatic关键字 - 3、如何将任务和函数声明为automatic类型?
- 显式声明:使用关键字automatic作为任务和函数声明的一部分;
function automatic int auto_cnt(input a);int cnt = 0; //定义为automatic后,cnt默认为automaticcnt += a;return cnt;endfunction$display("@1 auto_cnt = %0d", auto_cnt(1));$display("@2 auto_cnt = %0d", auto_cnt(1));//结果:函数调用了两次,两次的cnt分配不同的内存
# @1 auto_cnt = 1
# @2 auto_cnt = 1
- 隐式声明:通过将任务和函数定义在被定义为automatic类型的module, interface, program, or package中;
program automatic test; //将program 声明为automatic类型function int auto_cnt(input a);int cnt = 0; //定义为automatic后,cnt默认为automaticcnt += a;return cnt;endfunction$display("@1 auto_cnt = %0d", auto_cnt(1));$display("@2 auto_cnt = %0d", auto_cnt(1));...
endprogram//结果:函数调用了两次,两次的cnt分配不同的内存
# @1 auto_cnt = 1
# @2 auto_cnt = 1
- 4、建议将program声明为automatic类型!!!!这样其内部的任务和函数等将自动为automatic类型
3、1、举一个栗子
- 1、automatic 加在 program 后:
program automatic test;initial begin$display("***start time is %0d", $time); for(int i=0; i<16; i++) beginsend(i);end$display("***end time is %0d", $time);
endtask send(int j);forkbegin$display("***Driving port %0d", j);#1;$display("***After #1 ");endjoin_none
endtaskendprogram
- 运行结果:
***start time is 0
***end time is 0
***Driving port 0
***Driving port 1
***Driving port 2
***Driving port 3
***Driving port 4
***Driving port 5
***Driving port 6
***Driving port 7
***Driving port 8
***Driving port 9
***Driving port 10
***Driving port 11
***Driving port 12
***Driving port 13
***Driving port 14
***Driving port 15
- 2、不加automatic:
program test;initial begin$display("***start time is %0d", $time); for(int i=0; i<16; i++) beginsend(i);end$display("***end time is %0d", $time);
endtask send(int j);forkbegin$display("***Driving port %0d", j);#1;$display("***After #1 ");endjoin_none
endtaskendprogram
- 结果:
***start time is 0
***end time is 0
***Driving port 15
***Driving port 15
***Driving port 15
***Driving port 15
***Driving port 15
***Driving port 15
***Driving port 15
***Driving port 15
***Driving port 15
***Driving port 15
***Driving port 15
***Driving port 15
***Driving port 15
***Driving port 15
***Driving port 15
***Driving port 15相关文章:
【System Verilog基础】automatic自动存储--用堆栈区存储局部变量
文章目录一、C语言的内存分配:BSS、Data、Text、Heap(堆)、Stack(栈)1、1、静态内存分配:BSS、Data1、2、程序执行代码:Text1、3、动态内存分配:Heap(堆)、St…...
看板组件:Bryntum Task Board JS 5.3.0 Crack
一个超级灵活的看板组件,Bryntum Task Board 是一个灵活的看板 Web 组件,可帮助您可视化和管理您的工作。 功能丰富 任务板非常灵活,允许您完全自定义卡片、列和泳道的渲染和样式。借助丰富的 API,您甚至可以在运行时打开或关闭功…...
45 个 Git 经典操作场景,专治不会合代码
git对于大家应该都不太陌生,熟练使用git已经成为程序员的一项基本技能,尽管在工作中有诸如 Sourcetree这样牛X的客户端工具,使得合并代码变的很方便。但找工作面试和一些需彰显个人实力的场景,仍然需要我们掌握足够多的git命令。下…...
MyBatis之动态SQL
目录 一、<if>标签 二、<trim>标签 三、<where>标签 四、<set>标签 五、<foreach>标签 一、<if>标签 当我们在某个平台提交某些信息时,可能都会遇到这样的问题,有些信息是必填信息,有些信息是非必…...
SpringBoot(Tedu)—DAY01——环境搭建
SpringBoot(Tedu)—DAY01——环境搭建 目录SpringBoot(Tedu)—DAY01——环境搭建零、今日目标一、IDEA2021项目环境搭建1.1 通过 ctrl鼠标滚轮 实现字体大小缩放1.2 自动提示设置 去除大小写匹配1.3 设置参数方法自动提示1.4 设定字符集 要求都使用UTF-8编码1.5 设置自动编译二…...
代理模式-大话设计模式
一、定义 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 著名的代理模式例子为引用计数(英语…...
STM32定时器的编码器接口模式
MCU为STM32L431,通用定时器框图: 编码器接口模式一共有三种,通过TIMx_SMCR寄存器的SMS[3:0]位来选择。模式1计数器仅在TI1FP1的边沿根据TI2FP2的电平来判断向上/下计数;模式2计数器仅在TI2FP2的边沿根据TI1FP1的电平来判断向上/下…...
Java方法的使用
目录 一、方法的概念及使用 1、什么是方法(method) 2、方法定义 3、方法调用的执行过程 4、实参和形参的关系 二、方法重载 1、为什么需要方法重载 2、方法重载概念 3、方法签名 三、递归 1、递归的概念 2、递归执行过程分析 一、方法的概念及使用 1、什么是方法(met…...
Linux命令·nl
nl命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。 1.命令格式:nl [选项…...
排序模型:DIN、DINE、DSIN
目录 DIN 输入 输出: 与transformer注意力机制的区别与联系: DINE 改善DIN 输入: DSIN 动机: DIN 适用与精排,论文: Deep Interest Network for Click-Through Rate Prediction DIN模型提出的动…...
【C++】Clang-Format:代码自动格式化(看这一篇就够了)
文章目录Clang-format格式化C代码1.引言&安装1.1引言1.2 安装2. 配置字解释2.1 language 编程语言2.2 BaseOnStyle 基础风格2.3 AccessModifierOffset 访问性修饰符偏移2.4 AlignAfterOpenBracket 开括号后的对齐2.5 AlignArrayOfStructures 对齐结构体数组2.6 AlignConsec…...
Linux命令·more
more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back&…...
为什么 SaaS 公司依靠知识库来做对客户服务?
信不信由你,客户服务是您在软件行业赚钱的核心。不仅仅是拥有出色的产品,不仅仅是拥有出色的营销,更重要的是让人们回到您家门口的客户服务。 这是因为从长远来看,留住现有客户比获得新客户更重要,而留住客户时间更长的…...
后端必备之VUE基础【黑马程序员】
黑马程序员4小时入门VUE传送门 1. 简介 Vue是一个操作JavaScript的框架,类似于jQuery,但比jQuery好用,是现在的主流 2. 测试例子 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /&…...
现代HYUNDAI EDI需求分析
现代集团(HYUNDAI)是韩国一家以建筑、造船、汽车行业为主,兼营钢铁、机械、贸易、运输、水泥生产、冶金、金融、电子工业等几十个行业的综合性企业集团。本文主要介绍HYUNDAI 的EDI需求,带大家快速理清思路,明确EDI项目的推进流程。 通信标准…...
数据库基本功之SQL的基本函数
1. 单行函数与多行函数 1.1 单行函数 指单行数据输入,返回一个值的函数. 所以查询一个表时,对选择的每一行数据都返回一个结果.[oracleoracle-db-19c ~]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Tue Mar 7 07:59:44 2023 Version 19.3.0.0.0Copyri…...
配置主机名与ip的映射关系
本次进行简单的小实验 通过在windows上配置主机名与IP地址的映射关系,达到我们在xshell或其他远程连接设备上,不用IP地址登陆,只需要用主机名就能实现登陆的效果 配置 首先 需要查看自己虚拟机的IP地址,找到ens33或者ens160…...
Spring Cache简单介绍和使用
目录 一、简介 二、使用默认ConcurrentMapManager (一)创建数据库和表 (二)创建boot项目 (三)使用Api 1、EnableCaching 2、CachePut 3、cacheable 4、CacheEvict 三、使用redis作为cache 一、简…...
ECCV 2022|面向精确的主动相机定位算法
标题:ECCV 2022,山东大学、北大、腾讯AILab、斯坦福和三维家联合提出,面向精确的主动相机定位算法项目地址:https://github.com/qhFang/AccurateACL.文章:Towards Accurate Active Camera Localization(ECCV 2022&…...
web实现环形旋转、圆形、弧形、querySelectorAll、querySelector、clientWidth、sin、cos、PI
文章目录1、HTML部分2、css部分3、JavaScript部分4、微信小程序演示1、HTML部分 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">&l…...
M1芯片Mac上使用ctr推送镜像报错?教你一招搞定content digest not found问题
M1芯片Mac用户必看:彻底解决ctr推送镜像的content digest报错 最近有不少M1芯片的Mac用户反馈,在使用ctr工具推送镜像到本地仓库时,频繁遇到"content digest sha256:xxx not found"的错误提示。这个问题看似简单,实则涉…...
2153、51单片机电压电流功率及功率因数等多参数电能表电流超过阈值自动断电
具体详情请点击下面观看: 2153、51单片机电压电流功率及功率因数等多参数电能表电流超过_单片机测功率因数-CSDN博客 演示操作视频讲解请点击下面观看: https://v.douyin.com/ZojaSHzxCtc...
TensorFlow-v2.15镜像实战分享:通过按需计费模式,有效控制AI项目成本
TensorFlow-v2.15镜像实战分享:通过按需计费模式,有效控制AI项目成本 在AI项目开发中,GPU资源的高昂成本常常成为团队预算的"黑洞"。传统做法是长期租用高性能GPU服务器,但实际使用率往往不足30%。本文将分享我们如何利…...
Phi-3-Mini-128K实战:算法学习助手——动态规划与贪心算法解析
Phi-3-Mini-128K实战:算法学习助手——动态规划与贪心算法解析 最近在琢磨算法,尤其是动态规划和贪心算法,总觉得它们像一对性格迥异的兄弟,一个深思熟虑,一个当机立断。自己看书、看视频,有时候还是卡在“…...
最新超详细PycharmIDE安装配置完整版教程(详细步骤)
包含编程资料、学习路线图、源代码、软件安装包等!【[[点击这里]]】! PyCharm是目前最流行、使用最广泛的Python IDE(Integrated Development Environment,集成开发环境),带有一整套可以帮助用户在使用Pyth…...
SpringDataRedis Stream监听框架在Redis重启后消息丢失的深度解析与解决方案
1. Redis Stream监听失效问题现象解析 最近在项目中使用Redis Stream作为消息队列时,遇到一个典型问题:当Redis服务重启后,原本正常工作的消息监听器突然"罢工"了。具体表现为生产者可以正常发送消息到Stream,但消费者却…...
通过MATLAB和Carsim进行联合仿真,利用强化学习实现自动驾驶人机控制权策略的详细步骤和示例代码
以下是一个通过MATLAB和Carsim进行联合仿真,利用强化学习实现自动驾驶人机控制权策略的详细步骤和示例代码: 步骤概述 Carsim配置:对Carsim进行必要的设置,包括车辆模型、道路场景等,并生成S - function接口。 MATLAB环境搭建:在MATLAB中配置Carsim的S - function,并创…...
ni命令重构指南:如何改进现有ni功能并提升开发者体验
ni命令重构指南:如何改进现有ni功能并提升开发者体验 【免费下载链接】ni 💡 Use the right package manager 项目地址: https://gitcode.com/gh_mirrors/ni1/ni ni是一个智能包管理器切换工具,能够自动检测项目使用的包管理器&#x…...
如何快速掌握MTKClient:联发科设备刷机与调试终极指南
如何快速掌握MTKClient:联发科设备刷机与调试终极指南 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient MTKClient是一款功能强大的开源联发科设备调试工具,专为Andro…...
【物联网实践指南】温度传感模块的智能控制与应用
1. 温度传感模块的核心原理 温度传感模块是物联网系统中感知环境的关键"触角"。想象一下,当你走进一个智能温室,系统能自动调节到最适合植物生长的温度,这背后就是温度传感器在默默工作。这类传感器主要分为接触式和非接触式两大类…...
