一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

在Vivado Synthesis中怎么使用SystemVerilog接口連接邏輯呢?

FPGA之家 ? 來(lái)源:FPGA之家 ? 2024-03-04 15:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

01 什么是接口

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

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

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

此原始測(cè)試用例的原理圖如下所示:

原始測(cè)試用例

9bb8bbfa-d9bc-11ee-a297-92fbcf53809c.png

02 定義接口

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

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

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

03 使用接口

一旦聲明了接口,就可以象使用模塊的任何端口一樣使用此接口。在下級(jí)模塊中將使用接口替換端口,編碼樣式應(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);

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

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

其語(yǔ)法是“.”。 例如,在原始 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

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

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

my_int int3();

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

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

接下來(lái),下級(jí)模塊實(shí)例化。

bottom2 u1(int3,clk)

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

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

9bd5fe72-d9bc-11ee-a297-92fbcf53809c.png

04 添加 Modport

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

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

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

modport 的語(yǔ)法是:

modport ( , ....);

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

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

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

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

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

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

在此接口中,result 將是輸出

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

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

添加 modport 后的設(shè)計(jì)

9be50e4e-d9bc-11ee-a297-92fbcf53809c.png

05 結(jié)論

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

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

沒(méi)有接口的原始 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è)計(jì):

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è)計(jì):

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



