0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Verilog语法之generate for、generate if、generate case

电路和微电子考研 来源:CSDN技术社区 2022-12-28 15:21 次阅读

Verilog-2005中有3个generate 语句可以用来很方便地实现重复赋值和例化(generate for)或根据条件选择性地进行编译(generate if和generate case)等功能。接下来就一起看下这3个语句的应用场景和应用方法吧。

PART ONE

generate for

假设我希望把2个输入a[4:0]和b[4:0]做一个异或操作,但是顺序要颠倒,也就是这样:

module xor_test(

input[4:0]a,

input[4:0]b,

output[4:0]out);

assignout[4] = a[4] ^ b[0];

assignout[3] = a[3] ^ b[1];

assignout[2] = a[2] ^ b[2];

assignout[1] = a[1] ^ b[3];

assignout[0] = a[0] ^ b[4];

endmodule

在vivado中分析出来是这样的:很简单就是两个输出的不同为做一个异或运算。

871fc956-8673-11ed-bfe3-dac502259ad0.png

vivado综合出来是这样的:用了几个LUT来实现异或功能。

87375788-8673-11ed-bfe3-dac502259ad0.png

1应用场景

上面的例子限于篇幅我只假设了输入为5bit的位宽,所以这样写并不会让人觉得有多麻烦,但是假想一下如果位宽变成10、20、100呢?那我手不写断去?

当你需要进行一些重复性的工作时,比如多次例化同一模块、同一语句等,可以使用generate for语句来解放双手,节省工作量。当然你用脚本语言来生成或者直接用某些编辑器也能很快地实现这个功能,不过在这里我们就不提了。

上面的例子用generate for语句写是这样的:

module xor_test(

input[4:0]a,

input[4:0]b,

output[4:0]out

);

genvar i;//定义常量作为重复判断条件

generate

for (i = 0; i < 8; i = i + 1)//重复条件

begin: XOR_INST//begin要起个名字

assignout[i] = a[i] ^ b[4-i];//需要重复的语句

end

endgenerate

endmodule

在vivado中分析出来是这样的:(与上面的方式一致)

875a2dbc-8673-11ed-bfe3-dac502259ad0.png

vivado综合出来是这样的:(仍然与上面的方式一致)

876f8874-8673-11ed-bfe3-dac502259ad0.png

这样看, generate for是个不错的提高效率的方案。当然,该语句不光可以对assign进行重复赋值,还适用以下场景:

(1)模块module;(2)用户定义原语UDP;(3)门级语句;(4)连续赋值语句assign;(5)initial和always块。

2格式

generate for语句的一般用法:

// Declare the loop variable

genvar;

// Code for the

generate

for (;;) begin

// Code to execute

end

endgenerate

如果你是一个基于xilinx的开发者,可以使用vivado自带的语法模板:

(1)打开语法模板:

8790b512-8673-11ed-bfe3-dac502259ad0.png

(2)搜索generate:

87ba5e80-8673-11ed-bfe3-dac502259ad0.png

(3)把上图右侧的语句复制到你自己的代码里边。

关于generate for语句的使用需要注意:

generate for 语句必须使用genvar关键字定义for循环变量

generate for 循环必须加 begin…end, 哪怕只有一句

不要使用 i++这种C语言式的自增语句(Verilog没有i++这个语法),而是使用 i = i + 1

generate后不加begin,里面的语法:for循环、if…else…、case语句 后面的begin后面一定要加名字,且名字唯一,否则会导致无法比对通过的问题

过多的generate会导致收集覆盖率缓慢,要注意使用

PART TWO

generate if

generate if的使用场景和条件编译语句类似,比如你的代码中包含了一个加法模块和一个减法模块,对于2个输入a和b,希望使用POL来进行控制:如POL=1则进行加法,反之亦然----POL=1----out = a + b;POL=0----out = a - b。

代码是这样写的:

module xor_test(

input[4:0]a,

input[4:0]b,

output[4:0]out

);

localparamintegerPOL = 1;//根据POL的值来生成对应的电路

generate

if (POL == 1) begin: POL1

assignout = a + b;

end else begin: POL0

assignout = a - b;

end

endgenerate

endmodule

定义成POL = 1时会由vivado综合成一个加法器:

87f0ba02-8673-11ed-bfe3-dac502259ad0.png

定义成POL = 0时则会由vivado综合成一个减法器:

8820fc3a-8673-11ed-bfe3-dac502259ad0.png

假如不使用generate if语法,则代码是这样的:

module xor_test(

input[4:0]a,

input[4:0]b,

inputPOL,

outputreg[4:0]out

);

always@(*)begin

if(POL == 1)

out = a + b;

else

out = a - b;

end

endmodule

这样综合出来的就是加法电路和减法电路一起:

8840964e-8673-11ed-bfe3-dac502259ad0.png

使用generate if可以根据需要来灵活地生成对应电路,不会浪费资源,适用于某些根据特定需求来实现电路的场景。而不使用该语句则会把所有潜在的电路均综合出来,会使电路面积增大,但是灵活性却较高。

这是vivado自带的语法模板:

generate

if () begin:

;

end else if () begin:

;

end else begin:

;

end

endgenerate

PART TWO

generate case

