十二 · 2021年11月10日

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

哪有什么岁月静好,只不过他人帮你写了代码。你每调用一个方法,都有一段写好的代码在帮你干活~

壹伴编辑器

    看一道位宽拼接的简单题目:

25c9fcd1c4b344ba48d6eb6031251235.png

    这里a,b,c,d,e,f位宽均为5bit,w,x,y,z均为8bit。Verilog实现很简单:

77785c10256b0917ec4f76da5f2e51e7.png

    然而很不巧,SpinalHDL里目前还没有=左侧进行位宽拼接的操作,想要实现的话:

c8f08b97e9e344531aaf67d78ecceff8.png

    貌似这里SpinalHDL里使用起来不是那么方便……   

代码我手,不爽就加

    任何事情都不是非黑即白的,SpinalHDL是基于Scala的,我们调用的+-*/都是一个方法,对于上面的例子当使用起来觉得不方便时那么我们不妨自定义一个这样的方法:

d8edd6940eb49d895caa4ee380c52fbe.png

    assignFromVec有四个参数,其用于实现上面的功能:

  • that:待用于赋值的信号列表,像上面的a,b,c,d,e,f。
  • allowResize:当左右两侧位宽不一致时允许进行位宽截取或扩充
  • pendingValue:当等号左边位宽大于右边位宽时用于位宽填充的值,即每个比特填充0还是1.
  • resizeHigh:当等号左边的位宽小于右边的位宽时用于指定是舍弃高位还是舍弃低位。

    如此上面的例子我们可以在SpinalHDL中这么来写:

8276c2ebe1b9ef533ad440bb5aac8bd6.png

assignFromVec

    这里assignFromVec的实现借助于Scala隐式转换(感兴趣的小伙伴不妨去学习下)使用。通过隐式转换,为SpinalHDL中的Vec类型增加了一个assignFromVec方法。完整代码如下:

879fcba41bea03ddb7a7323b7699c638.png

    代码或许有些冗长,但覆盖了位宽拼接赋值的所有场景,使得我们在调用时不必担心左右两边的位宽匹配问题和值填充问题,从而能够让我们在针对类似的场景写代码时直接无脑调用这个方法即可~ 

写在最后

    当在使用SpinalHDL觉得其中某些方法使用起来并不好使时那么不妨为SpinalHDL扩展自己的方法。而SpinalHDL中丰富的lib不就是这样一点点的搭建起来的么。SpinalHDL里你每调用一个方法的背后都是别人写好的一段代码为你工作。

    当然对于我们而言尤其是数字逻辑刚入门的小伙伴还是要老老实实熟悉每个电路的基础原理,莫调用一时爽,面试火葬场。

☆ END ☆

作者:玉骐
原文链接:https://mp.weixin.qq.com/s/aueJXGImPrRfer4\_kBkT9w
微信公众号:
 title=

推荐阅读

更多SpinalHDL技术干货请关注Spinal FPGA专栏。
推荐阅读
关注数
1581
内容数
133
用SpinalHDL提升生产力
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息