`timescale 1ns/1ns module top_module ( input [255:0] in, input [7:0] sel, output out ); assign out = in[sel]; //有一些同学可能会用case语句去一个一个的列出可能,但是这样的话还不如直接赋值简单,也可以采用for循环去定义 endmodule
有些同学可能会认为 这里的索引一定要是常数。其实不然 向量索引可以是可变的,只要综合器可以确定所选择位的宽度是恒定的就可以。(参照Hdlbits第55题256选一的暗示)
当然 也有报错的情况 说 "is not a constant" 表示它无法证明选择宽度是常量
比如这个索引:in[ sel*4+3 : sel*4 ]
所以Verilog-2001 版本出现了新的语法:可以将上述语句修改为 out = in[sel*4 +:4]; 如果sel是4 那这句等效为:in[19:16]
笔记:
注:本人语法学习参考了CSDN博客:FPGA开发备忘录的内容