从Verilog到SpinalHDL

本文介绍了作者从Verilog转向SpinalHDL的原因,Verilog在实际项目中遇到的局限性,如描述冗余、错误定位困难等。SpinalHDL作为基于Scala的硬件描述语言,提供了更简洁、高效的电路描述方式,有助于提高开发效率。作者分享了自己的学习笔记和实践经验,鼓励读者尝试这个相对小众但有优势的工具。
摘要由CSDN通过智能技术生成

不点蓝字,何来故事?

  学习SpinalHDL已有近半年,其诚然小众,但“小家碧玉”未尝不是绝代佳人。

出坑Verilog

    遥想当年本科之时画过电路PCB、玩儿过单片机、PLC,亦学过C#(给我那数块板子的毕设做个上位机),Python。直到研究生之时方才选择FPGA这条道路,除了对数字电路本身的兴趣之外(对于做软件感觉一直找不到自己的优势所在,虽然最终还是进了互联网行业,也算是冥冥之中自有天意吧),重要的便是Verilog语法简单,可以令我很快专注于电路硬件的设计而非语法本身。   

    “成也萧何,败也萧何”,Verilog语法确实简单,但在实际的项目设计中诸君是否有对Verilog的描述冗杂感到无可奈何?一个电路结构的方案设计完毕到用Verilog算法来实现还有一段路要走(我承认RTL代码编写阶段只是整个项目周期的一部分,所占比重并没有那么大,但Verilog或许是开发效率也就只比软件的汇编语言要好一些了),也导致了很多时候虽然有对算法电路实现的方式有一个明晰的设计方案但仍不想去实现(眼高手低)。而且在Verilog代码调试中有一半的时间估计都是定位一些比较低级的错误,更有些像端口方向声明错误、信号多个地方驱动等这些错误往往是在FPGA布局布线阶段甚至上板阶段才发现,极大的浪费时间,而虽然出了SystemVerilog,但这些问题依旧存在。借用知乎上“马車”的观点(完整文章参见原文链接):

  • 例化不方便:有人会说,有辅助插件帮你完成 (确实有很多好的插件,emacs verilog-mode , vim 的autoinst) 即便这样,但是对带参数的模块例化, 一对多例化同样需要手动处理,非常不方便

  • 大量的重复声明:无休止的变量声明,无休止的位宽声明,容易出错, 作为一门上古时期的语言,对编译器不能要求太高

  • 函数不能带参数:verilog中函数的使用只能是零零星星,哪怕是一个位宽的变化都要重写函数, 作为一门语言函数不能广泛使用,实为鸡肋

  • 参数化实在是笨:虽然支持参数化,parameter 也只能做一些简单的加减左移操作, 没有基本math包。利用宏做参数化,对于变量比较多的设计,非常复杂,并且也不好维护。

  • 错误检测很弱:编译工具对错误的处理比较保守, 这种保守可能也源于语言本身,以及编译器的能力不及。
    以下问题需要工程师自己处理

    • 位宽不匹配,

    • input/output端口写反

    • 饱和截位弄错,

    • 跨时钟域问题

    • 锁存器检查

    • 组合逻辑环自己查

    • ....

    基于前仿的编译,会遗漏大量的错误,必须要Lint, 综合检查, 费时费力又费钱。   

    重构、增减信号,Bist/DFT逻辑插入麻烦

    需要手动处理, 编写脚本, 即便是脚本也不通用

入坑SpinalHDL    

    SpinalHDL和Chisel师承一脉,都是基于Scala来进行电路描述。其本质上仍旧是HDL而非HLS,在设计之前依旧需要有清晰的电路结构,只不过是在电路描述上更加方便和快捷而已。个人学习SpinalHDL已有半年时间,SpinalHDL在解决上面的那些痛点上觉得做的是相当优秀,有感兴趣的小伙伴不妨尝试了解下。诚然,SpinalHDL的入门曲线可能较陡一些,但越过此门当真是打开一个新的世界。

    结合SpinalHDL—Doc文档及个人学习经历,推出下面个人的SpinalHDL的笔记总结,建议结合SpinalHDL-Doc进行阅览。

开篇了解

《SpinalHDL资料汇总》

《山水有相逢—和大牛成为同事》

《SpinalHDL—An alternativeHDL》

事半功倍

《见微知著——从example感受Lib 的强大》

《FPGA图像处理中矩阵提取》

《FPGA图像处理——老戏新说》

《你刚写完接口,我已经把功能实现了》

开发环境

《SpinalHDL——环境搭建》

《SpinalHDL—仿真环境》

组织结构

《SpinalHDL代码组织结构之Component》

《SpinalHDL—像软件调用方法般例化模块》

