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

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

3天内不再提示

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

Xilinx赛灵思官微 2019-07-02 12:03 次阅读

点击上方“蓝字”,轻松关注我们

01

什么是接口

SystemVerilog 接口的开发旨在让设计中层级之间的连接变得更加轻松容易。 您可以把这类接口看作是多个模块共有的引脚集合。与必须在每个模块上定义多个引脚不同的是,您只需在接口中对引脚定义一次,之后只需在模块上定义接口即可。 如果稍后接口中涉及的信号被更改,则仅需更改接口即可。

这样就可以将大量信息压缩到较少代码行,但第一次写接口可能会有点困难。在第一次看别人写的接口时,也可能会很难进行解读。 本文将介绍接口的基础知识以及如何在 Vivado 中正确使用接口。

我们将把一个没有接口的小型测试用例转换为使用接口的测试用例。 这个测试用例的示例 RTL 代码将在本文的最后一节中介绍。

此原始测试用例的原理图如下所示:

原始测试用例

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

使用接口

一旦声明了接口,就可以象使用模块的任何端口一样使用此接口。在下级模块中将使用接口替换端口,编码样式应更改如下:

原始版本:

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”根据“sel”输入被分配为“data1”或“data2”。

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

现在,需要将其更改为以下内容:

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

在下级模块中将引脚更改为接口之后,对这些引脚的引用已被更改为引用接口,还需要修改将这些模块实例化的上级模块。

在使用接口之前,顶层的模块引脚将连接到设计中声明的信号。所以现在我们要连接接口,而不是要连接信号。首先需要做的事是声明一个相同类型的接口。

my_int int3();

上面的代码声明了一个类型为“my_int”的接口,并为其指定了一个实例名称“int3”。

和前面一样,对此接口内的信号的所有引用都需要使用“.”语法来完成。

接下来,下级模块实例化。

bottom2 u1(int3,clk)

上面的 RTL 会对“bottom2”模块进行实例化,给它指定一个实例名称“u1”。 在“bottom2”模块中声明的接口“int1”现在与已在上一层声明的接口“int3”相关联。 进行这些更改后,设计的原理图如下所示:

转换为接口后的设计

04

添加 Modport

添加接口后,该工具已创建正确的连接,但您可能会注意到原理图看起来有点奇怪。 来自两个下级层次的“data1”和“data2”似乎正在驱动同一个网络。如果您进入这些下级模块,您会看到没有多驱动问题,因为其中一个模块将“data1”和“data2”视为输入。

原理图看起来奇怪的原因是创建的接口没有告诉工具哪些引脚在充当输入,哪些引脚在充当输出。 当工具创建连接时,并明确知道如何连接引脚,因此它先建立了连接,然后在分析行为时才找出了引脚的方向。

虽然这样可行,但还是强烈建议将接口的输入/输出信息提供给工具。这是通过使用 modport 来完成的。Modport 在接口内部进行声明,告诉工具哪些信号是输入,哪些是输出。由于不同的模块的引脚的方向各不相同,因此通常每个接口会声明多个 modport。

modport 的语法是:

modport ( , ....);

例如,以下 RTL 创建了一个名为“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 后的设计

05

结论

编写本文是为了说明接口在连接具有相似信号的逻辑时的用处,但这不是接口的唯一用途。 此外,接口可以使用包括任务和功能在内的许多特性,甚至可以进行参数化。

我们将在以后的文章中探讨其他功能。

没有接口的原始 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

第一次添加接口的设计:

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进行设计:

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


原文标题:设计技巧:在 Vivado Synthesis 中使用 SystemVerilog 接口连接逻辑

文章出处:【微信公众号:赛灵思】欢迎添加关注!文章转载请注明出处。

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

    关注

    32

    文章

    1794

    浏览量

    130536
  • Vivado
    +关注

    关注

    18

    文章

    790

    浏览量

    65105
