`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开发备忘录的内容