【SpinalHDL】Windows10系统搭建SpinalHDL 开发环境

2023-10-28

本文主要记载如何从零开始在win平台搭建SpinalHDL开发环境并跑通第一个spinal project demo。

1、环境准备

1.1 软件下载

首先列出需要安装的软件,并逐一对这些软件的功能和其必要性进行说明.

需要安装的软件:IDEA、JDK17、Scala2.12.15、Sbt1.5.5、msys2(verilator)、gtkwave。

各软件说明:首先spinal并不能说是一种编程语言,它只是scala 的一个库,所以我们实际上是在用scala进行开发,scala需要用到JVM,所以需要安装JDK。此外,在win平台开发一个好用的IDE是必要的,IDEA就是这么一个软件,它提供了scala的开发环境。当然仅仅有IDEA是不够的,还需要安装scala插件(在IDEA中装),然后还需要安装scala和sbt,我都是用的.msi独立安装的,sbt是用来构建scala工程的。

上面说的那些软件已经足以建立一个scala工程,至于verilator和gtkwave是为了仿真用的,注意verilator只能对verilog进行仿真,如果是VHDL使用GHDL,具体可以spinal官方DOC

安装verilator要使用msys2进行安装,同时还有一些其他的package需要安装,gtkwave只是一个波形查看工具,安装也非常简单。

IDEA下载网址:https://www.jetbrains.com/zh-cn/idea/

JDK17下载网址:https://www.oracle.com/cn/java/technologies/downloads/#jdk17-windows

Scala下载网址:https://www.scala-lang.org/download/2.12.15.html

sbt下载网址:https://www.scala-sbt.org/download.html

msys2下载网址:https://www.msys2.org/

gtkwave:https://sourceforge.net/projects/gtkwave/

开始安装之前,不妨对所有文件的安装路径做个统一管理,D盘新建SpinalHDL文件夹,后面所有的软件均安装到此路径下。

1.2 安装参考

  1. SpinalHDL环境搭建

  1. 基于Windows系统的SpinalHDL开发环境搭建

  1. 2021 最新版 JDK 17 下载与安装 步骤演示 (图示版)

  1. SpinalHDL-sim Verilator Windows安装问题

  1. Windows福音——解决仿真工具安装问题

  1. SpinalHDL从建立工程到查看仿真波形

  1. SpinalHDL 开发环境 Windows 安装

2、软件安装

2.1 IntelliJ IDEA安装

修改安装路径

安装IDEA过程中可以勾选加入环境变量

安装成功

IDEA安装好之后需要安装scala插件,我使用的是离线安装的方式,将插件下载下来,放到D:\SpinalHDL\IntelliJ IDEA Community Edition 2021.2.3\plugins路径下,然后再IDEA里加载一下就可以了。这个路径就是IDEA安装路径,注意一定要放在...\plugins文件夹下。

scala插件下载地址

切到versions页,下拉选择2021.2.12,下载!

下载后的文件名为“scala-intellij-bin-2021.2.12.zip”,将压缩包放到IDEA的安装路径下的...\plugins文件夹下,然后再IDEA里添加激活scala即可。

IDEA内部插件安装如下:

2.2 JDK安装

直接到官网下载安装包JDK官网下载,下软ORACLE软件需要提前注册账号。

JDK的安装没什么好说的,安装完需要配置环境变量

  • 新建系统变量 变量名:JAVA_HOME 变量值: D:\SpinalHDL\JAVA\jdk-17变量值就是你的安装路径

  • 新建系统变量 变量名:JRE_HOME 变量值: D:\SpinalHDL\JAVA\jdk-17变量值就是你的安装路径

  • 新建系统变量 变量名:CLASSPATH 变量值: .;%JAVA_HOME%\lib;

  • 在系统变量path的 值里面添加%JAVA_HOME%\bin%JRE_HOME%\jre\bin

2.3 Scala安装

直接到官网下载安装包Scala下载地址

点击安装msi文件

修改安装路径

安装完之后同样需要添加环境变量

  • 新建系统变量 变量名:SCALA_HOME 变量值: D:\SpinalHDL\scala变量值就是你的安装路径

  • 在系统变量path的 值里面添加%SCALA_HOME%\bin,即安装路径的bin文件夹

