当前位置: 首页 > news >正文

【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语言的内存分配&#xff1a;BSS、Data、Text、Heap&#xff08;堆&#xff09;、Stack&#xff08;栈&#xff09;1、1、静态内存分配&#xff1a;BSS、Data1、2、程序执行代码&#xff1a;Text1、3、动态内存分配&#xff1a;Heap&#xff08;堆&#xff09;、St…...

看板组件:Bryntum Task Board JS 5.3.0 Crack

一个超级灵活的看板组件&#xff0c;Bryntum Task Board 是一个灵活的看板 Web 组件&#xff0c;可帮助您可视化和管理您的工作。 功能丰富 任务板非常灵活&#xff0c;允许您完全自定义卡片、列和泳道的渲染和样式。借助丰富的 API&#xff0c;您甚至可以在运行时打开或关闭功…...

45 个 Git 经典操作场景,专治不会合代码

git对于大家应该都不太陌生&#xff0c;熟练使用git已经成为程序员的一项基本技能&#xff0c;尽管在工作中有诸如 Sourcetree这样牛X的客户端工具&#xff0c;使得合并代码变的很方便。但找工作面试和一些需彰显个人实力的场景&#xff0c;仍然需要我们掌握足够多的git命令。下…...

MyBatis之动态SQL

目录 一、<if>标签 二、<trim>标签 三、<where>标签 四、<set>标签 五、<foreach>标签 一、<if>标签 当我们在某个平台提交某些信息时&#xff0c;可能都会遇到这样的问题&#xff0c;有些信息是必填信息&#xff0c;有些信息是非必…...

SpringBoot(Tedu)—DAY01——环境搭建

SpringBoot(Tedu)—DAY01——环境搭建 目录SpringBoot(Tedu)—DAY01——环境搭建零、今日目标一、IDEA2021项目环境搭建1.1 通过 ctrl鼠标滚轮 实现字体大小缩放1.2 自动提示设置 去除大小写匹配1.3 设置参数方法自动提示1.4 设定字符集 要求都使用UTF-8编码1.5 设置自动编译二…...

代理模式-大话设计模式

一、定义 代理模式的定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作用。 著名的代理模式例子为引用计数&#xff08;英语…...

STM32定时器的编码器接口模式

MCU为STM32L431&#xff0c;通用定时器框图&#xff1a; 编码器接口模式一共有三种&#xff0c;通过TIMx_SMCR寄存器的SMS[3:0]位来选择。模式1计数器仅在TI1FP1的边沿根据TI2FP2的电平来判断向上/下计数&#xff1b;模式2计数器仅在TI2FP2的边沿根据TI1FP1的电平来判断向上/下…...

Java方法的使用

目录 一、方法的概念及使用 1、什么是方法(method) 2、方法定义 3、方法调用的执行过程 4、实参和形参的关系 二、方法重载 1、为什么需要方法重载 2、方法重载概念 3、方法签名 三、递归 1、递归的概念 2、递归执行过程分析 一、方法的概念及使用 1、什么是方法(met…...

Linux命令·nl

nl命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号&#xff01;其默认的结果与 cat -n 有点不太一样&#xff0c; nl 可以将行号做比较多的显示设计&#xff0c;包括位数与是否自动补齐 0 等等的功能。 1&#xff0e;命令格式&#xff1a;nl [选项…...

排序模型:DIN、DINE、DSIN

目录 DIN 输入 输出&#xff1a; 与transformer注意力机制的区别与联系&#xff1a; DINE 改善DIN 输入&#xff1a; DSIN 动机&#xff1a; DIN 适用与精排&#xff0c;论文&#xff1a; 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命令&#xff0c;功能类似 cat &#xff0c;cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读&#xff0c;而最基本的指令就是按空白键&#xff08;space&#xff09;就往下一页显示&#xff0c;按 b 键就会往回&#xff08;back&…...

为什么 SaaS 公司依靠知识库来做对客户服务?

信不信由你&#xff0c;客户服务是您在软件行业赚钱的核心。不仅仅是拥有出色的产品&#xff0c;不仅仅是拥有出色的营销&#xff0c;更重要的是让人们回到您家门口的客户服务。 这是因为从长远来看&#xff0c;留住现有客户比获得新客户更重要&#xff0c;而留住客户时间更长的…...

后端必备之VUE基础【黑马程序员】

黑马程序员4小时入门VUE传送门 1. 简介 Vue是一个操作JavaScript的框架&#xff0c;类似于jQuery&#xff0c;但比jQuery好用&#xff0c;是现在的主流 2. 测试例子 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /&…...

现代HYUNDAI EDI需求分析

现代集团(HYUNDAI)是韩国一家以建筑、造船、汽车行业为主&#xff0c;兼营钢铁、机械、贸易、运输、水泥生产、冶金、金融、电子工业等几十个行业的综合性企业集团。本文主要介绍HYUNDAI 的EDI需求&#xff0c;带大家快速理清思路&#xff0c;明确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地址的映射关系&#xff0c;达到我们在xshell或其他远程连接设备上&#xff0c;不用IP地址登陆&#xff0c;只需要用主机名就能实现登陆的效果 配置 首先 需要查看自己虚拟机的IP地址&#xff0c;找到ens33或者ens160…...

Spring Cache简单介绍和使用

目录 一、简介 二、使用默认ConcurrentMapManager &#xff08;一&#xff09;创建数据库和表 &#xff08;二&#xff09;创建boot项目 &#xff08;三&#xff09;使用Api 1、EnableCaching 2、CachePut 3、cacheable 4、CacheEvict 三、使用redis作为cache 一、简…...

ECCV 2022|面向精确的主动相机定位算法

标题&#xff1a;ECCV 2022,山东大学、北大、腾讯AILab、斯坦福和三维家联合提出&#xff0c;面向精确的主动相机定位算法项目地址&#xff1a;https://github.com/qhFang/AccurateACL.文章&#xff1a;Towards Accurate Active Camera Localization&#xff08;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…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...