最近在学习SpinalHDL,这是一门基于Scala的硬件描述语言,粒度与Verilog/VHDL相当,但是利用了scala的许多面向对象特性以及高级抽象语言的特性,可以大大提高数字IC前端设计的效率。
由于项目需要,决定从一个最简单的加法树结构入手,练习SpinalHDL。
一个典型八输入加法树的结构如下:

通过观察可以知道,加法树是通过将输入两两相加得到中间部分和,再将部分和两两相加,直至获得最终输出。这在verilog中的实现不难,只需要定义一些存放中间部分和的信号,再写一些两两相加的逻辑即可。
但是,spinalHDL在这个例子中展现了一个非常不错的地方,即它可以使用高级抽象语言的一些特性,比如递归来实现加法树(加法树的树形结构非常适合用递归来做),且其对数据位宽的自动推断使得无需考虑的中间部分和信号位宽,代码如下:
package mylib
import spinal.core._
//inputNum为参数,代表加法树输入数据个数
class addtree (inputNum: Int) extends Component {
require(isPow2(inputNum)) //本代码只支持inputNum为2的幂次情况,实际上任意数量实现也不难
val tree_stage = log2Up(inputNum) //加法树级数
val io = new Bundle{
val ppen = in Bool
val data_in = in Vec(SInt(32 bits),inputNum) //使用Vec类型实现可变数量的port
val sum_out = out(Reg(SInt(32+tree_stage bits)))
}
//函数式编程思想
def tree(op: Vec[SInt]): Vec[SInt] = {
val n = op.length
if(n == 1) op
else {
val psum = Vec((SInt),n/2)
for(i <- 0 until n/2){
psum(i) :<

本文介绍使用SpinalHDL实现加法树的过程。SpinalHDL是一种基于Scala的硬件描述语言,它利用Scala的面向对象特性提高设计效率。文章详细展示了如何使用递归实现加法树,并自动生成Verilog代码。
最低0.47元/天 解锁文章
3134

被折叠的 条评论
为什么被折叠?