generate case和generate if作用上是差不多的,都是用于选择性综合电路,区别就是if语句和case语句的区别,如果你会用其中一个,那另一个也很简单,模板如下:

generate

case ()

: begin:

end

: begin:

end

default: begin:

end

endcase

endgenerate

上面的例子照着改就是这样了:

module xor_test(

input[4:0]a,

input[4:0]b,

output[4:0]out

);

localparamintegerPOL = 1;//根据POL的值来生成对应的电路

generate

case(POL)

1'b1: begin: POL1

assignout = a + b;

end

1'b0: begin: POL0

assignout = a - b;

end

defaultDEFAULT end

endcase

endgenerate

endmodule

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1352

    浏览量

    110478
  • 编译
    +关注

    关注

    0

    文章

    663

    浏览量

    33077
  • Vivado
    +关注

    关注

    19

    文章

    815

    浏览量

    66944

原文标题:【科普】Verilog语法之generate for、generate if、generate case

文章出处:【微信号:feifeijiehaha,微信公众号:电路和微电子考研】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    相关推荐

    Generate Waveform.vi

    Generate Waveform.vi
    发表于 07-09 11:09

    Veriloggenerate if 语句如何用systemc实现?

    Veriloggenerate if语句如何用systemc实现?例如:generateif (SIZE < 8)assign y = a & b & c;else
    发表于 08-28 12:06

    Veriloggenerate if语句如何用systemc实现?

    1.Veriloggenerate if语句如何用systemc实现?例如:generateif (SIZE < 8)assign y = a & b & c;else
    发表于 08-29 16:11

    【梦翼师兄今日分享】 generate语句块的讲解

    的列举就会变得很笨拙甚至是不可行的。C语言处理这种问题通常情况下会使用如for循环语句来完成多次的相同操作。而verilog 语言呢?同样的为我们提供了generate语句块来帮助我们完成这些过程
    发表于 12-04 10:33

    veriloggenerate语句的用法分享

    generateverilog中的生成语句,当对矢量中的多个位进行重复操作时,或者当进行多个模块的实例引用的重复操作时,或者根据参数的定义来确定程序中是否应该包含某段Verilog代码的时候
    发表于 12-23 16:59

    怎样去使用在Verilog语法中的Generate for功能呢?有哪些注意事项

    Generate for的用法:对于FPGA工程师来讲verilog语法可以说是不能再熟悉了,在veriloggenerate for可以
    发表于 08-02 14:57

    Using References to Generate O

    This application report describes the process for using references to generate offsets forTexas Instrument’s TLC55XX family data converters.
    发表于 06-02 08:39 13次下载

    DAC and Op Amp Generate Variab

    Abstract: This design idea describes a simple circuit to generate a programmable negative control
    发表于 04-20 15:16 773次阅读
    DAC and Op Amp <b class='flag-5'>Generate</b> Variab

    How to Generate PWM Waveforms

    of microcontrollers to generate desired PWM waveforms. The action will require that the compare functionality be enabled. The note includes
    发表于 04-23 16:16 1320次阅读
    How to <b class='flag-5'>Generate</b> PWM Waveforms

    DAC and Op Amp Generate Variab

    Abstract: This design idea describes a simple circuit to generate a programmable negative control
    发表于 05-07 09:16 2081次阅读
    DAC and Op Amp <b class='flag-5'>Generate</b> Variab

    Delphi资源生成器Delphi Resource Generate免费下载

    Delphi Resource Generate用来生成我们经常使用的资源文件。省去了去使用命令brcc32.exe的麻烦!提高效率很重要!
    发表于 12-12 14:54 1次下载
    Delphi资源生成器Delphi Resource <b class='flag-5'>Generate</b>免费下载

    Verilog generate语句的类型

    Generate 结构在创建可配置的RTL的时候很有用。Generate loop能够让语句实例化多次,通过index来控制。而conditional generate能够选择性地实例化语句。最重要的是要记得对
    的头像 发表于 03-16 14:34 2.2w次阅读
    <b class='flag-5'>Verilog</b> <b class='flag-5'>generate</b>语句的类型

    generate语句的基本概念与用法

    生成语句(GENERATE)是一种可以建立重复结构或者是在多个模块的表示形式之间进行选择的语句。由于生成语句可以用来产生多个相同的结构,因此使用生成语句就可以避免多段相同结构的VHDL程序的重复书写。 生成语句有两种形式:FOR- GENERATE模式和IF-
    的头像 发表于 11-21 07:08 5992次阅读

    generate的用法与结构

    主要是generate的用法,整个文件的功能是实现可选多通道数据发送,我们知道Cameralink中对于多通道传输时有一部分功能代码时相同的,只不过需要多通道复用,我们知道generate有一个功能就是重复操作多个模块的实例引用,当然就适合本例程。
    的头像 发表于 09-27 09:02 4730次阅读

    时序分析基本概念介绍&lt;generate clock&gt;

    今天我们要介绍的时序分析概念是generate clock。中文名为生成时钟。generate clock定义在sdc中,是一个重要的时钟概念。
    的头像 发表于 07-06 10:34 2471次阅读
    时序分析基本概念介绍&lt;<b class='flag-5'>generate</b> clock&gt;