如果把向量的位选取写成 vector[msb:lsb] 这种形式,下标 msb 和 lsb 中是不能出现变量的,但是Verilog 2001支持如下写法
错误的写法:
assign out=in[addr*8+7:addr*8];
正确的写法:
(1) assign out = {……, in[addr*8 + 3], in[addr*8 + 2], in[addr*8 + 1], in[addr*8]};
(2)assign out = in[addr*8+:8];//从addr*8开始,选择比特序号大于等于addr*8的8位bit,相当于[addr*8+7:addr*8]
(3)assign out = in[(addr*8+7)-:8];//从addr*8+7开始,选择比特序号小于等于addr*8+7的8位bit,相当于[addr*8+7:addr*8]
[base_expr +: width_expr] //positive offset
[base_expr -: width_expr] //negative offset
// 其中base_expr可以是变量,而width_expr必须是常量。+:表示由base_expr向上增长width_expr位,-:表示由base_expr向上递减width_expr位