十二 · 2022年11月18日 · 北京市

SpinalHDL中不可不知的位拼接符

✎ 编 者 按 

    在之前写Verilog时,位拼接符是一个很常见的东西,今天来看下在SpinalHDL中常见的位拼接符的使用。

    建议SpinalHDL 版本不低于1.7.1(1.7.1版本Bug较多,再往上~)

》{a,b,c}=c

    将一个信号的不同bit赋值给不同的信号,这种拼接方式可以在SpinalHDL中按照如下的形式进行书写:


case class demo() extends Component{
  val dataIn=in Bits(8 bits)
  val dataOut0,dataOut1= out Bits(4 bits)
  (dataOut0,dataOut1):=dataIn
}

》d={a,b,c}

    对于这种形式的拼接赋值,在SpinalHDL中可以采用如下形式:

case class demo() extends Component{
  val a,b,c=in Bits(2 bits)
  val d= out Bits(6 bits)
  d:=Cat(a,b,c)
}

》{d,e}={a,b,c}

    对于这种形式的拼接赋值,是上面两种形式的组合体,那么可以这么来写:

case class demo() extends Component{
  val a,b,c=in Bits(2 bits)
  val d,e= out Bits(3 bits)
  (d,e):=Cat(a,b,c)
}

    针对这种形式,当然也可以更简化一些:

case class demo() extends Component{
  val a,b,c=in Bits(2 bits)
  val d,e= out Bits(3 bits)
  (d,e):=(a,b,c)
}

》b={n{a}}

    这种类型的赋值在SpinalHDL中提供了两个API:


case class demo() extends Component{
  val a=in Bits(2 bits)
  val b= out Bits(6 bits)
  b:=B(a,3) //不是B(a,3 bits),别搞混
}
case class demo() extends Component{
 val a=in Bits(2 bits)
  val b= out Bits(6 bits)
  b:=Repeat(a,3)
}

   这两种实现方式最终生成的Verilog代码略不优雅,只是将a机械的重复了n次:

`timescale 1ns/1ps

module demo (
input      [1:0]    a,
output     [5:0]    b
);


assign b = {a,{a,a}};

endmodule

☆ END ☆

作者:玉骐
原文链接:Spinal FPGA
微信公众号:
 title=

推荐阅读

更多SpinalHDL技术干货请关注Spinal FPGA欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
1581
内容数
133
用SpinalHDL提升生产力
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息