精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

技巧分享:如何在Vivado中正確使用接口

Xilinx賽靈思官微 ? 2019-07-02 12:03 ? 次閱讀

點擊上方“藍(lán)字”,輕松關(guān)注我們

01

什么是接口

SystemVerilog 接口的開發(fā)旨在讓設(shè)計中層級之間的連接變得更加輕松容易。 您可以把這類接口看作是多個模塊共有的引腳集合。與必須在每個模塊上定義多個引腳不同的是,您只需在接口中對引腳定義一次,之后只需在模塊上定義接口即可。 如果稍后接口中涉及的信號被更改,則僅需更改接口即可。

這樣就可以將大量信息壓縮到較少代碼行,但第一次寫接口可能會有點困難。在第一次看別人寫的接口時,也可能會很難進(jìn)行解讀。 本文將介紹接口的基礎(chǔ)知識以及如何在 Vivado 中正確使用接口。

我們將把一個沒有接口的小型測試用例轉(zhuǎn)換為使用接口的測試用例。 這個測試用例的示例 RTL 代碼將在本文的最后一節(jié)中介紹。

此原始測試用例的原理圖如下所示:

原始測試用例

02

定義接口

首先,必須先定義接口。 所需要的只是將被接口替換的多個模塊共有的信號名稱。 知道該列表后,接口聲明如下:

interface my_int;
logic sel;
logic [9:0] data1, data2, result;
endinterface : my_int

上面的代碼聲明了一個名為“my_int”的接口。 它還聲明了四個信號,一個稱為“sel”和三個稱為“data1”、“data2”和“result”的 10 位寬總線。這些是將被接口替換的模塊的引腳。請注意,即使在兩個模塊中都使用“clk”信號,此處接口也沒使用 clk 信號。 將控制信號放在接口中是可以的,但這是個人偏好的問題。本文作者更喜歡將時鐘信號與接口分開。

03

使用接口

一旦聲明了接口,就可以象使用模塊的任何端口一樣使用此接口。在下級模塊中將使用接口替換端口,編碼樣式應(yīng)更改如下:

原始版本:

module bottom2(
input clk,
input sel,
input [9:0] data1, data2,
output logic [9:0] result);

替換后版本:

module bottom2(
my_int int1,
input clk);

請注意,與將端口聲明為輸入或輸出不同的是,接口會被聲明為“my_int”(這是給接口指定的名稱)的類型, 而且還為其指定了一個實例名稱“int1”。

由于下級模塊的引腳已被移除,因此不能再以相同方式引用。 與直接引用引腳不同的是,他們需要基于接口名稱引用。

其語法是“.”。 例如,在原始 RTL 中,輸出“result”根據(jù)“sel”輸入被分配為“data1”或“data2”。

always@(posedge clk) begin
if (sel == 1)
result <= data1;
else
result <= data2;
end

現(xiàn)在,需要將其更改為以下內(nèi)容:

always@(posedge clk) begin
if (int1.sel == 1)
int1.result <= int1.data1;
else
int1.result <= int1.data2;
end

在下級模塊中將引腳更改為接口之后,對這些引腳的引用已被更改為引用接口,還需要修改將這些模塊實例化的上級模塊。

在使用接口之前,頂層的模塊引腳將連接到設(shè)計中聲明的信號。所以現(xiàn)在我們要連接接口,而不是要連接信號。首先需要做的事是聲明一個相同類型的接口。

my_int int3();

上面的代碼聲明了一個類型為“my_int”的接口,并為其指定了一個實例名稱“int3”。

和前面一樣,對此接口內(nèi)的信號的所有引用都需要使用“.”語法來完成。

接下來,下級模塊實例化。

bottom2 u1(int3,clk)

上面的 RTL 會對“bottom2”模塊進(jìn)行實例化,給它指定一個實例名稱“u1”。 在“bottom2”模塊中聲明的接口“int1”現(xiàn)在與已在上一層聲明的接口“int3”相關(guān)聯(lián)。 進(jìn)行這些更改后,設(shè)計的原理圖如下所示:

