Verilog中generate的用法


2023年12月15日发(作者:重的部首是什么)

一:generate

Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function,continous assignment,initial和always。在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。

用法:

1. generate语法有generate for, genreate if和generate case三种

2. generate for语句必须有genvar关键字定义for的变量

3. for 的内容必须加begin和end

4. 必须给for语段起个名字

例子:

1. generate for例子:

generate

genvar i; //generate 8 samll fifo for in_data[i] 8X72

for(i=0; i

small_fifo

#( .WIDTH(DATA_WIDTH+CTRL_WIDTH),

.MAX_DEPTH_BITS(2))

in_arb_fifo

(// Outputs

.dout ({fifo_out_ctrl[i], fifo_out_data[i]}),

.full (),

.nearly_full (nearly_full[i]),

.prog_full (),

.empty (empty[i]),

// Inputs

.din ({in_ctrl[i], in_data[i]}),

.wr_en (in_wr[i]),

.rd_en (rd_en[i]),

.reset (reset),

.clk (clk));

end // block: in_arb_queues

endgenerate

te if例子:

generate

if (REG_WIDTH == WRITE_WIDTH) begin : new_data_a_generation

assign new_data_a = merge_update ? merge_wr_data : held_wr_data_a;

end

else begin

assign new_data_a = merge_update ?

{{(REG_WIDTH - WRITE_WIDTH - 1){merge_wr_data_sign}},

merge_wr_data} :

{{(REG_WIDTH - WRITE_WIDTH){held_wr_data_sign_a}}, held_wr_data_a};

end

endgenerate

te还可以进行多个assign赋值!

module anytest_v(

input clk,

input[7:0] datain,

output[7:0] dataout,

output finish

);

wire[7:0] mem[31:0];

wire[32*8-1:0] xxx;

//reg[7:0] i;

generate

genvar i;

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

begin :wiertech

assign mem[i]= 8'b0;

end

endgenerate

endmodule

ps: 对于a[8*i+:8]

this is the so-called "Indexed vector part selects"

在Verilog-1995中,可以选择向量的任一位输出,也可以选择向量的连续几位输出,不过此时连续几位的始末数值的index需要是常量。而在Verilog-2001中,可以用变量作为index,进行part select。

[base_expr +: width_expr] //positive offset

[base_expr -: width_expr] //negative offset

其中base_expr可以是变量,而width_expr必须是常量。+:表示由base_expr向上增长width_expr位,-:表示由base_expr向上递减width_expr位。例如:

reg [63:0] word;

reg [3:0] byte_num; //a value from 0 to 7

wire [7:0] byteN = word[byte_num*8 +: 8];

如果byte_num的值为4,则word[39:32]赋值给byteN

二、参数传递

类似VHDL的Generic语句,Verilog也可以在例化时传递参数

传递的参数是子模块中定义的parameter。

传递的方法:

1、module_name #( parameter1, parameter2) inst_name( port_map);

2、module_name #( .parameter_name(para_value), .parameter_name(para_value)) inst_name (port

map);

用#方法和port map的写法差不多

module multiplier (a, b, product);

parameter a_width = 8, b_width = 8;

localparam product_width = a_width+b_width;

input [a_width-1:0] a;

input [b_width-1:0] b;

output[product_width-1:0]product;

generate

if((a_width < 8) || (b_width < 8))

CLA_multiplier #(a_width, b_width) u1 (a, b, product);

else

WALLACE_multiplier #(a_width, b_width) u1 (a, b, product);

endgenerate

endmodule


本文发布于:2024-09-25 17:11:23,感谢您对本站的认可!

本文链接:https://www.17tex.com/fanyi/3083.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:generate用法
标签:语句   产生   变量   传递   参数   需要   循环
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议