ARM技术论坛
直播中

jsqueh

9年用户 1297经验值
私信 关注
[经验]

在SpinalHDL里switch方法有何用处呢

在RTL设计里,case是一个常用的综合语法,用于根据变量值来选择适当的逻辑电路,语法很简单:

想象一个场景,在标准的AXI4-Stream接口中,tkeep信号每一个bit表示一个字节的数据是否有效,当我们需要根据tkeep信号来计算这一拍有多少有效数据时这里的代码会是什么样子……

这种代码写的手有点儿累(又没啥技术含量)……
在SpinalHDL里该如何做呢?
switch
SpinalHDL提供了switch方法用于实现Verilog里case语句的实现:

看起来似乎和Verilog里的差不多,但SpinalHDL基于Scala语言,可借助高级语言进行方便的代码构建:
在SpinalHDL里,我们可以更快速高效的实现tkeep到byteCnt的转换:

SpinalHDL在生成RTL时,仅SpinalHDL提供的语法会生成RTL电路,而其他代码则是起指导生成电路的作用,在上面代码里,keepIndex记录了tkeep需要匹配的值,第三行代码则是指定规则,为index从1到64的取值,均生成"is"综合语句,而在真正生成RTL电路时,只有switch、is这些SpinalHDL提供的语句才会生成电路。生成的RTL语句如下:






倘若我不告诉你,焉知我这段代码不是手写的呢(你先手写着,我去刷会儿手机~)?
同样,针对case多个匹配执行相同操作,switch也同样支持,实例如下:

对应的RTL同样和手写RTL无二:

SpinalHDL本质上还是不同于HLS仍需要硬件设计思维,但对于Verilog/SystemVerilog来讲,依旧有鸟枪换炮的优势!

原作者:玉骐

更多回帖

发帖
×
20
完善资料,
赚取积分