0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

電路和微電子考研 ? 來源:CSDN技術(shù)社區(qū) ? 2022-12-28 15:21 ? 次閱讀

Verilog-2005中有3個generate 語句可以用來很方便地實現(xiàn)重復(fù)賦值和例化(generate for)或根據(jù)條件選擇性地進行編譯(generate if和generate case)等功能。接下來就一起看下這3個語句的應(yīng)用場景和應(yīng)用方法吧。

PART ONE

generate for

假設(shè)我希望把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來實現(xiàn)異或功能。

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

1應(yīng)用場景

上面的例子限于篇幅我只假設(shè)了輸入為5bit的位寬,所以這樣寫并不會讓人覺得有多麻煩,但是假想一下如果位寬變成10、20、100呢?那我手不寫斷去?

當(dāng)你需要進行一些重復(fù)性的工作時,比如多次例化同一模塊、同一語句等,可以使用generate for語句來解放雙手,節(jié)省工作量。當(dāng)然你用腳本語言來生成或者直接用某些編輯器也能很快地實現(xiàn)這個功能,不過在這里我們就不提了。

上面的例子用generate for語句寫是這樣的:

module xor_test(

input[4:0]a,

input[4:0]b,

output[4:0]out

);

genvar i;//定義常量作為重復(fù)判斷條件

generate

for (i = 0; i < 8; i = i + 1)//重復(fù)條件

begin: XOR_INST//begin要起個名字

assignout[i] = a[i] ^ b[4-i];//需要重復(fù)的語句

end

endgenerate

endmodule

在vivado中分析出來是這樣的:(與上面的方式一致)

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

vivado綜合出來是這樣的:(仍然與上面的方式一致)

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

這樣看, generate for是個不錯的提高效率的方案。當(dāng)然,該語句不光可以對assign進行重復(fù)賦值,還適用以下場景:

(1)模塊module;(2)用戶定義原語UDP;(3)門級語句;(4)連續(xù)賦值語句assign;(5)initial和always塊。

2格式

generate for語句的一般用法:

// Declare the loop variable

genvar;

// Code for the

generate

for (;;) begin

// Code to execute

end

endgenerate

如果你是一個基于xilinx的開發(fā)者,可以使用vivado自帶的語法模板:

(1)打開語法模板:

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

(2)搜索generate:

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

(3)把上圖右側(cè)的語句復(fù)制到你自己的代碼里邊。

關(guān)于generate for語句的使用需要注意:

generate for 語句必須使用genvar關(guān)鍵字定義for循環(huán)變量

generate for 循環(huán)必須加 begin…end, 哪怕只有一句

不要使用 i++這種C語言式的自增語句(Verilog沒有i++這個語法),而是使用 i = i + 1

generate后不加begin,里面的語法:for循環(huán)、if…else…、case語句 后面的begin后面一定要加名字,且名字唯一,否則會導(dǎo)致無法比對通過的問題

過多的generate會導(dǎo)致收集覆蓋率緩慢,要注意使用

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;//根據(jù)POL的值來生成對應(yīng)的電路

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可以根據(jù)需要來靈活地生成對應(yīng)電路,不會浪費資源,適用于某些根據(jù)特定需求來實現(xiàn)電路的場景。而不使用該語句則會把所有潛在的電路均綜合出來,會使電路面積增大,但是靈活性卻較高。

這是vivado自帶的語法模板:

generate

if () begin:

;

end else if () begin:

;

end else begin:

;

end

endgenerate

PART TWO

generate case

generate case和generate if作用上是差不多的,都是用于選擇性綜合電路,區(qū)別就是if語句和case語句的區(qū)別,如果你會用其中一個,那另一個也很簡單,模板如下:

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;//根據(jù)POL的值來生成對應(yīng)的電路

generate

case(POL)

1'b1: begin: POL1

assignout = a + b;

end

1'b0: begin: POL0

assignout = a - b;

end

defaultDEFAULT end

endcase

endgenerate

endmodule

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1343

    瀏覽量

    109925
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    648

    瀏覽量

    32775
  • Vivado
    +關(guān)注

    關(guān)注

    19

    文章

    804

    瀏覽量

    66224

原文標(biāo)題:【科普】Verilog語法之generate for、generate if、generate case