环境变量设置好保存退出后,可以命令行敲 scala 回车后会出现提示信息,包括scala版本以及一些其他信息

命令行启动方式:win+R 输入cmd 回车

2.4 Sbt安装

直接到官网下载安装包Sbt下载地址

修改路径

安装完之后同样需要添加环境变量

  • 在系统变量path的 值里面添加D:\SpinalHDL\sbt\bin,即安装路径的bin文件夹

sbt安装好应该也可以在命令行方式验证下

sbt切换国内镜像

安装完后面需要用sbt构建spinal依赖库,默认是国外的源,过程实在是太慢了,而且还有可能失败,所以最好是切换成国内的源。

  • 切换方法:

找到sbt安装目录下conf文件夹下sbtconfig.txt,增加下面两行代码

-Dsbt.global.base=C:/Sbt/.sbt
-Dsbt.repository.config=C:/Sbt/properties

在安装目录的.sbt文件夹下新建properties文件(注意没有后缀),打开文件添加代码

[repositories]
  local
  aliyun: http://maven.aliyun.com/nexus/content/groups/public/
  central: http://repo1.maven.org/maven2/

这里安装目录下可能并没有.sbt文件夹,新建一个即可,我是直接放在安装目录(D:\SpinalHDL\sbt\)下的,以上方法是网上找来的,这里附上链接sbt配置国内镜像

【SBT】getting org.scala-sbt sbt 1.8.2 (this may take some time)...问题解决

仿真注意事项

接下来得2.5和2.6小节是仿真环境的安装,用verilator进行仿真,然后用Gtkwave查看波形文件,但是我在安装完之后使用一个例子测试的时候仿真总是跑不过去,尝试了很多方法,比如重装msys2和verilator,环境变量清理等等,但是都没有效果,最终发现是安装的iverilog和verilator存在冲突,本来想着iverilog自带Gtkwave,所以就安装了iverilog,但是由于我平时并不适用vhdl,所以安装verilator和Gtkwave就足够了,所以卸载iverilog之后仿真就能跑通了。至于Gtkwave只需要独立安装就行了。

后面3.2小节部分也会放出没解决时的具体报错截图,避免踩坑!

2.5 msys2 安装

直接到官网下载安装包msys2下载地址

安装步骤

修改路径(经验:尽量把msys2安装在C盘)

安装完添加环境变量

  • 在系统变量path里面添加C:\SpinalHDL\msys64\usr\bin;C:\SpinalHDL\msys64\mingw64\bin

2.6 verilator

msys2安装好之后就是verilator的安装了,这里官方文档给出了具体需要安装的指令,我这里给出详细安装过程

启动msys2之后,先输入pacman -Syuu,然后问你是否安装,敲 Y 确认安装,安装完之后会关掉终端,输入Y确认关闭

然后再次启动msys2,按照指令安装,整个安装过程如下

pacman -Syuu
Y
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
//gcc
Y
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
//make
Y
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
//git
Y
pacman -S mingw-w64-x86_64-verilator
Y

总结下来整个过程就是:安装Syuu,确认安装,安装flex,确认安装,安装make,确认安装,安装git,确认安装,安装verilator,确认安装。

2.7 gtkwave安装

直接到官网下载安装包gtkwave安装地址,软件包下载中间出现了输入用户名及密码场景,我这里是忽略重新下载就可以了,可以多下载几次。

gtkwave下载后直接解压到D:\SpinalHDL\ 路径下就行了,然后将bin文件夹下的gtkwave.exe文件发送到桌面快捷方式就行。

3、demo开发

3.1 新建工程

  • 准备好自己的工作空间(自己指定)新建scala工程均放在此路径下

比如我的F:\Spinal\下,以便后面查看,复制一些源文件和波形文件

  • 新建工程

打开IDEA,新建工程,完全没有IDEA使用经验的可以一步步跟着来。

3.2 环境准备

打开build.sbt文件和build.properties文件,.sbt文件新建工程里面只有前三行,然后改成和图中一致。

name := "test"
ThisBuild / version := "1.0"
ThisBuild / scalaVersion := "2.12.15"

