verilog中generate语句的用法

更新时间:2023-05-18 19:32:30 阅读: 评论:0

verilog中generate语句的⽤法杭椒炒蛋
generate为verilog中的⽣成语句,当对⽮量中的多个位进⾏重复操作时,或者当进⾏多个模块的实例引⽤的重复操作时,或者根据参数的定义来确定程序中是否应该包含某段Verilog代码的时候,使⽤⽣成语句能⼤⼤简化程序的编写过程。
Verilog-2001添加了generate循环,允许产⽣module和primitive的多个实例化,generate语句的最主要功能就是对module、reg、assign、always、task等语句或者模块进⾏复制。
在generate语句中可以引⼊if-el和ca语句,根据条件不同产⽣不同的实例化。
在设计中,很多情况下需要编写很多结构相同但是参数不同的赋值语句或者逻辑语句,如果在参数量很⼤的的情况下,原本的列举就会显得⼼有余⽽⼒不⾜。c语⾔中常⽤for语句来解决此类问题,verilog则为我们提供了generate语句。
⼀、⽤法
1. generate语句有generate_for、generate_if、generate_ca三种语句。
2. generate for语句必须有genvar关键字定义for的变量
3. for 的内容必须加begin和end
4. 必须给for语段起个名字
⼆、⽣成语句⽣成的实例范围
关键字generate-endgenerate⽤来指定该范围。⽣成实例可以是以下的⼀个或多个类型:
(1)模块;(2)⽤户定义原语;(3)门级语句;(4)连续赋值语句;(5)initial和always块。
三、三种语句的区别
3.1 generate-for语句
(1) 必须有genvar关键字定义for语句的变量。
(2)for语句的内容必须加begin和end(即使就⼀句)。
(3)for语句必须有个名字。
例1:利⽤generate_for来复制assign语句
module test(bin,gray);
parameter SIZE=8;
output [SIZE-1:0] bin;人体乙术
input [SIZE-1:0] gray;
genvar i; //genvar i;也可以定义到generate语句⾥⾯
generate
for(i=0;i<SIZE;i=i+1)
begin:bit
得韵assign bin[i]=^gray[SIZE-1:i];
第二用英语怎么读
end
endgenerate
endmodule
等同于下⾯语句
module test(bin,gray);
parameter SIZE=8;
output [SIZE-1:0] bin;
input [SIZE-1:0] gray;
assign bin[0]=^gray[SIZE-1:0];
assign bin[1]=^gray[SIZE-1:1];
assign bin[2]=^gray[SIZE-1:2];
assign bin[3]=^gray[SIZE-1:3];
assign bin[4]=^gray[SIZE-1:4];
尬酒是什么意思assign bin[5]=^gray[SIZE-1:5];
assign bin[6]=^gray[SIZE-1:6];
assign bin[7]=^gray[SIZE-1:7];
endmodule
例2:利⽤generate_for来复制时序赋值语句
generate
genvar i;
for(i=0;i<SIZE;i=i+1)
begin:shifter
always@(podge clk)
shifter[i]<=(i==0)?din:shifter[i-1];
end
endgenerate
相当于
always@(podge clk)
begin
shifter[0]<=din;
shifter[1]<=shifter[0];
shifter[2]<=shifter[1];
... ...
shifter[SIZE]<=shifter[SIZE-1];
end
3.2 generate-if语句
例⼦:generate_for⽤于复制模块,⽽generate_if则是根据模块的参数(必须是常量)作为条件判断,来产⽣满⾜条件的电路。相当于判断语句。世界各国人口排名
module generate_if(
input    t0,
input    t1,
input    t2,
output    d
);
localparam    S = 6;            //定义模块所需参数,⽤于判断产⽣电路
generate
if(S < 7)
assign d = t0 | t1 | t2;
el
assign d = t0 & t1 & t2;
endgenerate
合成氨催化剂endmodule
3、generate_ca语句
generate_ca其实跟generate_if⼀样,都是根据参数(都必须为常量)作为判断条件,来产⽣满⾜条件的电路,不同于使⽤了ca语法⽽已。
例⼦:
module generate_ca(
接受自己的不完美input    t0,
input    t1,
input    t2,
output    d
);
localparam    S = 8;            //定义模块所需参数,⽤于判断产⽣电路
generate
ca(S)
0:
assign d = t0 | t1 | t2;
1:
assign d = t0 & t1 & t2;
default:
assign d = t0 & t1 | t2;
endca
endgenerate
endmodule
四、总结
之前⼀直在排斥对generate的使⽤,认为这种类似于c语⾔中for的循环语法并不适⽤于FPGA设计,因为FPGA实际上还是硬件,循环N 次,就会映射N个同样的模块到FPGA,也就是多消耗的N倍的资源,为了节约资源,经常选择复⽤的⽅式来处理类循环数据。
但是殊不知在处理循环数据的时候,还是会消耗⼀定的资源以及逻辑调试的时间成本,最终可能也节约不了多少资源,⽽且相⽐于处理逻辑,循环语句要简洁明了,便于代码的阅读和维护。
随着⼯艺⽔平的提升,资源貌似也并不是项⽬考虑的⾸要因素了,⼤家都会留出充⾜的余量,所以开始正视这种generate“⾮主流”verilog语法。

本文发布于:2023-05-18 19:32:30,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/685276.html

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

标签:语句   循环   定义   资源   参数   逻辑
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图