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

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

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

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

OpenFPGA ? 來(lái)源:OpenFPGA ? 作者:OpenFPGA ? 2022-09-27 09:02 ? 次閱讀

Verilog我思我用】-generate

在使用xilinx官方例程《XAPP585》實(shí)現(xiàn)CameraLink接口發(fā)送或者接收數(shù)據(jù)時(shí),有個(gè)程序還是值得學(xué)習(xí)的,下面把這段程序截出來(lái):

genvari;
genvarj;

generate
for(i=0;i<=?(N-1)?;?i?=?i+1)
begin?:?loop0

serdes_7_to_1_diff_sdr?#(
???????.D???(D),
???????.DATA_FORMAT??(DATA_FORMAT))
dataout?(
?.dataout_p????(dataout_p[D*(i+1)-1:D*i]),
?.dataout_n????(dataout_n[D*(i+1)-1:D*i]),
?.clkout_p????(clkout_p[i]),
?.clkout_n????(clkout_n[i]),
?.txclk??????(txclk),
?.pixel_clk??????(pixel_clk),
?.reset?????(reset),
?.clk_pattern????(clk_pattern),
?.datain????(datain[(D*(i+1)*7)-1:D*i*7]));??
end
endgenerate?

主要是generate的用法,整個(gè)文件的功能是實(shí)現(xiàn)可選多通道數(shù)據(jù)發(fā)送,我們知道Cameralink中對(duì)于多通道傳輸時(shí)有一部分功能代碼時(shí)相同的,只不過(guò)需要多通道復(fù)用,我們知道generate有一個(gè)功能就是重復(fù)操作多個(gè)模塊的實(shí)例引用,當(dāng)然就適合本例程。

下面我們先講一講generate的用法再結(jié)合代碼簡(jiǎn)單講解一下,對(duì)于generate其實(shí)很好理解,只不過(guò)寫出來(lái)比較難。

generate用法

關(guān)鍵字generate和endgenerate(和begin / end類似)作為使用語(yǔ)法的起點(diǎn),有三種衍生結(jié)構(gòu),分別為:

generate - for 語(yǔ)句結(jié)構(gòu)

generate - if 語(yǔ)句結(jié)構(gòu)

generate - case 語(yǔ)句結(jié)構(gòu)

使用generate的情況主要如下:

使用 for 循環(huán)對(duì)模塊進(jìn)行多次相似實(shí)例化

使用參數(shù)更改模塊的結(jié)構(gòu)或設(shè)計(jì)

使用帶有斷言語(yǔ)句進(jìn)行功能和形式驗(yàn)證

e1e816aa-3dfc-11ed-9e49-dac502259ad0.png

在這里我們思考一下,generate是在運(yùn)行中構(gòu)造重復(fù)模塊嗎??

答案是否定的,generate語(yǔ)句不是運(yùn)行時(shí)構(gòu)造。如果你想一想,這個(gè)generate結(jié)構(gòu)實(shí)際上是在創(chuàng)建一個(gè)重復(fù)電路,我們不能即時(shí)添加或刪除硬件電路,所以generate在綜合過(guò)程中其實(shí)是重復(fù)構(gòu)造相似電路,而不是在運(yùn)行時(shí)構(gòu)造。

下面先按照generate結(jié)構(gòu)分別舉例,然后舉例幾個(gè)常用案例。

generate - for語(yǔ)句結(jié)構(gòu)

在使用generate - for語(yǔ)句之前,我們需要先聲明一個(gè)變量genvar,用于for循環(huán)語(yǔ)句進(jìn)行判斷。

下面舉兩個(gè)不同應(yīng)用的例子:

e20e0716-3dfc-11ed-9e49-dac502259ad0.png


e229bcae-3dfc-11ed-9e49-dac502259ad0.png

