verilog的兩個(gè)小技巧 動(dòng)態(tài)截取 與 位復(fù)制
2022-11-28 12:34 作者:有AI野心的電工和碼農(nóng) | 我要投稿

1. +: 和 -: 動(dòng)態(tài)位截取
位截取經(jīng)常用到, 我們一般是使用諸如vt[7:2]
這樣的形式, 位邊界都是常量.
如果想要位邊界是變量 以實(shí)現(xiàn)動(dòng)態(tài)截取呢, 如果我們這樣寫?vt[cnt+4:cnt]
(cnt是變量), 是編譯通不過(guò)的.
正確的語(yǔ)法應(yīng)該這樣寫:
vt[base+:width] or vt[base-:width]
其中, base可以是變量, width必須是常量.
也即是說(shuō), 起始位可以是變量,?位寬必須是常量.
這樣上面想當(dāng)然的錯(cuò)誤寫法, 可以寫為vt[cnt+:4]
.
if cnt=5,?vt[cnt+:4]
?等于?vt[8:5]
;?vt[cnt-:4]
?等于?vt[5:2]
.
不知為何, 這個(gè)用法應(yīng)該是挺常用的, 但在很多verilog教材中都沒(méi)有提及, 但在verilog標(biāo)準(zhǔn)中是有的哦.
2. 大括號(hào){}的復(fù)制功能
大括號(hào){}的拼接功能, 大家都知道了, 比如下面這種
{a, b[3:0], c, 3'b100}
就不多說(shuō)了.
{{}}
表示復(fù)制, 這個(gè)用法就不常用了, 但有些場(chǎng)景用起來(lái)還是挺方便的.
比如:?{4{a}}
等同于{a,a,a,a}
,?{12{1'b1}}
等同于12'b1111_1111_1111
當(dāng)然,?拼接?和?復(fù)制?也可以組合起來(lái)使用, 比如:
{a, {3{a,b}}}
標(biāo)簽: