在HDLbits刷到这样一道题
Create a 4-bit wide, 256-to-1 multiplexer. The 256 4-bit inputs are all packed into a single 1024-bit input vector. sel=0 should select bits in[3:0], sel=1 selects bits in[7:4], sel=2 selects bits in[11:8], etc.
我的想法是assign out=in[sel*4+3:4*sel];
但它报错sel is not a constant。sel不是一个常量。当时很不能理解,切片不是这样切的吗?
后来发现这是用C语言的思维来写硬件语言,Verilog并不支持[i*number:i*number]这样的切片方法,即片选前后都是变量,因为这意味着切片的宽度是变化的。在综合时,硬件电路需要确定每个位的位置,但由于宽度是不确定的,这会导致问题。在硬件中,位的位置必须是固定的。
但它支持[i*number+:num]这样的方法,前面是变量,后面为常量,表示从i*number开始,片选num位。这样切片的宽度就确定了。
所以将结果改成assign out =in[sel*4+:4]就解决问题了。