Verilog中的位拼接運算符{ }
引言:在Verilog中,如何給一個多bit(如123bit)的變量賦值呢?該不至於連續寫123bit的1吧?或者換算為16進制數表示?如果1230bit又該怎麼辦?此時就需要位拼接運算。
一、Verilog中的位拼接運算符
雖然Verilog HDL和C語言長得很像,但是在學習Verilog的過程中還是遇到了一些和C完全不同的語法,比如拼接運算符 { }。注意: 這個{ }的使用跟C語言一點關係沒有,Verilog語言表示代碼區塊是用begin-end來表示的。
1.2、位拼接的定義
位拼接運算符{ }用於將兩個或多個信號拼接起來,表示一個整體的信號例如一個一位全加器可以將進位輸出和結果拼接在一起:
- 例如加法器:
module fulladder(a, b, cin, sum, cout);
input a, b, cin;
output sum, cout;
assign {cout, sum} = a + b + cin; // 進位輸出與和拼接在一起
endmodule
- 因爲如果a+b+cin產生了溢出位,正好被參與拼接中的cout所接收,就起到了簡化表達式的作用
- 再例如在移位寄存器中有以下的部分:
// 設有寄存器store[7:0]
store <= {0, store[7:1]};
- 上面的代碼通過拼接0和store的左側7位實現了右移1位的操作則store的值的變化:
二、技巧與注意事項
2.1、使用重複數字法簡化拼接表達式的書寫
- 例如要表示4bit的w
{4{w}} <=> {w, w, w, w}
- 使用嵌套方式簡化書寫
{a, {3{b, c}}} <=> {a, b, c, b, c, b, c}
2.2、使用位拼接運算符的注意:
- 位拼接表達式中最好指明每個元素的具體位數,否則默認爲32位二進制數
三、通過參數指定位寬
localparam MEM_DUMMY_BIT = 1024;
assign l1_evt_mem_dummy_data = {{(MEM_DUMMY_BIT){1'b0}}, l1_evt_mem_di};
四、參考文獻
4.1、參考鏈接:Link