risc-v中文社区

 找回密码
 立即注册
查看: 2181|回复: 1

[经验] SpinalHDL开发环境——环境搭建

[复制链接]

3

主题

3

帖子

27

积分

新手上路

Rank: 1

积分
27
发表于 2022-3-15 21:34:45 | 显示全部楼层 |阅读模式
本帖最后由 risc-wang 于 2022-3-16 06:47 编辑

前言
        最近看到SpinalHDL的相关介绍,诸多票友觉得相比chisel更具优势,初步了解记录下,由于SpinalHDL基于Scala,对该类型语言并未接触,优先学习思想为主,环境搭建采用Intel IDEA 进行搭建,其中遇到些许坑,做下记录。
Intel IDEA安装
        IDEA采用Community版即可,从官网下载,step by step。
        安装完成后需安装Scala插件。
JDK安装
        Scala需要java SDK 1.8,从Oracle官网下载即可。
Scala安装
        Scala建议采用2.11.12版本(尝试过其他版本,但使用SpinalHDL中遇到各种问题,以学习SpinalHDL为主,不折腾环境)。从Scala官网下载(scala-lang.org/),随后将scala加载到idea中(网上有诸多搭建scala环境教程)
SpinalHDL Example run
        SpinalHDL本质上是一个Scala的libary,采用创建Scala工程的方式创建即可 :
创建完成工程后,在目录结构下会有一个build.sbt文件,在其中设置SpinalHDL库即可

将下述内容填充到build.sbt中:
name := "untitled2"

version := "0.1"

scalaVersion := "2.11.12"

val spinalVersion = "1.4.0"

libraryDependencies ++= Seq(
  "com.github.spinalhdl" % "spinalhdl-core_2.11" % spinalVersion,
  "com.github.spinalhdl" % "spinalhdl-lib_2.11" % spinalVersion,
  compilerPlugin("com.github.spinalhdl" % "spinalhdl-idsl-plugin_2.11" % spinalVersion)
)
等待工具自动加载完成后可看到spinalHDL已成功加载
创建Scala文件:


编写SpinalHDL测试程序:
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]) {
    SpinalSystemVerilog(new Counter(8))
  }
}
运行该程序,执行正常:
[Runtime] SpinalHDL v1.4.0    git head : ecb5a80b713566f417ea3ea061f9969e73770a7f
[Runtime] JVM max memory : 3641.0MiB
[Runtime] Current date : 2020.06.07 22:41:42
[Progress] at 0.000 : Elaborate components
[Progress] at 0.232 : Checks and transforms
[Progress] at 0.312 : Generate Verilog
[Done] at 0.361
成功执行后会生成一个systemverilog rtl文件,生成的rtl代码如下:
// Generator : SpinalHDL v1.4.0    git head : ecb5a80b713566f417ea3ea061f9969e73770a7f
// Date      : 07/06/2020, 22:41:43
// Component : Counter

module Counter (
  input               io_clear,
  output     [7:0]    io_value,
  input               clk,
  input               reset
);
  (* keep *) reg        [7:0]    register_1_;

  assign io_value = register_1_;
  always @ (posedge clk or posedge reset) begin
    if (reset) begin
      register_1_ <= 8'h0;
    end else begin
      if(io_clear)begin
        register_1_ <= 8'h0;
      end else begin
        register_1_ <= (register_1_ + 8'h01);
      end
    end
  end


endmodule
        生成的RTL代码可读性相对来说与手工编写RTL代码差距不大,或许SpinalHDL后续也是一个发展方向之一。
写在最后
        SpinalHDL作为一种新的构建语言,它并不是HLS,本质上还需要我们有硬件设计思维。相较于Verilog、Systemverilog等语言,个人体验在编码风格及使用上有着更佳的体验,真有种学会了SpinalHDL,不再想回头写Verilog的感觉。诚然,在ASIC领域,SpinalHDL的态度或许更谨慎些,但在FPGA领域,尤其在互联网行业,SpinalHDL能够对于算法验证、仿真收敛上有更佳的优势(FPGA上板验证成本小,而做一个Verilog算法验证代码量真是不是一般的大)。而在设计过程中,我们甚至不需要关心生成的TRL代码。
        关于SpinalHDL若有感兴趣的小伙伴可在知乎阅读专栏“Scala硬件开发”(https://zhuanlan.zhihu.com/c_1172895565598920704),或去阅读SpinalHDL官方手册。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-4-1 16:03:51 | 显示全部楼层
从环境到仿真,入门初级知识已介绍,不错,希望有一个系列的讲座介绍,期待中。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-20 05:11 , Processed in 0.018281 second(s), 18 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表