文章出處:【微信號:feifeijiehaha,微信公眾號:電路和微電子考研】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Generate Waveform.vi

    Generate Waveform.vi
    發(fā)表于 07-09 11:09

    Veriloggenerate if 語句如何用systemc實現(xiàn)?

    Veriloggenerate if語句如何用systemc實現(xiàn)?例如:generateif (SIZE < 8)assign y = a & b & c;else
    發(fā)表于 08-28 12:06

    Veriloggenerate if語句如何用systemc實現(xiàn)?

    1.Veriloggenerate if語句如何用systemc實現(xiàn)?例如:generateif (SIZE < 8)assign y = a & b & c;else
    發(fā)表于 08-29 16:11

    【夢翼師兄今日分享】 generate語句塊的講解

    的列舉就會變得很笨拙甚至是不可行的。C語言處理這種問題通常情況下會使用如for循環(huán)語句來完成多次的相同操作。而verilog 語言呢?同樣的為我們提供了generate語句塊來幫助我們完成這些過程
    發(fā)表于 12-04 10:33

    veriloggenerate語句的用法分享

    generateverilog中的生成語句,當(dāng)對矢量中的多個位進行重復(fù)操作時,或者當(dāng)進行多個模塊的實例引用的重復(fù)操作時,或者根據(jù)參數(shù)的定義來確定程序中是否應(yīng)該包含某段Verilog代碼的時候
    發(fā)表于 12-23 16:59

    怎樣去使用在Verilog語法中的Generate for功能呢?有哪些注意事項

    Generate for的用法:對于FPGA工程師來講verilog語法可以說是不能再熟悉了,在veriloggenerate for可以
    發(fā)表于 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.
    發(fā)表于 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
    發(fā)表于 04-20 15:16 ?753次閱讀
    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
    發(fā)表于 04-23 16:16 ?1282次閱讀
    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
    發(fā)表于 05-07 09:16 ?2015次閱讀
    DAC and Op Amp <b class='flag-5'>Generate</b> Variab

    Delphi資源生成器Delphi Resource Generate免費下載

    Delphi Resource Generate用來生成我們經(jīng)常使用的資源文件。省去了去使用命令brcc32.exe的麻煩!提高效率很重要!
    發(fā)表于 12-12 14:54 ?1次下載
    Delphi資源生成器Delphi Resource <b class='flag-5'>Generate</b>免費下載

    Verilog generate語句的類型

    Generate 結(jié)構(gòu)在創(chuàng)建可配置的RTL的時候很有用。Generate loop能夠讓語句實例化多次,通過index來控制。而conditional generate能夠選擇性地實例化語句。最重要的是要記得對
    的頭像 發(fā)表于 03-16 14:34 ?2.1w次閱讀
    <b class='flag-5'>Verilog</b> <b class='flag-5'>generate</b>語句的類型

    generate語句的基本概念與用法

    生成語句(GENERATE)是一種可以建立重復(fù)結(jié)構(gòu)或者是在多個模塊的表示形式之間進行選擇的語句。由于生成語句可以用來產(chǎn)生多個相同的結(jié)構(gòu),因此使用生成語句就可以避免多段相同結(jié)構(gòu)的VHDL程序的重復(fù)書寫。 生成語句有兩種形式:FOR- GENERATE模式和IF-
    的頭像 發(fā)表于 11-21 07:08 ?5809次閱讀

    generate的用法與結(jié)構(gòu)

    主要是generate的用法,整個文件的功能是實現(xiàn)可選多通道數(shù)據(jù)發(fā)送,我們知道Cameralink中對于多通道傳輸時有一部分功能代碼時相同的,只不過需要多通道復(fù)用,我們知道generate有一個功能就是重復(fù)操作多個模塊的實例引用,當(dāng)然就適合本例程。
    的頭像 發(fā)表于 09-27 09:02 ?4353次閱讀

    時序分析基本概念介紹&lt;generate clock&gt;

    今天我們要介紹的時序分析概念是generate clock。中文名為生成時鐘。generate clock定義在sdc中,是一個重要的時鐘概念。
    的頭像 發(fā)表于 07-06 10:34 ?2139次閱讀
    時序分析基本概念介紹&lt;<b class='flag-5'>generate</b> clock&gt;