Verilog:generate-for 语句(用法,及与for语句区别)

21 篇文章 23 订阅
订阅专栏


参考链接:https://www.cnblogs.com/nanoty/archive/2012/11/13/2768933.html

Abtract

generate语句允许细化时间(Elaboration-time)的选取或者某些语句的重复。这些语句可以包括模块实例引用的语句、连续赋值语句、always语句、initial语句和门级实例引用语句等。细化时间是指仿真开始前的一个阶段,此时所有的设计模块已经被链接到一起,并完成层次的引用。

1、generate语法

  • 定义genvar,作为generate种的循环变量。
  • generate语句中定义的for语句,必须要有begin,为后续增加标签做准备。
  • begin必须要有名称,也就是必须要有标签,因为标签会作为generate循环的实例名称。

可以使用在generate语句中的类型主要有:

  • module(模块)
  • UDP(用户自定义原语)
  • 门级原语
  • 连续赋值语句
  • initial或always语句

基本结构如下:

genvar 循环变量名;
generate

    // generate循环语句

    // generate 条件语句

    // generate 分支语句

    // 嵌套的generate语句

endgenerate

2、generate常用的几种情况举例说明

1). generate-for循环语句

在这里插入图片描述

2).generate-conditional条件语句

generate允许对语句进行条件选择,即将条件选择加入到generate中的for循环中,只例化条件成立时对应的语句或者module。
在这里插入图片描述
注意:generate-if中的条件只能是静态变量,如 genvar,parameter 等,可以这样想,Verilog是要综合为固定的硬件电路的,不能因为条件不同而综合的电路结构变化,所以静态变量才能保证电路结构相同。

// 错误代码:这样电路肯定会报错 a is not a constant
generate
	if(a=b)
	begin:a_equals_b
		adder adder_u(.add1(a),.add1(c),.sum(sum));
	end
	else
	begin
		adder adder_u(.add1(a),.add1(b),.sum(sum1));
		adder adder_u(.add1(sum1),.add1(c),.sum(sum));
	end
endgenerate

换一种写法

// 先加了再说,取想要的结果
adder adder_u(.add1(a),.add1('b0),.sum(sum1));
adder adder_u(.add1(sum1),.add1(c),.sum(sum2));

adder adder_u(.add1(a),.add1(b),.sum(sum3));
adder adder_u(.add1(sum3),.add1(c),.sum(sum4));

always@(posedge clk)
begin
   if(a==b)
   	sum <= sum2;
   else
   	sum <= sum4
end

更简单的写法

// 就两个加法器,根据操作数的不同送入不同操作数
assign temp = (a=b)?'b:sum1;

adder adder_u(.add1(a),.add1(temp),.sum(sum1));
adder adder_u(.add1(sum1),.add1(c),.sum(sum));

3).generate-case分支语句

generate-case分支语句与generate-条件语句类似,只不过将原来的分支语句换做了case语句。
在这里插入图片描述

3、Conclusion

genvar与generate是Verilog 2001才有的,功能非常强大,可以配合条件语句、分支语句等做一些有规律的例化或者赋值等操作,对于提高简洁代码很有帮助,同时也减少了人为的影响。

4、generate-for 与 常规for 循环不同

参考链接:https://blog.csdn.net/shnhwdj1984/article/details/80849828

1)使用举例

// generate-for 循环
reg [3:0] temp;
genvar i;
generate
for (i = 0; i < 3 ; i = i + 1) begin: 
    always @(posedge sysclk) begin
        temp[i] <= 1'b0;
    end
end
endgenerate
// for 循环
reg [3:0] temp;
genvar i;
always @(posedge sysclk) begin
  for (i = 0; i < 3 ; i = i + 1) begin: 
    temp[i] <= 1'b0;
    end
end

2)结论

1、循环体

  • generate-for 循环:每个 iteration 产生一个实例(对应上述 always 模块),故上述 generate-for 循环产生了3个 always实例;
  • for循环:由于for 循环在 always 模块内部,只产生一个 always 实例

2、须使用 generate-for 的情况

  • 循环内、条件语句内,模块调用
  • 模块物理结构随参数变化的情形
// 循环中进行模块实例化
module A();
..
endmodule;
 
module B();
parameter NUM_OF_A_MODULES = 2; // should be overriden from higher hierarchy
genvar i;

generate
	for (i=0 i<NUM_OF_A_MODULES; i=i+1) 
	begin : label
  		A A_inst();
	end
endgenerate

endmodule;

常规 for 循环不能产生 NUM_OF_A_MODULES个实例

3、物理结构

  • generate-for 循环适用于物理结构随参数变化的模块。如 选择时钟上升沿或下降沿有效
if (param_use_pos == 1) begin : use_pos
	always @(posedge sysclk) begin
		...
	end
end
else begin : use_neg
	always @(negedge sysclk) begin
		...
	end
end
  • for 循环:适用于物理结构不变的。推荐 在 always 模块内部使用 for语句 和 条件语句。虽然综合结果相同,但是仿真时,non-generate 模块方法速度更快。(一般,仿真器处理一个 N-bit 操作比处理 N个1bit操作更快)
