專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

芯片設(shè)計(jì):verilog語(yǔ)法

作者:白櫟旸   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月30日   【字體:

 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}是反向的。
 
關(guān)閉窗口

相關(guān)文章