上面兩個(gè)模塊功能一樣,第一個(gè)是對(duì)always 塊進(jìn)行了循環(huán);第二個(gè)則是對(duì)實(shí)例化時(shí)的模塊進(jìn)行了循環(huán)。xorLoop 是 generate 語(yǔ)句模塊名,目的是通過(guò)它對(duì)循環(huán)語(yǔ)句進(jìn)行層次化引用,所以在上面栗子中的 xorLoop 模塊相對(duì)層次名為 xorLoop[0].u_xor(后面會(huì)舉例說(shuō)明)

這里在對(duì)比兩個(gè)常見(jiàn)的例子:

e254afae-3dfc-11ed-9e49-dac502259ad0.png

上面的例子功能也一樣,一個(gè)使用generate...for語(yǔ)句一個(gè)使用for語(yǔ)句,關(guān)于這兩者區(qū)別我會(huì)在文章最后總結(jié)里說(shuō)明,大家可以自己先思考。

generate - if語(yǔ)句結(jié)構(gòu)

generate -if 語(yǔ)句結(jié)構(gòu)比較寬松,即不需要對(duì)不需要對(duì)generate語(yǔ)句進(jìn)行命名(generate...for主要是對(duì)循環(huán)語(yǔ)句進(jìn)行層次化引用) ,也不需要變量genvar。由于 generate - if 語(yǔ)句結(jié)構(gòu)是通過(guò)判斷語(yǔ)句執(zhí)行代碼塊,這就決定了每次最多執(zhí)行一個(gè)代碼塊,這種情況下,可以對(duì)各個(gè)代碼塊使用相同命名是合法的,且有助于保持對(duì)代碼的層次化引用。

需要注意的一點(diǎn)是,在 generate 塊中的判斷條件必須是常量!

e2729a82-3dfc-11ed-9e49-dac502259ad0.png

generate - case

generate - case 語(yǔ)句和 generate - if 語(yǔ)句核心思想都是進(jìn)行條件判斷,用法基本一致。

和 generate - if 語(yǔ)句一樣,case 判斷條件必須是常量。

e2aadde8-3dfc-11ed-9e49-dac502259ad0.png

下面按照應(yīng)用場(chǎng)景舉例:

循環(huán)生成構(gòu)造

循環(huán)生成構(gòu)造提供了一種簡(jiǎn)單而簡(jiǎn)潔的方法來(lái)創(chuàng)建模塊項(xiàng)的多個(gè)實(shí)例,例如模塊實(shí)例、分配語(yǔ)句、斷言、接口實(shí)例等。你可以把它想象成一臺(tái)“克隆機(jī)”。

本質(zhì)上,它是一種特殊類型的for循環(huán),其循環(huán)索引變量為 datatype genvar。這是一個(gè)有趣的事實(shí)- genvar它是一個(gè)整數(shù)數(shù)據(jù)類型,僅在綜合時(shí)存在并在運(yùn)行時(shí)消失。

我們看到的《XAPP585》的例程就是這種運(yùn)行結(jié)構(gòu),下面再舉例看下該語(yǔ)句的特點(diǎn):

/**Example1*/
/**
*16inputmux
*
*ExampleofhowtouseLoopGenerateConstruct
*/
modulemux_16(
inputlogic[0:15][127:0]mux_in,
inputlogic[3:0]select,
outputlogic[127:0]mux_out
);

logic[0:15][127:0]temp;

