網(wǎng)站建設(shè)的主要職責(zé)免費網(wǎng)站免費
文章目錄
- 前言
- 一、關(guān)鍵詞
- 二、運算符
- 三、數(shù)據(jù)類型
- 1、基本類型:reg、wire、integer、parameter
- 四、條件語句
- 五、循環(huán)語句
- 1、for
- 2、generate
- 六、function和task
- 七、initial和always
- 1、initial和always相同點和區(qū)別
- 2、always和assign語句區(qū)別
前言
2023.4.4
2023.4.7 補充綜合和不可綜合的關(guān)鍵詞
一、關(guān)鍵詞
module/endmodule
input/output/inout
parameter
wire/reg
always/assign
begin/end
posedge/negedge
case/default/endcase
if/esle
for
二、運算符
位運算符和縮位運算符區(qū)別:縮位運算符結(jié)果為1bit,位運算符結(jié)果位數(shù)和操作數(shù)位數(shù)相同
三、數(shù)據(jù)類型
總共:19種
1、基本類型:reg、wire、integer、parameter
當(dāng)信號沒有定義類型時,缺省類型為wire,缺省值為高阻Z。
wire
:常和assign
用來描述組合邏輯,verilog中輸入輸出缺省類型為wire。
reg
:寄存器數(shù)據(jù)類型,缺省值是未知的,無符號數(shù),但reg可以是負(fù)數(shù)也可以是正數(shù)。
在表達(dá)式的操作數(shù)中被當(dāng)作是無符號數(shù),假如是4bit的-1,則在實際運算時是-1的補碼,也就是+15。
在always塊內(nèi)的每一個信號都必須是reg類型。
integer
:寄存器數(shù)據(jù)類型,有符號數(shù),最小為32位,與宿主機的字的位數(shù)。
parameter
:定義常量,用來提高代碼的可讀性和可維護(hù)性
- reg 型和 wire 型的區(qū)別:reg 型保持最后一次的賦值,而 wire 型則需要持續(xù)的驅(qū)動。
- reg, integer, real,time 都是寄存器數(shù)據(jù)類型,定義在 Verilog 中用來保存數(shù)值的變量,和實際的硬件電路中的寄存器有區(qū)別。
- reg、integer是可綜合的,time(64位)不可綜合,real(32位)由仿真器決定。
四、條件語句
1、條件語句必須在過程塊中使用,其他地方不可以。
2、0、z、X都是假,只有1條件才為真
3、出現(xiàn)鎖存器的情況:
- if else沒有寫完整
- always里面,如果給定條件下變量沒有被賦值,這個變量將一直保持原來的值,就會生成鎖存器
- 有else不一定沒有鎖存器,沒有else也不一定有鎖存器。
4、case語句如果情況完備,可以不寫default
五、循環(huán)語句
1、for
for
:for循環(huán)幾次,就會把電路復(fù)制幾次,循環(huán)次數(shù)越多,面積越大,綜合越慢
2、generate
generate
:生成可配置的、可綜合的RTL設(shè)計結(jié)構(gòu)。在elaboration階段、仿真之前執(zhí)行,必須保證generate的所有表達(dá)式都是常量
應(yīng)用場景:
- 多次實例化某個模塊
- 條件generate,if-generate或者case-generate
- 斷言
module n_bit_xor
#(parameter SIZE = 16)
(input [SIZE-1:0] a,input [SIZE-1:0] b,output [SIZE-1:0] y
);genvar i;generatefor(i=0;i<SIZE;i=i+1)begin:label //這里一定要寫模塊名稱,否則會報錯xor u_xor(y[i], a[i], b[i]);//會實例化生成label[0].u_xor、label[1].u_xor、label[2].u_xor//實例化后的層次路徑為n_bit_xor.label[0].u_xorendendgenerate
endmodule
六、function和task
function | task |
---|---|
只能用于組合邏輯 | 組合邏輯和時序邏輯都可以,但只有組合邏輯才能綜合 |
可以有/無返回值,缺失則返回一位寄存器類型數(shù)據(jù) | 無返回值 |
只能出現(xiàn)在過程塊內(nèi),不能出現(xiàn)initial和always | |
至少有一個輸入 | 多個輸入/輸出/雙向端口 |
只能調(diào)用函數(shù) | 可以調(diào)用函數(shù)/任務(wù) |
不包含時間控制語句 | 可包含時延控制語句(不可綜合) |
七、initial和always
1、initial和always相同點和區(qū)別
之前在SV語法的這篇文章里面有:傳送門
initial
:初始化仿真變量,作為電路的仿真信號來生成激勵
always
:邊沿觸發(fā)和電平觸發(fā),可綜合成寄存器或者鎖存器
2、always和assign語句區(qū)別
- assign語句賦值的信號類型為wire,always塊里面是reg類型,但是不是真的寄存器,只有當(dāng)always的觸發(fā)條件為時鐘上升沿,才會被綜合為觸發(fā)器
- 當(dāng)仿真時,a=0,但是b是不定態(tài)。因為b的觸發(fā)條件是always內(nèi)的所有輸入信號發(fā)生改變,才會變化,而1‘b0始終是不變的
assign a = 1'b0;always@(*)b = 1'b0;