《SpinalHDL—Area》

《SpinalHDL—Function》

数据类型

《SpinalHDL—数据类型:Bool》

《SpinalHDL—数据类型:Bits》

《SpinalHDL—数据类型:UInt/SInt》

电路描述

《SpinalHDL—Reg&Wire》

《\= Yes or No?》

《起承转合,Vec数组的使用》

《SpinalHDL——switch》

《SpinalHDL—ClockDomain》

《跨时钟域那点事儿》

《真的明白ClockDomain了么》

《时钟域“定制”》

《SpinalHDL-Inout三板斧》

《以变量为索引,取指定之位宽》

《如何“千辛万苦”地生成一个Latch》

《balanceTree—快速实现一个加法树》

《兄弟,要几段?》

《SpinalHDL-FIFO那点事儿》

《SpinalHDL——集成你的RTL代码》

《打个拍,握个手可以么》

《与其在一起纠缠,不如“一别两宽”》

《每一个方法的背后都是他人的贡献》

《SpinalHDL消耗资源比预期多了怎么办》

《被忽略的两个Tips》

《值得学习的SPI-Master》

双兔傍地走,如何辨雌雄

《拨开云雾—>是=还是:=》

《SpinalHDL—if向左、when向右》

《SpinalHDL—柳暗花明又一村》

《软为硬用,如是而已》

奇技淫巧

《换个名字混江湖》

《SpinalHDL—如何给电路加属性标签》

《SpinalHDL—优雅地添加波形跟踪信号》

《SpinalHDL—优雅地实现总线寄存器读写》

《SpinalHDL—优雅地插队》

《电路描述里apply的妙用》

《还能再偷点懒儿》

仿真篇

《SpinalHDL—仿真启动》

《SpinalHDL—仿真中时钟域驱动》

《SpinalHDL—仿真信号读写》

《SpinalHDL—仿真Demo》

《SpinalHDL—测试平台搭建》

《SpinalHDL—基于Scala的测试框架》

《SpinalHDL—覆盖率收集》

练习随笔

《SpinalHDL小练习(一)》
《SpinalHDL—小练习(二)》
《SpinalHDL—小练习(三)》
《SpinalHDL—小练习(四)》

写在最后    

     SpinalHDL最终仍需要生成Verilog交给工具综合,其代码可读性也相当不错,在SpinalHDL中定义的变量名也都会保留下来。是SpinalHDL还是Verilog其都是一个工具,其本质上仍需要电路设计的思维,但或许可以给我们打开一扇新的电路描述的大门。

- END -

NOW现在行动!
推荐阅读
【Vivado那些事】如何查找官网例程及如何使用官网例程【Vivado使用误区与进阶】总结篇【Vivado那些事】Vivado中常用的快捷键(一)F4键【Vivado那些事】Vivado中常用的快捷键(二)其他常用快捷键
SystemVerilog数字系统设计_夏宇闻 PDFVerilog 里面,always,assign和always@(*)区别
FPGA上如何求32个输入的最大值和次大值:分治图书推荐|ARM Cortex-M0 全可编程SoC原理及实现
简谈:如何学习FPGARISC-V再进阶!世界首款5纳米RISC-V SOC成功流片!
几款开源SDR平台Vitis尝鲜(一)
SDR/无线设计中LNA和PA的基本原理
拆解1968年的美国军用电脑,真的怀疑是“穿越”啊!
一文最全科普FPGA技术知识你见过1-bit CPU吗?高级FPGA设计技巧!多时钟域和异步信号处理解决方案
【Vivado那些事】Vivado中电路结构的网表描述
ZYNQ中裸机开发和Linux开发有什么区别?
现代计算机的雏形-微型计算机MCS-4
世界上第一个微处理器真的是Intel 4004吗?其实这是个很复杂的故事…
【每周一问】如何控制加载FPGA程序时,Xilinx FPGA的IO管脚输出高低电平
【Vivado那些事】vivado生成.bit文件时报错-ERROR: [Drc 23-20]
AD9361 和Zynq及其参考设计说明1202年了,还在使用虚拟机吗?Win10安装Ubuntu子系统及图形化界面详细教程谈谈Xilinx FPGA设计的实现过程
Github 上有哪些优秀的 VHDL/Verilog/FPGA 项目
AD936x+ZYNQ搭建收音机(一)
AD936x+ZYNQ搭建收音机(二)含视频演示
AD936x+ZYNQ搭建收音机(三)-终篇
AD936x+ZYNQ搭建OpenWIFI
Verilog 版本:Verilog-95、Verilog-2001与System Verilog区别简谈
FPGA时钟设计方案
点击上方字体即可跳转阅读
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值