1. 組合邏輯:assign wire = 。。。。。。;
2. 時(shí)序邏輯:always @(敏感列表) begin end
always @(*) begin end
3. module name #(parameters) (signals); .............. endmodule
4. for 循環(huán):
genvar i;
generate
for(i=0;i<10;i=i+1)
begin
always .....
assign .....
end
endgenerate
while()
begin
.....................
end
5. case({list})
stat1:
stat2:
default:
endcase
6. task模塊:task模塊如果用到不可綜合的語(yǔ)句,就無(wú)法綜合,只能用在system verilog中用于描述行為。
task一般用在仿真里,在RTL不推薦使用。
從C語(yǔ)言的角度講,task相當(dāng)于一個(gè)函數(shù),被調(diào)用時(shí)方可執(zhí)行。
【task的一般格式】:
task ts_name; // ts_name后面不列輸入輸出信號(hào)列表
input .....
output .....
電路描述
endtask
task 中不能包含 initial 和 always 塊。但反過(guò)來(lái),always塊中可以包含task,task中甚至可以用<=.
task 的output必須是個(gè)reg,而不是wire。
【task的調(diào)用格式】:
時(shí)序邏輯:
always @(..........)
begin
ts_name(list); //沒(méi)有task字樣,只有task的名字,list包括輸入和輸出
end //輸出必須是reg
組合邏輯:
ts_name(list); //沒(méi)有明顯的賦值格式
這是人家對(duì)task的簡(jiǎn)單評(píng)價(jià):“用task只能得到最終的一個(gè)值,不能得到連續(xù)值。所以task適合在某個(gè)時(shí)刻給某個(gè)信號(hào)賦值,而不適合給某個(gè)信號(hào)在一段時(shí)間內(nèi)不間斷的賦值,要實(shí)現(xiàn)仿真,只能把task的內(nèi)容提到上層中。”所以task一般不用在RTL中。
7. function:功能跟task一樣,但可用于RTL代碼中,一般FIFO中的GRAY編碼和解碼使用function編寫。
task的輸出列在列表中,所以可以是多個(gè),而function的輸出就是function本身,只有一個(gè)輸出。
【funciton的一般格式】:
function wire [1:0] func_name; //如果不寫wire [1:0],默認(rèn)為reg [0:0]
input ........; //注意,沒(méi)有output
電路描述
func_name = ....; //最后總要得到結(jié)果
endfunction
function只能用來(lái)表示組合邏輯,表示時(shí)不用assign,也不用always。
【function的調(diào)用格式】
(1) assign a = func_name(input_list);
(2) always @()
a <= func_name(input_list);
(3) initial
a = func_name(input_list);
【舉例】
function [3:0] junc;
input a,b,c,d;
reg [3:0] a1; //這里的a1,b1,c1,d1能寫成reg,不能寫成wire
reg [3:0] b1;
reg [3:0] c1;
reg [3:0] d1;
a1 = {3'b0,a};
b1 = {3'b0,b};
c1 = {3'b0,c};
d1 = {3'b0,d};
junc = a1+(b1<<1)+(c1<<2)+(d1<<3);
$display(junc);
上例用for循環(huán)做,和C語(yǔ)言一樣:
parameter NUM1 = 3;
function [NUM1:0] junc1;
input [NUM1:0] a;
reg [NUM1:0] b[NUM1:0];
int cnt; //支持int,但不可綜合
for(cnt=0;cnt<=NUM1;cnt++)
b[cnt] = {{NUM1{1'b0}},a[cnt]};
junc1 = b[0];
for(cnt=1;cnt<=NUM1;cnt++)
junc1 += b[cnt]<<cnt;
$display("addr=",junc1);
endfunction
注意: 可綜合的function中不支持generate塊。
可綜合的function中電路描述必須被 begin 。。。。。end 包裹。
可綜合的function中不支持int,但可以用integer代替。不如對(duì)for循環(huán)進(jìn)行計(jì)數(shù)時(shí)。
8. 定義宏:
`define ABC
`ifdef ABC
`elsif CCC //不是elseif,而是elsif,和perl一樣。
`endif
`ifndef ABC ....................
`include ..................
9. 數(shù)碼順序:就是DSP中所謂大端小端的問(wèn)題,
verilog中,如定義 4比特信號(hào) a = {1,0,1,0} , 則 a 表示的是4'b1010,而不是4'b0101。a[0] 是 0 而不是1,所以{1,0,1,0}只是4'b1010的一種表示方法,和C語(yǔ)言中初始化數(shù)組的{1,0,1,0}是反向的。