val spinalVersion = "1.6.0"
val spinalCore = "com.github.spinalhdl" %% "spinalhdl-core" % spinalVersion
val spinalLib = "com.github.spinalhdl" %% "spinalhdl-lib" % spinalVersion
val spinalIdslPlugin = compilerPlugin("com.github.spinalhdl" %% "spinalhdl-idsl-plugin" % spinalVersion)

lazy val mylib = (project in file("."))
  .settings(
    name := "SpinalTemplateSbt",
    libraryDependencies ++= Seq(spinalCore, spinalLib, spinalIdslPlugin)
  )

fork := true

接下来就是编译sbt关联spinal的库了,具体步骤就是选中build.sbt,右键选件build module test,如果之前编译过出错了,在build窗口点击下那个循环图标Reload sbt project就行了,这个过程需要等待一段时间,如果通不过的话试试换国内的镜像看。

完成之后可以从External Libraries这里看到spinal库都已经关联进来了,之前这里是没有的。

3.3 新建文件

接下来就可以真正建立我们的spinal project了,新建一个package,在package中新建scala 文件,当然你也可以不建package直接新建scala文件,新建package的话比较方便不同rtl设计的文件管理

然后把在test_top1.scala文件中就可以开始你的spinal设计了,为了快速跑通整个开发流程,我们先把这段代码复制进去。

3.4 代码开发

注意这段代码实际上是一个计数器,我的设计文件名(test_top1)和module名(Counter)没有统一,只是为了演示这个过程而已

package package1

import spinal.core._
class Counter(width : Int) extends Component{
  val io = new Bundle{
    val clear = in Bool()
    val value = out UInt(width bits)
  }
  val register = Reg(UInt(width bits)) init(0)
  register.addAttribute("keep")
  when(io.clear){
    register := 0
  }.otherwise{
    register := register + 1
  }

  io.value := register
}
object CounterInst {
  def main(args: Array[String]) {
    SpinalVerilog(new Counter(8))
  }
}

3.5 编译工程

然后就是运行代码,右键运行或者使用快捷键(Ctrl + Shift +F10)

运行完之后你会发现project路径下多了一个Counter.v文件

打开Counter.v就可以查看生成的verilog代码了。

到了这里设计部分就结束了,当然对于FPGAer来讲仿真是必不可少的,接下来就是仿真环境的测试。

4、仿真测试

4.1 新建工程

仿真过程遇到的最大的问题是仿真一致跑不过去,报错是找不到verilator.dll,最后发现卸载iverilog之后就可以正常跑通了。

这里新建一个package,然后把设计和仿真文件都放在package里面,然后运行仿真文件就可以跑通了。

package mylib

import spinal.core._
import spinal.lib._

import scala.util.Random

//Hardware definition
class MyTopLevel extends Component {
  val io = new Bundle {
    val cond0 = in  Bool()
    val cond1 = in  Bool()
    val flag  = out Bool()
    val state = out UInt(8 bits)
  }
  val counter = Reg(UInt(8 bits)) init(0)

  when(io.cond0){
    counter := counter + 1
  }

  io.state := counter
  io.flag  := (counter === 0) | io.cond1
}

//Generate the MyTopLevel's Verilog
object MyTopLevelVerilog {
  def main(args: Array[String]) {
    SpinalVerilog(new MyTopLevel)
  }
}

//Generate the MyTopLevel's VHDL
//object MyTopLevelVhdl {
//  def main(args: Array[String]) {
//    SpinalVhdl(new MyTopLevel)
//  }
//}


//Define a custom SpinalHDL configuration with synchronous reset instead of the default asynchronous one. This configuration can be resued everywhere
object MySpinalConfig extends SpinalConfig(defaultConfigForClockDomains = ClockDomainConfig(resetKind = SYNC))

//Generate the MyTopLevel's Verilog using the above custom configuration.
object MyTopLevelVerilogWithCustomConfig {
  def main(args: Array[String]) {
    MySpinalConfig.generateVerilog(new MyTopLevel)
  }
}
package mylib

import spinal.core._
import spinal.sim._
import spinal.core.sim._

import scala.util.Random