收藏 人收藏

    评论

    相关推荐

    在CAM350 中正确如何读入Gerber文件

    `在CAM350 中正确如何读入Gerber文件`
    发表于 08-20 14:07

    如何让更高版本在IP目录中正确显示?

    2.0和2.1文件夹,两者都列在vv_index.xml文件中。但是对2.0 / 2.1版本有任何限制吗?如何让更高版本在IP目录中正确显示?谢谢。以上来自于谷歌翻译以下为原文I believe
    发表于 03-06 14:25

    何在约束文件中正确分配时钟输入?

    大家好,第一次在这里发布消息,我对如何在约束文件中正确分配时钟输入感到困惑。我正在尝试实现一个代码来切换我的LED,我想我可以使用约束文件中定义的默认系统时钟(200 MHz),我修改它如下
    发表于 08-07 06:11

    何在vivado开发教程?

    本文介绍如何在 vivado 开发教程,创建新工程 的基础上, 使用IP集成器, 创建块设计。
    发表于 02-23 07:02

    请问如何在Momentum中正确的添加接地过孔?

    何在Momentum中正确的添加接地过孔?
    发表于 06-24 07:53

    何在CubeMX的部分缓冲策略选项卡中正确选择块数和块大小?

    的是修改现有项目,以便能够在帧准备好传输到显示器时“交换”这些缓冲区,以避免撕裂和缓慢填充显示器。我的第二个问题是如何在 CubeMX 的部分缓冲策略选项卡中正确选择块数和块大小?例如,就速度而言,4 个 10000 字节的块等于 1 个 40000 字节的块,我应该什么
    发表于 12-09 08:55

    何在STM32CubeProgrammer中正确设置STLinkUpgrade.jar呢

    找到它的说明。我设法通过安装单独的 Java 运行时环境并单独运行该实用程序来执行更新,但想知道如何在 STM32CubeProgrammer 中正确设置它。
    发表于 12-22 06:40

    何在linux中正确卸载以前版本的CubeIDE呢?

    你好我只想知道如何在 linux 中正确卸载以前版本的 CubeIDE。我只是删除文件夹吗?
    发表于 01-17 06:03

    何在Arduino ESP8266和Android应用程序中正确地实现WebSockets?

    出结论,使用 WebSockets 将是最好的方法。现在,我能问你,请给我一些材料/信息,如何开始。我只找到了 MIT App 的发明者( )我想学习正确地,这种通信是如何工作的,以及如何在 Arduino
    发表于 04-28 08:42

    Vivado环境下如何在IP Integrator中正确使用HLS IP

    testbench来验证设计。 Integrate带有Xilinx IP Block的 HLS IP 这里展示了在IP Integrator中,如何将两个HLS IP blocks跟Xilinx IP FFT结合在一起 ,并且在Vivado中验证设计。
    发表于 02-07 17:59 4220次阅读
    <b class='flag-5'>Vivado</b>环境下如<b class='flag-5'>何在</b>IP Integrator<b class='flag-5'>中正确</b>使用HLS IP

    何在Vivado Design Suite 中进行IP加密

    此视频概述了Vivado Design Suite中的IP加密。 它涵盖了IP加密工具流程,如何准备加密IP以及如何在Vivado中运行加密工具。
    的头像 发表于 11-20 06:34 6031次阅读

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

    了解Vivado 2015.1中引入的新仪表板改进,如何在Vivado Logic Analyzer中使用它们以及使用它们的好处。
    的头像 发表于 11-26 07:07 2818次阅读

    何在Vivado中应用物理优化获得更好的设计性能

    物理优化是Vivado实现流程中更快时序收敛的重要组成部分。 了解如何在Vivado中应用此功能以交换运行时以获得更好的设计性能。
    的头像 发表于 11-23 06:06 3768次阅读

    何在FPGA中正确处理浮点数运算

    使用插值算法实现图像缩放是数字图像处理算法中经常遇到的问题。我们经常会将某种尺寸的图像转换为其他尺寸的图像,如放大或者缩小图像。由于在缩放的过程中会遇到浮点数,如何在FPGA中正确的处理浮点数运算是在FPGA中实现图像缩放的关键。
    的头像 发表于 03-18 11:03 4217次阅读

    何在Vivado中添加时序约束呢?

    今天介绍一下,如何在Vivado中添加时序约束,Vivado添加约束的方法有3种:xdc文件、时序约束向导(Constraints Wizard)、时序约束编辑器(Edit Timing Constraints )
    的头像 发表于 06-26 15:21 2248次阅读
    如<b class='flag-5'>何在</b><b class='flag-5'>Vivado</b>中添加时序约束呢?