摘要:本文主要讲解了generate与genvar的用法,并且给出了详细的一些例子和用法,可以通过阅读本文基本了解其用法和规则。
generate语法可以实现某些语句的重复。genvar与generate是Verilog 2001才有的,功能非常强大,可以配合条件语句,分支语句等做一些有规律地例化或者赋值等操作;对于提高简洁代码很有帮助,同时也减少了人为的影响。
generate语法有generate for、generate if和generate case这3种。可以在generate中时钟的语法语句包括module(模块)、UDP(用户自定义原语)、门级原语、连续赋值语句、always语句和initial语句等。使用generate时,需要定义genvar作为generate的循环变量。其语法结构如下:
接下来将提供3个示例代码来体会如何使用genvar以及generate。
示例代码1:
module vlg_design(
input i_clk,
input i_rst_n,
input i_data,
output o_data
);
parameter DATA_SIZE=8;
reg [DATA_SIZE-1:0] r_data;
always @(posedge clk) begin
r_data[0] <= i_data;
end
assign o_data = r_data[DATA_SIZE-1];
genvar i;
generate
for(i=1; i<DATA_SIZE; i=i+1) begin
always @(posedge i_clk) begin
if(!i_rst_n) r_data[i] <= 1'b0;
else r_data[i] <= r_data[i-1];
end
end
endgenerate
endmodule
示例代码2:
module vlg_design #(parameter integer DATA_SIZE=8)
( input i_clk,
input i_en,
output reg o_vld,
input [DATA_SIZE-1:0] i_gray_code,
output reg [DATA_SIZE-1:0] o_bin_data
);
always @(posedge i_clk) begin
o_vld <= i_en;
end
genvar i;
generate
for(i=0; i<DATA_SIZE; i=i+1) begin
always @(posedge i_clk) begin
if(i_en) o_bin_data[i] <= ^i_gray_code[DATA_SIZE-1:i];
else o_bin_data[i] <= 'b0;
end
end
endgenerate
endmodule
示例代码3:
module pulse_counter(
input i_clk,
input i_rst_n,
input i_pulse,
input i_en,
output reg[15:0] o_pulse_cnt
);
reg [1:0] r_pulse;
wire w_rise_edge;
always @(posedge i_clk) begin
if(!i_rst_n) r_pulse <= 2'b00;
else r_pulse <= {r_pulse[0] , i_pulse};
end
assign w_rise_edge = r_pulse[0] & ~r_pulse[1];
always @(posedge i_clk) begin
if(i_en) begin
if(w_rise_edge) o_pulse_cnt <= o_pulse_cnt;
else o_pulse_cnt <= o_pulse_cnt;
end
else o_pulse_cnt <= 'b0;
end
endmodule
module vlg_design(
input i_clk,
input i_rst_n,
input [15:0] i_pulse,
input i_en,
output [15:0] o_pulse_cnt0,
output [15:0] o_pulse_cnt1,
output [15:0] o_pulse_cnt2,
output [15:0] o_pulse_cnt3,
output [15:0] o_pulse_cnt4,
output [15:0] o_pulse_cnt5,
output [15:0] o_pulse_cnt6,
output [15:0] o_pulse_cnt7,
output [15:0] o_pulse_cnt8,
output [15:0] o_pulse_cnt9,
output [15:0] o_pulse_cnta,
output [15:0] o_pulse_cntb,
output [15:0] o_pulse_cntc,
output [15:0] o_pulse_cntd,
output [15:0] o_pulse_cnte,
output [15:0] o_pulse_cntf
);
wire [15:0] r_pulse_cnt [15:0];
genvar i;
generate
for(i=0; i<16; i=i+1) begin
pulse_counter uut1_pulse_counter(
.i_clk(i_clk),
.i_rst_n(i_rst_n),
.i_pulse(i_pulse[i]),
.i_en(i_en),
.o_pulse_cnt(r_pulse_cnt[i])
);
end
endgenerate
assign o_pulse_cnt0=r_pulse_cnt[0];
assign o_pulse_cnt1=r_pulse_cnt[1];
assign o_pulse_cnt2=r_pulse_cnt[2];
assign o_pulse_cnt3=r_pulse_cnt[3];
assign o_pulse_cnt4=r_pulse_cnt[4];
assign o_pulse_cnt5=r_pulse_cnt[5];
assign o_pulse_cnt6=r_pulse_cnt[6];
assign o_pulse_cnt7=r_pulse_cnt[7];
assign o_pulse_cnt8=r_pulse_cnt[8];
assign o_pulse_cnt9=r_pulse_cnt[9];
assign o_pulse_cnta=r_pulse_cnt[a];
assign o_pulse_cntb=r_pulse_cnt[b];
assign o_pulse_cntc=r_pulse_cnt[c];
assign o_pulse_cntd=r_pulse_cnt[d];
assign o_pulse_cnte=r_pulse_cnt[e];
assign o_pulse_cntf=r_pulse_cnt[f];
endmodule
End!
标签:语句,clk,reg,Verilog,input,genvar,generate From: https://blog.csdn.net/qq_59846104/article/details/144890305