周末闲记

106 阅读2分钟

1 generate

1 generate for: 使用前需要声明一个genvar变量,用于for循环判断,一个genvar变量可用于多个generate循环,使用同一个genvar变量的generate语句不能相互嵌套。 在generate for结构中,可以对generate块命名。

 genvar i;
 generate 
     (for i = 0;i<15;i++)
     begin:XorLoop
         always@(posedge Clk)
             if(Rst)
                Dout[i] <= 'd0;
             else
                Dout[i] <= Din0[i]^Din1[i];         
     end
endgenerate

genvar i;
generate
    for(i=0;i<2;i=i+1)
    begin:Loop
        Vesa VesaInst(
        .din(din1[i]),
        .dout(dout1[i])
        );
    end
    
endgenerate

2 generate if: 不需要genvar所以可以不对generate块命名,可以不用begin,end。 在generate if中通过判断语句最多执行一个代码块。

判断条件必须为常量

parameter InputMode = Ddr;
generate 
    if(InputMode == Ddr) begin:In0
        DdrMode DdrModeInst(
        .Clk(InClk),
        .Rst(InRst)
        );
    end
    else if(InputMode == Sdr) begin:In1
        SdrMode SdrModeInst(
        .Clk(InClk),
        .Rst(InRst)
        );
    end
endgenerate
        

3 generate case:

generate case 和generate if一样,判断条件都必须为常量。

parameter Mode = 1;
generate 
    case(Mode)
        0: 
        begin:Mode0
             DdrMode DdrModeInst(
        .Clk(InClk),
        .Rst(InRst)
        );
        end
        1:
        begin:Mode1
             SdrMode SdrModeInst(
        .Clk(InClk),
        .Rst(InRst)
        );
        end
       default:begin:Moede0
           DdrMode DdrModeInst(
        .Clk(InClk),
        .Rst(InRst)
        );
       end
    endcase
    
endgenerate
         

2 参数 1 parameter

可以在模块端口定义.

module Ddr#(parameter Width = 'd8,parameter Depth = 'd512 )
();
endmodule

例化调用:

Ddr DdrInst#(.Width(),.Depth())();
Ddr DdrInst#(.Depth())();
Ddr DdrInst#((),())();

①parameter可以在例化端口时,对其的值进行修改。 ②例化后,用defparam DdrInst.Width = 4,defparam DdrInst.Depth = 10

2 localparam 用于参数不变的情况,如状态机的状态,其值的改变只能通过parmeter进行传递。

localparam [3:0]IDLE = 'b0001; // 参数定义后就只能在本地使用。

3 integer verilog中线网型变量被综合成wire,寄存器可能被综合成wire,寄存器,锁存器,还有可能被优化掉。

其中integer用来表示整数型,通常用于计数器,延时等电路中。表示有符号整数,位宽为32bit。 for循环时候,循环变量用integer类型。 integer i;

for(i=0;i<5;i=i+1)

3 `ifdef

条件编译,与define 配合使用。 define simulation 1'b0

ifdef simulationon always@(*) a <= b; else always@(*) a<=c; `endif

ifdef on assign a<=d; endif

ifdef in assgin a<=e; elsif out assign a <=l; else assign a <= i; endif

4 function

函数用于返回一个表达式的值 module test(input [1:0]a);

assign c = ADD(a);

function [7:0] ADD; input [1:0]Num;

case(NUM)
    0: ADD 'd1;
    1: ADD 'd2;
    default: Temp = 'd1

endcase endfunction

endmodule

5 打拍


reg [2:0] Cnt;

always@(posegde Clk)
    if(Rst)
        Cnt <= 'd0;
    else
        Cnt <= {Cnt[1:0],data}
        
       
reg [1:0] cnt1;

always@(posegde Clk)
    if(Rst)
        Cnt1<= 'd0;
    else
        Cnt1<= {Cnt[0],data}

6 +: ,reg数组为ram或者rom

verilog通过+: 和-:实现位宽选择

Cnt[0+:8] 表示位宽为8的。 -----Cnt[7:0]

Cnt [15-:8] 表示位宽为8的 -----cnt[15:8]

reg [7:0] Count[7:0] 8个8bit数组

reg [7:0] Count[8]

调用: assign c = Count[4][5] 第四组第五位