轉(zhuǎn)換為接口后的設(shè)計

04

添加 Modport

添加接口后,該工具已創(chuàng)建正確的連接,但您可能會注意到原理圖看起來有點奇怪。 來自兩個下級層次的“data1”和“data2”似乎正在驅(qū)動同一個網(wǎng)絡(luò)。如果您進(jìn)入這些下級模塊,您會看到?jīng)]有多驅(qū)動問題,因為其中一個模塊將“data1”和“data2”視為輸入。

原理圖看起來奇怪的原因是創(chuàng)建的接口沒有告訴工具哪些引腳在充當(dāng)輸入,哪些引腳在充當(dāng)輸出。 當(dāng)工具創(chuàng)建連接時,并明確知道如何連接引腳,因此它先建立了連接,然后在分析行為時才找出了引腳的方向。

雖然這樣可行,但還是強(qiáng)烈建議將接口的輸入/輸出信息提供給工具。這是通過使用 modport 來完成的。Modport 在接口內(nèi)部進(jìn)行聲明,告訴工具哪些信號是輸入,哪些是輸出。由于不同的模塊的引腳的方向各不相同,因此通常每個接口會聲明多個 modport。

modport 的語法是:

modport ( , ....);

例如,以下 RTL 創(chuàng)建了一個名為“b1”的 modport,并將 result 信號作為輸出,將其他信號都作為輸入信號。

modport b2 (input sel, data1, data2, output result)

然后,modport 被用于下層端口列表的接口聲明中。

module bottom2 (
my_int.b2 int1,
input clk);

上面的代碼告訴工具如下信息:

  • “bottom2”將使用接口“my_int”,并為其指定名為“int1”的實例名稱

  • 在此接口中,result 將是輸出

  • “sel”、“data1”和“data2”將是輸入。

更改完成后,新原理圖將如下所示:

添加 modport 后的設(shè)計

05

結(jié)論

編寫本文是為了說明接口在連接具有相似信號的邏輯時的用處,但這不是接口的唯一用途。 此外,接口可以使用包括任務(wù)和功能在內(nèi)的許多特性,甚至可以進(jìn)行參數(shù)化。

我們將在以后的文章中探討其他功能。

沒有接口的原始 RTL:

module bottom1 (
input clk,
input [9:0] d1, d2,
input s1,
input [9:0] result,
output logic sel,
output logic [9:0] data1, data2,
output logic equal);

always@(posedge clk) begin
if (d1 == d2)
equal <= 1;
else
equal <= 0;
end

always@(posedge clk) begin
if (s1 == 1) begin
data1 <= d1;
end
else begin
data2 <= d2;
end
end

always@(posedge clk) begin
sel <= ^result;
end

endmodule

module bottom2 (
input clk,
input sel,
input [9:0] data1, data2,
output logic [9:0] result );

always@(posedge clk) begin
if (sel == 1)
result <= data1;
else
result <= data2;
end

endmodule


module top (
input clk,
input s1,
input [9:0] d1, d2,
output my_sel,
output equal);

logic [9:0] data1, data2, result;
logic sel;

assign my_sel = sel;

bottom1 u0 (.clk(clk), .d1(d1), .d2(d2), .s1(s1), .result(result), .sel(sel), .data1(data1), .data2(data2), .equal(equal));
bottom2 u1 (.clk(clk), .sel(sel), .data1(data1), .data2(data2), .result(result));

endmodule

第一次添加接口的設(shè)計:

interface my_int;
logic sel;
logic [9:0] data1, data2, result;

endinterface : my_int

module bottom1 (
my_int int1,
input clk,
input [9:0] d1, d2,
input s1,
output logic equal);

always@(posedge clk) begin
if (d1 == d2)
equal <= 1;
else
equal <= 0;
end

always@(posedge clk) begin
if (s1 == 1) begin
int1.data1 <= d1;
end
else begin
int1.data2 <= d2;
end
end

always@(posedge clk) begin
int1.sel <= ^int1.result;
end

endmodule

module bottom2 (
my_int int1,
input clk);