/ faster :: 1 always block, simulator can optimize the for loop
always @(posedge sysclk) begin 
  for (i = 0; i < 3 ; i = i + 1) begin
    temp[i] <= 1'b0;
  end
end

// slower :: creates 4 always blocks, harder for the simulator to optimize
genvar i;
generate // optional if > *-2001
for (i = 0; i < 3 ; i = i + 1) begin 
    always @(posedge sysclk) begin
        temp[i] <= 1'b0;
    end
end
endgenerate // match generate

关于generate-for 和 for 循环对always、assign语句的作用对比,可参考文章 Verilog:generate-for-always 语句用法对比与说明

Veriloggenerate和for循环的一些使用总结(1)
moon9999的博客
06-26 5万+
前言 之前使用generate和for时候一直糊里糊涂的使用,所以今天静下心来总结一下,顺便看看有哪些坑。 做一个模块,输入为多路data通过bit map型vld信号作为标记,输出为单路data,取多路信息中port num值最大的那一路数据,同时输出这一拍共多少路有数据; 信号 端口 位宽 含义 in_vld input PORT_NUM bitmap型vld信号,每一bit标志一路数据有效 in_data input PORT_NUM *
Verilog-generate语句用法
05-20
非常棒,非常详细的讲解呢,
搞定Verilog中的generate ,参数传递,for的用法
08-05
新工作第一天,看了看别人的代码,发现自己对于Verilog语言还是有很多不清晰的地方,谨以此篇博客。希望自己能够搞清楚一些不清晰地东西。即使将来忘了回过头来再看看也能够马上回忆起来。废话结束。上正文。
verilog中的generate代码循环例化应用
最新发布
wangfandashe的博客
03-04 413
代码1,这段代码在运行是,从第二次输入起,最低位每次都多1。两端verilog代码之间的区别
veriloggenerate的循环(generate for)和条件分支(generate if 、generate case)的使用方法
weixin_47730622的博客
09-07 4763
generate的循环(generate for)和条件分支(generate if 、generate case)的使用方法
Verilog语法generate_for的使用
yh13572438258的博客
12-03 7550
一、generate简介 Verilog中的generate语句常用于编写可配置的、可综合的RTL的设计结构。它可用于创建模块的多个实例化,或者有条件的实例化代码块。generate有多种用法,一个是构造条件generate结构,用来在多个块之间最多选择一个代码块,条件generate结构包含if--generate结构和case--generate形式。常用的generate_for语句类似于c语言中常用for语句。 二、generate_for循环语句 必须使用genvar申明一个正整数变量,用作
Verilog中for/generate语句
青春易逝,愿不负昭华,期待梦与远方
02-28 4856
目录 1、for语句 2、generate语句 2.1 循环生成语句 2.2条件生成语句 2.3case生成语句 参考《Verilog 数字系统设计》 1、for语句 在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别。 在Verilog中除了在Testbench(仿真测试激励...
牛客刷题<八>使用generate...for语句简化语句
mxh3600的博客
08-19 923
使用generate...for简化代码
Veriloggenerate用法
03-18
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语段起个名字
verilog generatefor语句用法
笨蛋大乌龟的博客
12-24 1万+
这篇博客转载自:https://wenku.baidu.com/view/b7d08952be23482fb4da4c15.html 需要注意三点: ①  generate-for语句必须用genvar关键字定义for的索引变量; ② for的内容必须用begin…end块包起来,哪怕只有一句; ③ begin…end块必须起个名字; 例如:一个参数化的gray-code to bina...
Veriloggenerate for的用法
Master_0_的博客
11-09 1204
Veriloggenerate用法 必须用genvar来定义i begin:后边必须加一个名字,随便起一个???? 一种用法: genvar i; generate for( i=1; i<=99; i=i+1) begin:add1 assign sum[i] = a[i] ^ b[i]^ cout[i-1]; assign cout[i] = a[i]&b[i] | a[i]&cout[i-1] | b[i]&cout[
Verilog HDL行为建模--- 顺序语句
12-09
这里主要讲Verilog HDL 的顺序语句块(begin . . . end) :语句块中的语句按给定次序顺序执行。顺序语句块中的语句按顺序方式执行。每条语句中的时延值与其前面的语句执行的模拟时间相关。一旦顺序语句块执行结束,...
Matlab代码verilog-Verilog-HDL:程序-VerilogHDL
05-27
Matlab代码verilog Verilog-HDL 该存储库包含有关Verilog HDL的程序 学习Verilog-HDL的资源 Verilog-HDL简介 Verilog是一种硬件描述语言(HDL)。 它是用于描述数字系统(如网络交换机或微处理器或存储器或触发器)...
Matlab代码verilog-Rob-Bara-College-Coding-Portfolio:Rob-Bara-College-Codi
05-27
Matlab代码verilog Rob-Bara-College-Coding-Portfolio 罗伯·巴拉(Rob L. Bara)的进步大学作品集。 该档案夹展示了我在大学期间创建的各种实验室报告,其中大部分报告从提交之日起就未经编辑,因此您可以了解我...
Verilog语法之generate for、generate if、generate case
热门推荐
孤独的单刀
12-08 1万+
Verilog语法之generate for、generate if、generate case
generate for例化——Verilog语言练习
m0_37602715的博客
07-12 815
HDLBits题目Bcdadd4: You are provided with a BCD (binary-coded decimal) one-digit adder named bcd_fadd that adds two BCD digits and carry-in, and produces a sum and carry-out. module bcd_fadd { input [3:0] a, input [3:0] b, input cin, output cout, outpu
Verilog中浅谈for与generate for
qq_44816673的博客
12-02 8638
标题 简介 在C语言或者其他编程语言中for语句往往用作循环语句,但是在硬件电路Verilog 中一般不在可综合代码中使用,因为for循环会被综合器展开为所有变量情况的执行语句 ,每个变量独立占用寄存器资源,每条执行语并不能有效地复用硬件逻辑资源,造成巨大的资源浪费。 简单的说就是:for语句循环几次,就是将相同的电路复制几次,因此循环次数越多,占用面积越大, 综合就越慢。for语句的一般 使用 情况: 在testbench中 使用 ,往往用于激励信号的生成。 在for循环中需要用到Integer,Inte
VL8 使用generate_for语句简化代码
毕淑敏曾说过:“我不相信命运,我只相信自己的手;我不相信手掌上的纹路,但我相信手指加上手掌的力量”。在这个快节奏的社会,只有自己能力不足才会被卷,踏踏实实沉下心来学一些技术,及时记录,方便以后复盘。
10-02 9289
使用generatefor语句编写代码,替代该语句,要求不能改变原module的功能,列巨额了generate的几种用法,最终搭建的Testbench代码覆盖率达到100%
【FPGA/verilog -入门学习5】verilog中的genrate for 和for 以及数组的用法
cengqiu4314的博客
12-09 3702
本文参考:verilog generate语法总结-CSDN博客Verilog数组赋值_笔记大全_设计学院在Verilog中,和都是用于循环的结构,但是它们具有不同的应用场合和语义。循环:循环主要用于行为描述(behavioral description),通常用于描述算法或数学运算。循环在仿真时执行,因此,任何在循环中使用的变量都必须是仿真时间可访问的。循环通常在初始化代码或在行为模型中使用,不适用于综合。示例: generate for的用法 循环:循环用于结构描述(structural desc
verilog generate for用法
03-16
Verilog中的generate for语句用于在编译时生成多个实例。它可以用于生成多个模块实例、寄存器、电路等。generate for语句的语法如下: generate for (generate_variable_assignment; generate_condition; generate_variable_iteration) begin // 生成的代码 end endgenerate 其中,generate_variable_assignment是生成变量的初始值,generate_condition是生成条件,generate_variable_iteration是生成变量的迭代方式。在生成的代码中,可以使用generate_variable_iteration来引用生成变量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Verilog:generate-for 语句(用法,及与for语句区别) 27030
  • 深度学习中的Tensor 数据格式(N,C,H,W) 18211
  • Verilog:generate、for、always 语句用法与电路结构对比 16764
  • sdc:基本的时序路径约束 10820
  • 腾讯会议分享屏幕,隐藏演讲者模式 9789

分类专栏

  • 工具 8篇
  • 数字IC设计 15篇
  • 计算机网络
  • 总线 1篇
  • 通信 1篇
  • Verilog电路设计 21篇
  • NFC
  • c语言
  • 数字IC验证 3篇

最新评论

  • Verilog:generate、for、always 语句用法与电路结构对比

    qq_29183759: 您好,想请问3.1,如果使用genvar 为什么会报错呀

  • Tcl教程1

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性。

  • Verilog3-glitch_free_clock_switching(无毛刺时钟切换电路)

    打工仔1111: 看着像是这个地方写错了,第二个是下降沿触发

  • 深度学习中的Tensor 数据格式(N,C,H,W)

    qq_39824515: 如果是N,C,HW 这样的格式,它又代表什么呢

  • 深度学习中的Tensor 数据格式(N,C,H,W)

    qq_39824515: 厉害厉害,一下子就清楚了

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 通信、NFC相关概念和术语
  • IC常用工具、Timegen、Verdi使用
  • DW-AHB Central DMAC
2024年2篇
2023年3篇
2022年9篇
2021年10篇
2020年26篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源时尚美发店起名蛛丝马迹电影兄弟起名商标起名测名称李姓女羊宝宝起名头等舱机票李氏男孩起名字大全开店怎样起名大全玉蒲团1kawaks1.45魔兽地图u9公司起名核名查询系统dreamweavercc辛夷的起名古诗词起公司名车姓 起名何瑞贤任长霞电视剧全集nba2k13修改器freeadultgame严起名沙盘软件楚云瑶墨凌渊小说免费阅读更新人人贷怎样梦见吃鱼qq男生伤感头像大全一起工作的同事群名万界圆梦师诸天以剑问道欣的组词起名淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化