//MyTopLevel's testbench
object MyTopLevelSim {
  def main(args: Array[String]) {
    SimConfig.withWave.doSim(new MyTopLevel){dut =>
      //Fork a process to generate the reset and the clock on the dut
      dut.clockDomain.forkStimulus(period = 10)

      var modelState = 0
      for(idx <- 0 to 99){
        //Drive the dut inputs with random values
        dut.io.cond0 #= Random.nextBoolean()
        dut.io.cond1 #= Random.nextBoolean()

        //Wait a rising edge on the clock
        dut.clockDomain.waitRisingEdge()

        //Check that the dut values match with the reference model ones
        val modelFlag = modelState == 0 || dut.io.cond1.toBoolean
        assert(dut.io.state.toInt == modelState)
        assert(dut.io.flag.toBoolean == modelFlag)

        //Update the reference model value
        if(dut.io.cond0.toBoolean) {
          modelState = (modelState + 1) & 0xFF
        }
      }
    }
  }
}

运行通过之后就会生成波形文件,然后用Gtkwave打开波形文件皆可以查看波形了。

4.2 查看波形

用Gtkwave打开波形文件皆可以查看波形了。

4.3 问题记录

  • 报错是找不到verilator.dll

仿真过程遇到的最大的问题是仿真一致跑不过去,报错是找不到verilator.dll,最后发现卸载iverilog之后就可以正常跑通了。这里是第2章中仿真注意事项的具体情况,如果遇到相同报错的下载iverilog即可解决。

  • verilatorScript.sh: line 1: verilator_bin.exe: command not found

解决办法

  • Cannot run program "sh.exe"

解决办法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【SpinalHDL】Windows10系统搭建SpinalHDL 开发环境 的相关文章

  • Firebase 实时数据库 .info/connected 本应为 True 时为 False

    我有一个 Android 服务 它的调用地址为onCreate FirebaseDatabase database FirebaseDatabase getInstance database getReference info connec
  • Java 延迟/等待

    如何将 while 循环延迟到 1 秒间隔 而不减慢其运行的整个代码 计算机的速度到一秒延迟 只是一个小循环 Thread sleep 1000 do nothing for 1000 miliseconds 1 second
  • 如何在我的 HttpClient 执行器中遵循单一职责原则?

    我在用RestTemplate http docs spring io spring docs current javadoc api org springframework web client RestTemplate html as
  • Java OR 运算符优先级

    如何在 Java 中以 if 的方式链接条件语句b是假的 不如不检查c If a and c是假的 并且b是真的 确实c会被检查吗 if a b c 我正在寻找 PHP 所拥有的类似功能 但两者之间存在差异OR and 爪哇 如果左操作数是
  • 将 Java 3D 坐标转换为 2D 屏幕坐标

    我正在使用一个名为 Walrus 的 Java 3D 应用程序 该应用程序用于显示有向图 该代码已经具有突出显示节点并在给定其屏幕坐标的情况下在图形中相邻绘制标签的功能 旋转屏幕后 该节点不再突出显示 我所拥有的是 3D 中的节点坐标 我需
  • Java 中内存高效的稀疏数组

    关于时间高效的稀疏数组存在一些问题 但我正在寻找内存效率 我需要相当于List
  • 在所有方法调用上允许类型见证有什么意义?

    假设我们有两种方法 如下所示 public static
  • 无法在android中使用retrofit发出@Post请求

    我正在学习如何在 android 中使用改造 但是每当我尝试从互联网检索数据时 我的应用程序不会返回任何内容我的响应没有成功 我不知道如何修复当前我正在尝试发布的错误并使用此 URL 检索数据https jsonplaceholder ty
  • Hibernate SET 元素 order-by 子句

    我想知道 我可以平静地接受以下事实 当 fetch select 时 您可以在映射文件中的 SET 元素上设置 order by 属性 但如果您在创建查询时获取所有内容 这样安全吗 我的意思是 他们将结果放入 HashSet 中 我不认为这
  • 如何在 Struts 2 中访问 OGNL 跟踪评估?

    有人告诉我要优化网络应用程序 为此 我使用JProfiler https www ej technologies com products jprofiler overview html 我注意到很大一部分响应时间都花在了表示层上 特别是当
  • 在 Struts 2 中使用单个文件标签上传多个文件

    我想使用单个 Struts 2 文件标签上传多个文件 就像在 Gmail 中一样 我们使用 CTRL 键来选择多个文件来附加多个文件 我知道如何上传多个文件 但我想使用单个文件标签 我在一个小画廊应用程序中上传多个文件 如果您的操作已设置为
  • 在大画布上滚动

    我需要一些帮助来了解滚动绘制到 Android 画布上的项目的基础知识 假设我想创建一个时间线 其中 0 处的时间是可视化的顶部 并且随着时间的增加 时间线继续呈现在上一个点下方 如果我想在 Android 上渲染它 我知道我可以通过重写
  • 有没有办法防止 Spring Boot 覆盖 bean?

    与春天的抽象可刷新应用程序上下文 http docs spring io spring docs current javadoc api org springframework context support AbstractRefresh
  • 未找到 GroovyEvaluator

    我会尝试在以下位置制作我的 PIE 3D 报告iReport 在我的 struts xml 中 我用这个来调用我的报告
  • 正确的单元测试技术

    在使用 TDD 时 我发现自己需要测试一个包含查找值的常量 最终 哈希图 请查看更新中出现这种情况的原因 见下文 private static final Map
  • 当键位于父类中时,如何将一对多集合映射到连接的子类

    我想将一对多集合映射到子类 但集合的键是父类的属性 目前我正在映射 AbstractFoo Foo 和 Bar 类 如下所示
  • JAVAFX 缩放、ScrollPane 滚动

    I have JAVAFX application with zoom and scale as described here Scale at pivot point in an already scaled node https sta
  • Web 服务返回 java.lang.reflect.InitationTargetException

    我在向 java web 服务发出请求时收到上述消息 我们最初创建了一个 Java 控制台应用程序并手动提交了一个 xml 文件 当将其作为 Java 应用程序运行时 将使用 System out println 成功创建并显示响应 我们通
  • Swing:如何创建事件并将其分派给组件?

    我需要将一些事件发送到 Swing 中的组件 因此它的处理方式就像任何用户生成的标准 Swing 事件一样 基本上 类似于宏记录器 然后是 JEditorPane 的执行器 但我需要对生成的事件有更多的控制 所以 假设我有一个编辑 我想 捕
  • 只有创建视图层次结构的原始线程才能触摸其视图。在安卓上[重复]

    这个问题在这里已经有答案了 我只是一个初学者 所以请原谅我问一个可能愚蠢的问题 我不明白只有创建视图层次结构的原始线程才能触摸其视图的含义 请有人告诉我为什么会发生此错误以及如何解决此问题 ThankYou 这是我的班级 public cl

