在之前写Verilog时,位拼接符是一个很常见的东西,今天来看下在SpinalHDL中常见的位拼接符的使用。
建议SpinalHDL 版本不低于1.7.1(1.7.1版本Bug较多,再往上~)
将一个信号的不同bit赋值给不同的信号,这种拼接方式可以在SpinalHDL中按照如下的形式进行书写:
case class demo() extends Component{
val dataIn=in Bits(8 bits)
val dataOut0,dataOut1= out Bits(4 bits)
(dataOut0,dataOut1):=dataIn
}
对于这种形式的拼接赋值,在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)
}
对于这种形式的拼接赋值,是上面两种形式的组合体,那么可以这么来写:
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)
}
这种类型的赋值在SpinalHDL中提供了两个API:
case class demo() extends Component{
val a=in Bits(2 bits)
val b= out Bits(6 bits)
b:=B(a,3)
}
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
原作者:玉骐