審核編輯:劉清
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • RTL
    RTL
    +關(guān)注

    關(guān)注

    1

    文章

    389

    瀏覽量

    61143
  • 時(shí)鐘信號(hào)
    +關(guān)注

    關(guān)注

    4

    文章

    468

    瀏覽量

    29236
  • CLK
    CLK
    +關(guān)注

    關(guān)注

    0

    文章

    128

    瀏覽量

    17616
  • Vivado
    +關(guān)注

    關(guān)注

    19

    文章

    835

    瀏覽量

    68809

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

    設(shè)計(jì)技巧: Vivado Synthesis 中使用 SystemVerilog 接口連接
    的頭像 發(fā)表于 07-02 12:03 ?1.3w次閱讀
    技巧分享:如何在<b class='flag-5'>Vivado</b>中正確使用<b class='flag-5'>接口</b>

    做FPGA工程師需要掌握SystemVerilog嗎?

    某大型科技公司的招聘網(wǎng)站上看到招聘邏輯硬件工程師需要掌握SystemVerilog語(yǔ)言,感覺(jué)SystemVerilog語(yǔ)言是用于ASIC驗(yàn)證的,那么做FPGA工程師有沒(méi)有必要掌握
    發(fā)表于 08-02 20:30

    如何確保Vivado實(shí)現(xiàn)階段沒(méi)有優(yōu)化邏輯模塊資源?

    你好ISE的合成與實(shí)現(xiàn),最終資源利用分析報(bào)告正?!,F(xiàn)在在Vivado,實(shí)現(xiàn)邏輯優(yōu)化(opt_design)的第一步(實(shí)現(xiàn))投入了大量資
    發(fā)表于 10-24 15:23

    無(wú)法Vivado邏輯分析儀查看wavefrom

    大家好, 我無(wú)法Vivado邏輯分析儀查看wavefrom,下面你可以找到圖像附加的波形是如何準(zhǔn)確的...可以幫助我解決這個(gè)問(wèn)題。謝謝Naveen S.
    發(fā)表于 03-20 09:26

    使用SystemVerilog來(lái)簡(jiǎn)化FPGA接口連接方式

    電路結(jié)構(gòu),我將flatten_hierarchy選為了none)    下面我們把程序稍作改動(dòng),將a/b/c三個(gè)接口使用SystemVerilog的interface來(lái)連接?! ??
    發(fā)表于 01-08 17:23

    Vivado Synthesis如何為Verilog代碼的“include file”設(shè)置路徑?

    rapidio參考設(shè)計(jì)摘出的一段代碼,示例了這種用法: 那么Vivado GUI,該如何設(shè)置,可以使得代碼可以準(zhǔn)確找到這個(gè)include的文件
    發(fā)表于 11-10 14:49 ?1w次閱讀

    Getting Started with Vivado High-Level Synthesis

    Xilinx公司講述:Getting Started with Vivado High-Level Synthesis
    的頭像 發(fā)表于 06-04 13:47 ?4029次閱讀
    Getting Started with <b class='flag-5'>Vivado</b> High-Level <b class='flag-5'>Synthesis</b>

    如何使用Vivado Logic Analyzer與邏輯調(diào)試IP進(jìn)行交互

    了解Vivado的Logic Debug功能,如何將邏輯調(diào)試IP添加到設(shè)計(jì),以及如何使用Vivado Logic Analyzer與
    的頭像 發(fā)表于 11-30 06:22 ?3666次閱讀

    接口Vivado Synthesis中使用時(shí)連接邏輯的用處

    SystemVerilog 接口的開(kāi)發(fā)旨在讓設(shè)計(jì)中層級(jí)之間的連接變得更加輕松容易。 您可以把這類接口看作是多個(gè)模塊共有的引腳集合。與必須在每個(gè)模塊上定義多個(gè)引腳不同的是,您只需
    發(fā)表于 03-30 09:36 ?2434次閱讀
    <b class='flag-5'>接口</b><b class='flag-5'>在</b><b class='flag-5'>Vivado</b> <b class='flag-5'>Synthesis</b>中使用時(shí)<b class='flag-5'>連接</b><b class='flag-5'>邏輯</b>的用處

    Vivado Synthesis的各種流程

    Vivado IPI (IP Integrator)提供了直觀的模塊化的設(shè)計(jì)方法。用戶可以將Vivado IP Catalog的IP、用戶自己的RTL代碼、或者用戶已有的BD文件添加到IP Integrator
    的頭像 發(fā)表于 07-15 11:39 ?2288次閱讀

    Vivado Synthesis模塊化的設(shè)計(jì)方法

    全局綜合(Global Synthesis)全局綜合意味著整個(gè)設(shè)計(jì)一個(gè)Synthesis Design Run流程完成,這樣會(huì)帶來(lái)幾個(gè)好處。
    的頭像 發(fā)表于 07-15 11:39 ?2682次閱讀

    Vivado的Elaborate是做什么的?

    Vivado的界面,有個(gè)RTL ANALYSIS->Open Elaborated Design的選項(xiàng),可能很多工程師都沒(méi)有使用過(guò)。因?yàn)榇蠹一径际菑腞un Synthesis開(kāi)始
    的頭像 發(fā)表于 10-24 10:05 ?1839次閱讀

    簡(jiǎn)述Vivado的Elaborate的作用

    Vivado的界面,有個(gè)RTL ANALYSIS->Open Elaborated Design的選項(xiàng),可能很多工程師都沒(méi)有使用過(guò)。因?yàn)榇蠹一径际菑腞un Synthesis開(kāi)始
    的頭像 發(fā)表于 05-05 16:00 ?1660次閱讀
    簡(jiǎn)述<b class='flag-5'>Vivado</b><b class='flag-5'>中</b>的Elaborate的作用

    Artix 7 FPGA上使用Vivado的組合邏輯與順序邏輯

    電子發(fā)燒友網(wǎng)站提供《Artix 7 FPGA上使用Vivado的組合邏輯與順序邏輯.zip》資料免費(fèi)下載
    發(fā)表于 06-15 09:14 ?0次下載
    <b class='flag-5'>在</b>Artix 7 FPGA上使用<b class='flag-5'>Vivado</b>的組合<b class='flag-5'>邏輯</b>與順序<b class='flag-5'>邏輯</b>

    Vivado 2024.1版本的新特性(2)

    從綜合角度看,Vivado 2024.1對(duì)SystemVerilog和VHDL-2019的一些特性開(kāi)始支持。先看SystemVerilog
    的頭像 發(fā)表于 09-18 10:34 ?1905次閱讀
    <b class='flag-5'>Vivado</b> 2024.1版本的新特性(2)