随机推荐

  • linux:命令行 &&与

    参考 Linux 命令行 与 简书 总结 command1 command2 只有前面命令执行成功 后面命令才继续执行 shell中 左边的命令 命令1 返回真 即返回0 成功被执行 后 右边的命令 命令2 才能够被执行 command1
  • mtk camera 移植步骤

    mtk camera 移植步骤 1 Kernel层驱动代码文件添加 mediatek custom doov92 wet tdd kernel imgsensor 下添加imx179 mipi raw 2lane 目录如下 imx179 m
  • 视频监控系统时间显示常见故障分析 及时间同步解决方案

    分别任职湖北三峡职业技术学院电子信息学院教研室主任 宜昌市教育技术装备站网络中心主任 宜昌市公安局科研所所长 视频监控系统是指综合应用视音频监控 通信 计算机网络等技术监视设防区域 并实时显示 记录现场图像的电子系统或网络 系统可以在非常事
  • Ubuntu 22.04部署Kubernetes 1.25

    Ubuntu 22 04部署Kubernetes 1 25 基本环境 系统和软件版本 master节点ip 安装过程 1 准备工作 1 1 修改主机名 1 2 关闭swap分区 1 3 关闭防火墙 1 4 重启电脑 确认swap和防火墙均已
  • angular组件封装

    1 这个公共组件的封装 2 c dropdown component ts import Component OnInit Input EventEmitter Output ViewChild from angular core Comp
  • 08LinuxC线程学习之pthread_join函数以及根据参2获取返回值的案例

    1 pthread join函数 int pthread join pthread t thread void retval 功能 阻塞等待线程退出 获取线程退出状态 其作用 对应进程中 waitpid 函数 成功 0 失败 错误号 参1
  • 1033. 旧键盘打字

    1033 旧键盘打字 20 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN Yue 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输
  • 【笔记】Nginx+Ngrok实现80端口服务器+80端口内网穿透

    安装ngrok 笔记 ngrok安装方法 安装完毕后ngrok默认将服务器的80端口占用 这时 需要修改启动脚本 vim etc init d ngrokd 找到如下部分 nohup sudo bin ngrokd tlsKey serve
  • 【每日一题】-金牌榜排序

    文章目录 题目描述 输入 输出 样例 解析 代码 题目描述 2012伦敦奥运会即将到来 大家都非常关注奖牌榜的情况 现在我们假设奖牌榜的排名规则如下 1 首先gold medal 数量多的排在前面 2 其次silver medal 数量多的
  • SpringBoot中 Lua函数操作redis

    Lua Lua 是一个简洁 轻量 可扩展的脚本语言 它的特性有 轻量 源码包只有核心库 编译后体积很小 高效 由 ANSI C 写的 启动快 运行快 内嵌 可内嵌到各种编程语言或系统中运行 提升静态语言的灵活性 如 OpenResty 就是
  • xman的思维导图快捷键_这个良心好用的思维导图软件,居然不用氪金充钱

    今天给大家介绍一款免费的在线思维导图工具 GitMind 提供了丰富的功能和模板 可免费导出 JPG PNG 图片 PDF 文档以及 TXT 文本等多种格式 此外 GitMind 还集成了制作流程图的能力 网站展示的流程图示例有泳道图 拓扑
  • Springboot项目使用达梦数据库

    下载达梦数据库驱动 Dm7JdbcDriver16 jar 执行maven命令把驱动包打入本地maven仓库 mvn install install file DgroupId com dm DartifactId DmJdbcDriver
  • 学校计算机如何脱控,学校机房脱控方法(已控状态)/极域电子教室脱离老师控制图文教程...

    老师没控制的时候 刀友应该都会断掉控制吧 我就不说了 就说说老师老师已经控制了该如何脱离控制 拔网线比较麻烦就不说了 以下操作之前先检查极域电子教室 右键右下角极域电子教室端 打开设置 把禁止结束学生端进程前面的勾去掉 把断网锁屏前面的勾去
  • 部署ELFK

    目录 ELFK ES logstash filebeat kibana 环境准备 所有节点 Elasticsearch 集群部署 在Node1 Node2节点上操作 修改elasticsearch主配置文件 es 性能调优参数 启动elas
  • Marriage is Stable

    http acm hdu edu cn showproblem php pid 1522 Problem Description Albert Brad Chuck are happy bachelors who are in love w
  • JVM--三大子系统详解

    首先需要了解java的命令 javac 将java文件编译为 class文件 里面是一些二进制文件 javap c 将 class文件变为反汇编 例如 javap c hello class gt demo txt 可以将class文件转化
  • GPIO介绍

    目录 一 GPIO是什么 二 STM32引脚分类 三 GPIO内部结构 四 GPIO的工作模式 4 1 输入模式 模拟 上拉 下拉 浮空 4 2 输出模式 推挽 开漏 4 3 复用功能 推挽 开漏 4 4 模拟输入输出 上下拉无影响 一 G
  • c语言将csv文件存储到数组,读取CSV文件并将值存储到数组中

    青春有我 我最喜欢的CSV解析器是一个内置在 NET库中的解析器 这是Microsoft VisualBasic命名空间中隐藏的宝藏 下面是一个示例代码 using Microsoft VisualBasic FileIO var path
  • ConcurrentHashMap 的实现原理

    目录 常见问题 1 concurrentHashMap特点 2 concurrentHashMap如何保证效率高 又安全的 1 构造函数 2 put方法 2 1 initTable 2 2 addCount方法 3 get方法 常见问题 1
  • 【SpinalHDL】Windows10系统搭建SpinalHDL 开发环境

    本文主要记载如何从零开始在win平台搭建SpinalHDL开发环境并跑通第一个spinal project demo 1 环境准备 1 1 软件下载 首先列出需要安装的软件 并逐一对这些软件的功能和其必要性进行说明 需要安装的软件 IDEA