本帖最后由 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代码。
|