SpinalHDL中的switch
在之前的文章中曾提到过SpinalHDL中switch的使用:
通常情况下,switch对应着我们日常Verilog代码中的case。像下面的代码:
其生成的RTL代码为:
没什么大的问题。但我们知道,在Verilog中,存在case,casez,casex三种语法(本篇不做三种语法的区分与讨论,对此感兴趣的小伙伴可以自行百度)。像下面的这种代码:
我们在写Verilog代码时还是很少会直接这么来写的,往往通常采用casez来进行描述:
那么在SpinalHDL中,我们是否也可以这么描述呢?
SpinalHDL中的don't care
像Verilog代码中,casez里我们常常采用?表示我们不关心的位,而在SpinalHDL中,也存在这么一种表示方式。
SpinalHDL整体的数据结构如下图所示:
针对BitVector及其子类,SpinalHDL定义了一种特殊的类型用于在比较中表示不关心的bit:
像上面的例子里只要myits的bit7,bit6,bit2为0,bit3为1那么itMatch即为True。
而通过这种形式,我们即可在switch中实现类似casez的功能:
其对应的Verilog代码为:
可以看到,在生成的Verilog代码里,这里换成了casez。
使用需谨慎
像上面在switch中使用M"----1----"没有什么问题,然而在其他地方,使用则需谨慎。像下面的代码逻辑:
其在生成RTL代码时会采用下面的逻辑:
从资源的利用角度来讲反而增加了面积开销,还是老老实实的采用常规形式比较好:
原作者:玉骐
更多回帖