如果想要位边界是变量 以实现动态截取呢, 如果我们这样写 vt[cnt+4:cnt](cnt是变量), 是编译通不过的.

精确的语法该当这样写:

vt[base+:width] or vt[base-:width]

个中, base可以是变量, width必须是常量.

也即是说, 起始位可以是变量, 位宽必须是常量.

verilog的两个小技巧 动态截取 与 位复制

这样上面想当然的缺点写法, 可以写为vt[cnt+:4].

if cnt=5, vt[cnt+:4] 即是 vt[8:5]; vt[cnt-:4] 即是 vt[5:2].

不知为何, 这个用法该当是挺常用的, 但在很多verilog教材中都没有提及, 但在verilog标准中是有的哦.

2. 大括号{}的复制功能

大括号{}的拼接功能, 大家都知道了, 比如下面这种

{a, b[3:0], c, 3'b100}

就不多说了.

{{}}表示复制, 这个用法就不常用了, 但有些场景用起来还是挺方便的.

比如: {4{a}}等同于{a,a,a,a}, {12{1'b1}}等同于12'b1111_1111_1111

当然, 拼接 和 复制 也可以组合起来利用, 比如:

{a, {3{a,b}}}