//Thefor-loopcreates16assignstatements
genvari;
generate
for(i=0;i

仿真文件如下:

`timescale1ns/1ps
/**
*Testbenchtoexercisethemux_16module.
*Hereweinstantiatethemux4times.Eachinstanceis
*fedadifferentinputwithdifferentinput`select`and
*theoutputisobserved.
*/
moduletb_mux_16;

logicclk;
logic[0:15][127:0]test_in[4];
logic[3:0]test_select[4];
logic[127:0]test_out[4];

inti,j,k;

initialbegin
clk=0;
forever#1nsclk=~clk;
end

initialbegin
//Setinputs
for(i=0;i

我們還可以嵌套generate...for 循環(huán)。只需確保genvars將外部循環(huán)和內(nèi)部循環(huán)分開(kāi)使用,并在嵌套的 for 循環(huán)中引用這些變量時(shí)要小心,這是一個(gè)經(jīng)常犯錯(cuò)誤的地方。

條件生成構(gòu)造

條件生成構(gòu)造允許根據(jù)在模塊實(shí)例化期間傳遞的參數(shù)值更改設(shè)計(jì)結(jié)構(gòu)。這在為設(shè)計(jì)創(chuàng)建參數(shù)化通用 RTL 模塊時(shí)非常有用。

一個(gè)簡(jiǎn)單的例子:

/**Example2.1*/
/**
*Asimplegenerateexample.ThisparamerterOPERATION_TYPE,
*passedwhenthismoduleisinstantiated,isusedtoselect
*theoperationbetweeninputs`a`and`b`.
*/
moduleconditional_generate
#(parameterOPERATION_TYPE=0)
(
inputlogic[31:0]a,
inputlogic[31:0]b,
outputlogic[63:0]z
);

//Thegenerate-endgeneratekeywordsareoptional.
//Itistheactofdoingaconditionaloperation
//onaparameterthatmakesthisagenerateblock.
generate
if(OPERATION_TYPE==0)begin
assignz=a+b;
end
elseif(OPERATION_TYPE==1)begin
assignz=a-b;
end
elseif(OPERATION_TYPE==2)begin
assignz=(a<

另一個(gè)例子 - 我們需要?jiǎng)?chuàng)建一個(gè)通用 CRC 生成器的任務(wù)。團(tuán)隊(duì)中的其他設(shè)計(jì)人員應(yīng)該能夠在 3 個(gè)多項(xiàng)式中選擇 1 個(gè)進(jìn)行 CRC 計(jì)算。

這是一種方法 - 提供一個(gè)名為 CRC_SEL 的參數(shù),該參數(shù)在此模塊實(shí)例化時(shí)使用,此CRC_SEL參數(shù)用來(lái)選擇在模塊中生成哪個(gè) CRC 函數(shù)。通過(guò)使用generate而不是簡(jiǎn)單的多路復(fù)用器,可以節(jié)省一堆門電路和觸發(fā)器,因?yàn)椴恍枰?CRC 函數(shù)不會(huì)被實(shí)例化。

e2d490ca-3dfc-11ed-9e49-dac502259ad0.png

完整代碼如下:

/**
*CRCgeneratormodule.Selectthedesiredpolynomial
*usingtheCRC_SELparameter.
*
*Defaultpolynomial:x^16+x^15+x^2+1
*CRC_SEL=0:x^16+x^1+1
*CRC_SEL=1:x^16+x^12+x^5+1
*
*USAGE:
*+Strobe`start`whendrivingthefirstvalidbyte
*+Strobe`done`oneclkafterdrivingthelastvalidbyte
*+ThefinalCRCisavailable1clkafterthelastvalidbyte
*isdriven.Thisisthesamecycleyou'lldrive`done`.
*
*/
modulecrc_gen
#(parameterCRC_SEL=0)
(
inputlogicclk,
inputlogicrst,
inputlogicstart,
inputlogicdone,
inputlogic[7:0]data_in,
inputlogic[15:0]crc_in,
outputlogic[15:0]crc_out
);

logic[7:0]data_in_d;
logic[15:0]crc_in_d;

assigncrc_in_d=(start|done)?16'd0:crc_in;
assigndata_in_d=(done)?8'd0:data_in;
always_ff@(posedgeclk)begin
if(rst)begin
crc_out<=?'d0;
????????end
????????else?begin
????????????//?Generate?blocks?are?always?assigned?a?name.?If
????????????//?you?don't?name?the?generate?block,?it?will?be
????????????//?given?a?default?auto?generated?name.
????????????//
????????????//?To?invoke?a?function?within?a?generate?block,
????????????//?hierarchically?call?it?
????????????//?.
crc_out<=?crc_poly.nextCRC16_D8(data_in_d,?crc_in_d);
????????end
????end

????//?Once?again?the?generate-endgenerate?keywords?are?optional
????//?It?is?the?act?of?using?a?parameter,?CRC_SEL,?in?the?case
????//?statement?that?makes?it?a?generate?block
????//
????//?Also?notice?how?all?the?generate?blocks?are?given?the?same
????//?name?`crc_poly`?and?all?the?function?names?are?the?same
????//?`nextCRC16_D8`.?This?is?correct?because?only?one?of?the
????//?function?declarations?is?compiled?in?during?elaboration
????//?phase.
????generate
????case?(CRC_SEL)
????????0:?
????????begin:?crc_poly
????????????//?polynomial:?x^16?+?x^1?+?1
????????????//?data?width:?8
????????????//?convention:?the?first?serial?bit?is?D[7]
????????????function?automatic?[15:0]?nextCRC16_D8;
????????????
????????????????input?[7:0]?Data;
????????????????input?[15:0]?crc;
????????????????reg?[7:0]?d;
????????????????reg?[15:0]?c;
????????????????reg?[15:0]?newcrc;

????????????????d?=?Data;
????????????????c?=?crc;
????????????????
????????????????newcrc[0]?=?d[0]?^?c[8];
????????????????newcrc[1]?=?d[1]?^?d[0]?^?c[8]?^?c[9];
????????????????newcrc[2]?=?d[2]?^?d[1]?^?c[9]?^?c[10];
????????????????newcrc[3]?=?d[3]?^?d[2]?^?c[10]?^?c[11];
????????????????newcrc[4]?=?d[4]?^?d[3]?^?c[11]?^?c[12];
????????????????newcrc[5]?=?d[5]?^?d[4]?^?c[12]?^?c[13];
????????????????newcrc[6]?=?d[6]?^?d[5]?^?c[13]?^?c[14];
????????????????newcrc[7]?=?d[7]?^?d[6]?^?c[14]?^?c[15];
????????????????newcrc[8]?=?d[7]?^?c[0]?^?c[15];
????????????????newcrc[9]?=?c[1];
????????????????newcrc[10]?=?c[2];
????????????????newcrc[11]?=?c[3];
????????????????newcrc[12]?=?c[4];
????????????????newcrc[13]?=?c[5];
????????????????newcrc[14]?=?c[6];
????????????????newcrc[15]?=?c[7];
????????????????nextCRC16_D8?=?newcrc;
????????????endfunction
????????end
????????1:
????????begin:?crc_poly
????????????//?polynomial:?x^16?+?x^12?+?x^5?+?1
????????????//?data?width:?8
????????????//?convention:?the?first?serial?bit?is?D[7]
????????????function?automatic?[15:0]?nextCRC16_D8;
????????????
????????????????input?[7:0]?Data;
????????????????input?[15:0]?crc;
????????????????reg?[7:0]?d;
????????????????reg?[15:0]?c;
????????????????reg?[15:0]?newcrc;

????????????????d?=?Data;
????????????????c?=?crc;
????????????????
????????????????newcrc[0]?=?d[4]?^?d[0]?^?c[8]?^?c[12];
????????????????newcrc[1]?=?d[5]?^?d[1]?^?c[9]?^?c[13];
????????????????newcrc[2]?=?d[6]?^?d[2]?^?c[10]?^?c[14];
????????????????newcrc[3]?=?d[7]?^?d[3]?^?c[11]?^?c[15];
????????????????newcrc[4]?=?d[4]?^?c[12];
????????????????newcrc[5]?=?d[5]?^?d[4]?^?d[0]?^?c[8]?^?c[12]?^?c[13];
????????????????newcrc[6]?=?d[6]?^?d[5]?^?d[1]?^?c[9]?^?c[13]?^?c[14];
????????????????newcrc[7]?=?d[7]?^?d[6]?^?d[2]?^?c[10]?^?c[14]?^?c[15];
????????????????newcrc[8]?=?d[7]?^?d[3]?^?c[0]?^?c[11]?^?c[15];
????????????????newcrc[9]?=?d[4]?^?c[1]?^?c[12];
????????????????newcrc[10]?=?d[5]?^?c[2]?^?c[13];
????????????????newcrc[11]?=?d[6]?^?c[3]?^?c[14];
????????????????newcrc[12]?=?d[7]?^?d[4]?^?d[0]?^?c[4]?^?c[8]?^?c[12]?^?c[15];
????????????????newcrc[13]?=?d[5]?^?d[1]?^?c[5]?^?c[9]?^?c[13];
????????????????newcrc[14]?=?d[6]?^?d[2]?^?c[6]?^?c[10]?^?c[14];
????????????????newcrc[15]?=?d[7]?^?d[3]?^?c[7]?^?c[11]?^?c[15];
????????????????nextCRC16_D8?=?newcrc;
????????????endfunction
????????end
????????default:?
????????????begin:?crc_poly
????????????//?polynomial:?x^16?+?x^15?+?x^2?+?1
????????????//?data?width:?8
????????????//?convention:?the?first?serial?bit?is?D[7]
????????????function?automatic?[15:0]?nextCRC16_D8;
????????????
????????????????input?[7:0]?Data;
????????????????input?[15:0]?crc;
????????????????reg?[7:0]?d;
????????????????reg?[15:0]?c;
????????????????reg?[15:0]?newcrc;

????????????????d?=?Data;
????????????????c?=?crc;
????????????????
????????????????newcrc[0]?=?d[7]?^?d[6]?^?d[5]?^?d[4]?^?d[3]?^?d[2]?^?d[1]?^?d[0]?^?c[8]?^?c[9]?^?c[10]?^?c[11]?^?c[12]?^?c[13]?^?c[14]?^?c[15];
????????????????newcrc[1]?=?d[7]?^?d[6]?^?d[5]?^?d[4]?^?d[3]?^?d[2]?^?d[1]?^?c[9]?^?c[10]?^?c[11]?^?c[12]?^?c[13]?^?c[14]?^?c[15];
????????????????newcrc[2]?=?d[1]?^?d[0]?^?c[8]?^?c[9];
????????????????newcrc[3]?=?d[2]?^?d[1]?^?c[9]?^?c[10];
????????????????newcrc[4]?=?d[3]?^?d[2]?^?c[10]?^?c[11];
????????????????newcrc[5]?=?d[4]?^?d[3]?^?c[11]?^?c[12];
????????????????newcrc[6]?=?d[5]?^?d[4]?^?c[12]?^?c[13];
????????????????newcrc[7]?=?d[6]?^?d[5]?^?c[13]?^?c[14];
????????????????newcrc[8]?=?d[7]?^?d[6]?^?c[0]?^?c[14]?^?c[15];
????????????????newcrc[9]?=?d[7]?^?c[1]?^?c[15];
????????????????newcrc[10]?=?c[2];
????????????????newcrc[11]?=?c[3];
????????????????newcrc[12]?=?c[4];
????????????????newcrc[13]?=?c[5];
????????????????newcrc[14]?=?c[6];
????????????????newcrc[15]?=?d[7]?^?d[6]?^?d[5]?^?d[4]?^?d[3]?^?d[2]?^?d[1]?^?d[0]?^?c[7]?^?c[8]?^?c[9]?^?c[10]?^?c[11]?^?c[12]?^?c[13]?^?c[14]?^?c[15];
????????????????nextCRC16_D8?=?newcrc;
????????????endfunction
????????end
????endcase
????endgenerate

endmodule:?crc_gen

下面是仿真文件及結(jié)果:

`timescale1ns/1ps
/**
*Testbenchtoexercisethemux_16module.
*Hereweinstantiatethemux4times.Eachinstanceis
*fedadifferentinputwithdifferentinput`select`and
*theoutputisobserved.
*/
moduletb_mux_16;

logicclk;
logic[0:15][127:0]test_in[4];
logic[3:0]test_select[4];
logic[127:0]test_out[4];

inti,j,k;

initialbegin
clk=0;
forever#1nsclk=~clk;
end

initialbegin
//Setinputs
for(i=0;i
e3cfa3a2-3dfc-11ed-9e49-dac502259ad0.png

斷言和形式驗(yàn)證

generate - case 語(yǔ)句結(jié)構(gòu)在編寫斷言時(shí)也非常有用,這反過(guò)來(lái)有助于形式驗(yàn)證。

如果對(duì)形式驗(yàn)證有任何經(jīng)驗(yàn),那么就會(huì)知道形式工具在嘗試證明屬性時(shí)很快就會(huì)遇到計(jì)算界限。因此,重要的是要保持屬性簡(jiǎn)短而簡(jiǎn)單。

例如,如果有一個(gè)具有 8 個(gè) REQquest 輸入和 8 個(gè) ACK 輸出的仲裁器塊,那么與其編寫單個(gè)斷言來(lái)覆蓋所有 8 個(gè) REQ/ACK 對(duì),不如將其分解為具有 1 個(gè) REQ/ACK 的 8 個(gè)單獨(dú)的斷言對(duì)。

/**Example3.1*/
genvark;
generate
for(k=0;kack[k]);
end
endgenerate

分層訪問(wèn)生成塊

絆倒人們的一件事是如何訪問(wèn)位于生成塊內(nèi)的模塊項(xiàng)。

生成塊有一個(gè)名字。如果不為其命名,編譯器將自動(dòng)分配一個(gè)通用名稱,例如genblk01,genblk02通常必須轉(zhuǎn)儲(chǔ) wave 并查看Visualizer工具以查看分配了哪些名稱。

要訪問(wèn)生成塊中的模塊項(xiàng),必須分層訪問(wèn)它.。

這是來(lái)自 SystemVerilog LRM 1800-2012 的一個(gè)很好的示例(示例 4 第 27.5 節(jié))。查看如何訪問(wèn)塊中定義的任務(wù)和模塊實(shí)例。

分層實(shí)例名稱為:

memory.word16[3].p,memory.word16[2].p,
memory.word16[1].p,memory.word16[0].p,
/**Example4*/
moduledimm(addr,ba,rasx,casx,csx,wex,cke,clk,dqm,data,dev_id);
parameter[31:0]MEM_WIDTH=16,MEM_SIZE=8;
...
genvari;
case({MEM_SIZE,MEM_WIDTH})
{32'd8,32'd16}://8Megx16bitswide
begin:memory
for(i=0;i<4;?i=i+1)?begin:word16
????????????????sms_08b216t0?p(.clk(clk),?.csb(csx),?.cke(cke),.ba(ba),
????????????????????.addr(addr),?.rasb(rasx),?.casb(casx),
????????????????????.web(wex),?.udqm(dqm[2*i+1]),?.ldqm(dqm[2*i]),
????????????????????.dqi(data[15+16*i:16*i]),?.dev_id(dev_id));
????????????????//?The?hierarchical?instance?names?are:
????????????????//?memory.word16[3].p,?memory.word16[2].p,
????????????????//?memory.word16[1].p,?memory.word16[0].p,
????????????????//?and?the?task?memory.read_mem
????????????end
????????????task?read_mem;
????????????????input?[31:0]?address;
????????????????output?[63:0]?data;
????????????????begin?//?call?read_mem?in?sms?module
????????????????????word[3].p.read_mem(address,?data[63:48]);
????????????????????word[2].p.read_mem(address,?data[47:32]);
????????????????????word[1].p.read_mem(address,?data[31:16]);
????????????????????word[0].p.read_mem(address,?data[15:?0]);
????????????????end
????????????endtask?
????????end
????...
????endcase
endmodule

總結(jié)

這篇文章是在閱讀《XAPP585》代碼時(shí)候看著generate語(yǔ)法極其方便,所以引出了該篇文章,下面說(shuō)下generate...for和for的區(qū)別:

首先第二個(gè)代碼時(shí)錯(cuò)誤的!

只有當(dāng) for 循環(huán)在 generate 中時(shí),才能將 always 放在 for 循環(huán)中!

generate for 循環(huán)和常規(guī) for 循環(huán)之間的主要區(qū)別在于 generate for 循環(huán)是為每次迭代生成一個(gè)實(shí)例。這意味著在示例中將有 3 個(gè) always 塊(與常規(guī)循環(huán)情況下的 1 個(gè)塊相反)。

一個(gè)更好的例子是:

moduleA();
..
endmodule;

moduleB();
parameterNUM_OF_A_MODULES=2;//shouldbeoverridenfromhigherhierarchy
genvari;
for(i=0i

在此示例中,常規(guī) for 無(wú)法完成創(chuàng)建 NUM_OF_A_MODULES 實(shí)例的工作。

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

    關(guān)注

    33

    文章

    8447

    瀏覽量

    150723
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6808

    瀏覽量

    88743
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4722

    瀏覽量

    68234

原文標(biāo)題:【Verilog我思我用】-generate

文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    定時(shí)器/計(jì)數(shù)器的 Programmable pulse generate (PPG) mode,尋求詳解!急?。?!

    generate (PPG) mode 不懂,希望得到幫助。還有,希望能有好心人推薦一些詳細(xì)介紹單片機(jī)硬件工作原理和用法的資料。 非常感謝!?。?/div>
    發(fā)表于 10-10 11:54

    Labview 事件結(jié)構(gòu)中級(jí)用法 ,用戶事件。

    Labview事件結(jié)構(gòu)中級(jí)用法,用戶事件。源代碼如下,版本是2015
    發(fā)表于 09-14 08:23

    verilog中generate語(yǔ)句的用法分享

    、assign、always、task等語(yǔ)句或者模塊進(jìn)行復(fù)制。在generate語(yǔ)句中可以引入if-else和case語(yǔ)句,根據(jù)條件不同產(chǎn)生不同的實(shí)例化。在設(shè)計(jì)中,很多情況下需要編寫很多結(jié)構(gòu)相同但是參數(shù)
    發(fā)表于 12-23 16:59

    講一講generate用法

    ), .clk_pattern (clk_pattern), .datain (datain[(D*(i+1)*7)-1:D*i*7]));endendgenerate主要是generate用法,整個(gè)
    發(fā)表于 09-29 15:06

    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

    Typedef用法小結(jié)

    非常不錯(cuò)的文檔有著基本數(shù)據(jù)類型結(jié)構(gòu)體enum與函數(shù)指針等等的Typedef相關(guān)用法.
    發(fā)表于 11-02 11:36 ?19次下載

    Delphi資源生成器Delphi Resource Generate免費(fèi)下載

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

    Verilog generate語(yǔ)句的類型

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

    generate語(yǔ)句的基本概念與用法

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

    C語(yǔ)言結(jié)構(gòu)用法很多,但是坑也很多

    C語(yǔ)言結(jié)構(gòu)用法很多,坑也很多
    的頭像 發(fā)表于 01-13 16:06 ?1258次閱讀

    Verilog語(yǔ)法之generate for、generate if、generate case

    Verilog-2005中有3個(gè)generate 語(yǔ)句可以用來(lái)很方便地實(shí)現(xiàn)重復(fù)賦值和例化(generate for)或根據(jù)條件選擇性地進(jìn)行編譯(generate if和generate
    的頭像 發(fā)表于 12-28 15:21 ?2632次閱讀

    探究寄存機(jī)的電路結(jié)構(gòu)以及慣常用法

    *本文將探究什么是寄存器,寄存器的電路結(jié)構(gòu),寄存器與內(nèi)存的異同以及寄存器的慣常用法。* ```
    的頭像 發(fā)表于 01-30 17:08 ?1049次閱讀
    探究寄存機(jī)的電路<b class='flag-5'>結(jié)構(gòu)</b>以及慣常<b class='flag-5'>用法</b>