always@(posedge clk) begin
if (int1.sel == 1)
int1.result <= int1.data1;
else
int1.result <= int1.data2;
end

endmodule


module top (
input clk,
input s1,
input [9:0] d1, d2,
output my_sel,
output equal);

logic [9:0] data1, data2, result;
logic sel;

my_int int3();

assign my_sel = int3.sel;

bottom1 u0 (int3, clk, d1, d2, s1, equal);
bottom2 u1 (int3, clk);



endmodule

使用modports進(jìn)行設(shè)計:

interface my_int;
logic sel;
logic [9:0] data1, data2, result;

modport b1 (input result, output sel, data1, data2);
modport b2 (input sel, data1, data2, output result);
endinterface : my_int

module bottom1 (
my_int.b1 int1,
input clk,
input [9:0] d1, d2,
input s1,
output logic equal);

always@(posedge clk) begin
if (d1 == d2)
equal <= 1;
else
equal <= 0;
end

always@(posedge clk) begin
if (s1 == 1) begin
int1.data1 <= d1;
end
else begin
int1.data2 <= d2;
end
end

always@(posedge clk) begin
int1.sel <= ^int1.result;
end

endmodule

module bottom2 (
my_int.b2 int1,
input clk);

always@(posedge clk) begin
if (int1.sel == 1)
int1.result <= int1.data1;
else
int1.result <= int1.data2;
end

endmodule


module top (
input clk,
input s1,
input [9:0] d1, d2,
output my_sel,
output equal);

logic [9:0] data1, data2, result;
logic sel;

my_int int3();

assign my_sel = int3.sel;

bottom1 u0 (int3, clk, d1, d2, s1, equal);
bottom2 u1 (int3, clk);



endmodule


原文標(biāo)題:設(shè)計技巧:在 Vivado Synthesis 中使用 SystemVerilog 接口連接邏輯

文章出處:【微信公眾號:賽靈思】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

    關(guān)注

    32

    文章

    1794

    瀏覽量

    131162
  • Vivado
    +關(guān)注

    關(guān)注

    19

    文章

    808

    瀏覽量

    66321
