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] 第四组第五位