收藏 人收藏

    評論

    相關(guān)推薦

    何在多個外設(shè)中正確使用dma和spi?

    何在多個外設(shè)中正確使用 dma 和 spi
    發(fā)表于 05-29 07:21

    如何讓更高版本在IP目錄中正確顯示?

    2.0和2.1文件夾,兩者都列在vv_index.xml文件中。但是對2.0 / 2.1版本有任何限制嗎?如何讓更高版本在IP目錄中正確顯示?謝謝。以上來自于谷歌翻譯以下為原文I believe
    發(fā)表于 03-06 14:25

    何在約束文件中正確分配時鐘輸入?

    大家好,第一次在這里發(fā)布消息,我對如何在約束文件中正確分配時鐘輸入感到困惑。我正在嘗試實現(xiàn)一個代碼來切換我的LED,我想我可以使用約束文件中定義的默認(rèn)系統(tǒng)時鐘(200 MHz),我修改它如下
    發(fā)表于 08-07 06:11

    請問如何在Momentum中正確的添加接地過孔?

    何在Momentum中正確的添加接地過孔?
    發(fā)表于 06-24 07:53

    何在CubeMX的部分緩沖策略選項卡中正確選擇塊數(shù)和塊大小?

    的是修改現(xiàn)有項目,以便能夠在幀準(zhǔn)備好傳輸?shù)斤@示器時“交換”這些緩沖區(qū),以避免撕裂和緩慢填充顯示器。我的第二個問題是如何在 CubeMX 的部分緩沖策略選項卡中正確選擇塊數(shù)和塊大小?例如,就速度而言,4 個 10000 字節(jié)的塊等于 1 個 40000 字節(jié)的塊,我應(yīng)該什么
    發(fā)表于 12-09 08:55

    何在STM32CubeProgrammer中正確設(shè)置STLinkUpgrade.jar呢

    找到它的說明。我設(shè)法通過安裝單獨的 Java 運(yùn)行時環(huán)境并單獨運(yùn)行該實用程序來執(zhí)行更新,但想知道如何在 STM32CubeProgrammer 中正確設(shè)置它。
    發(fā)表于 12-22 06:40

    何在linux中正確卸載以前版本的CubeIDE呢?

    你好我只想知道如何在 linux 中正確卸載以前版本的 CubeIDE。我只是刪除文件夾嗎?
    發(fā)表于 01-17 06:03

    何在Arduino ESP8266和Android應(yīng)用程序中正確地實現(xiàn)WebSockets?

    出結(jié)論,使用 WebSockets 將是最好的方法。現(xiàn)在,我能問你,請給我一些材料/信息,如何開始。我只找到了 MIT App 的發(fā)明者( )我想學(xué)習(xí)正確地,這種通信是如何工作的,以及如何在 Arduino
    發(fā)表于 04-28 08:42

    Vivado環(huán)境下如何在IP Integrator中正確使用HLS IP

    testbench來驗證設(shè)計。 Integrate帶有Xilinx IP Block的 HLS IP 這里展示了在IP Integrator中,如何將兩個HLS IP blocks跟Xilinx IP FFT結(jié)合在一起 ,并且在Vivado中驗證設(shè)計。
    發(fā)表于 02-07 17:59 ?4390次閱讀
    <b class='flag-5'>Vivado</b>環(huán)境下如<b class='flag-5'>何在</b>IP Integrator<b class='flag-5'>中正確</b>使用HLS IP

    何在Vivado Design Suite 中進(jìn)行IP加密

    此視頻概述了Vivado Design Suite中的IP加密。 它涵蓋了IP加密工具流程,如何準(zhǔn)備加密IP以及如何在Vivado中運(yùn)行加密工具。
    的頭像 發(fā)表于 11-20 06:34 ?6458次閱讀

    何在Vivado Logic Analyzer中新儀表板,及使用的好處有哪些

    了解Vivado 2015.1中引入的新儀表板改進(jìn),如何在Vivado Logic Analyzer中使用它們以及使用它們的好處。
    的頭像 發(fā)表于 11-26 07:07 ?3002次閱讀

    何在Vivado中應(yīng)用物理優(yōu)化獲得更好的設(shè)計性能

    物理優(yōu)化是Vivado實現(xiàn)流程中更快時序收斂的重要組成部分。 了解如何在Vivado中應(yīng)用此功能以交換運(yùn)行時以獲得更好的設(shè)計性能。
    的頭像 發(fā)表于 11-23 06:06 ?4029次閱讀

    何在FPGA中正確處理浮點數(shù)運(yùn)算

    使用插值算法實現(xiàn)圖像縮放是數(shù)字圖像處理算法中經(jīng)常遇到的問題。我們經(jīng)常會將某種尺寸的圖像轉(zhuǎn)換為其他尺寸的圖像,如放大或者縮小圖像。由于在縮放的過程中會遇到浮點數(shù),如何在FPGA中正確的處理浮點數(shù)運(yùn)算是在FPGA中實現(xiàn)圖像縮放的關(guān)鍵。
    的頭像 發(fā)表于 03-18 11:03 ?4993次閱讀

    何在Vivado中添加時序約束呢?

    今天介紹一下,如何在Vivado中添加時序約束,Vivado添加約束的方法有3種:xdc文件、時序約束向?qū)В–onstraints Wizard)、時序約束編輯器(Edit Timing Constraints )
    的頭像 發(fā)表于 06-26 15:21 ?3921次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>Vivado</b>中添加時序約束呢?

    何在應(yīng)用中正確設(shè)置THVD1505和SN65HVD888

    電子發(fā)燒友網(wǎng)站提供《如何在應(yīng)用中正確設(shè)置THVD1505和SN65HVD888.pdf》資料免費(fèi)下載
    發(fā)表于 09-18 10:25 ?0次下載
    如<b class='flag-5'>何在</b>應(yīng)用<b class='flag-5'>中正確</b>設(shè)置THVD1505和SN65HVD888