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

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

3天内不再提示

在Vivado Synthesis中怎么使用SystemVerilog接口连接逻辑呢?

FPGA之家 来源:FPGA之家 2024-03-04 15:25 次阅读
01 什么是接口

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

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

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

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

原始测试用例

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

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”相关联。 进行这些更改后,设计的原理图如下所示:

转换为接口后的设计

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

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 后的设计

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

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



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

    关注

    1

    文章

    385

    浏览量

    59764
  • 时钟信号
    +关注

    关注

    4

    文章

    448

    浏览量

    28542
  • CLK
    CLK
    +关注

    关注

    0

    文章

    127

    浏览量

    17158
  • Vivado
    +关注

    关注

    19

    文章

    812

    浏览量

    66478

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

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

    设计技巧: Vivado Synthesis 中使用 SystemVerilog 接口连接
    的头像 发表于 07-02 12:03 1.2w次阅读
    技巧分享:如何在<b class='flag-5'>Vivado</b>中正确使用<b class='flag-5'>接口</b>

    做FPGA工程师需要掌握SystemVerilog吗?

    某大型科技公司的招聘网站上看到招聘逻辑硬件工程师需要掌握SystemVerilog语言,感觉SystemVerilog语言是用于ASIC验证的,那么做FPGA工程师有没有必要掌握
    发表于 08-02 20:30

    如何确保Vivado实现阶段没有优化逻辑模块资源?

    你好ISE的合成与实现,最终资源利用分析报告正常。现在在Vivado实现逻辑优化(opt_design)的第一步(实现)投入了大量资
    发表于 10-24 15:23

    无法Vivado逻辑分析仪查看wavefrom

    大家好, 我无法Vivado逻辑分析仪查看wavefrom,下面你可以找到图像附加的波形是如何准确的...可以帮助我解决这个问题。谢谢Naveen S.
    发表于 03-20 09:26

    使用SystemVerilog来简化FPGA接口连接方式

    电路结构,我将flatten_hierarchy选为了none)    下面我们把程序稍作改动,将a/b/c三个接口使用SystemVerilog的interface来连接。    
    发表于 01-08 17:23

    Vivado Synthesis如何为Verilog代码的“include file”设置路径?

    rapidio参考设计摘出的一段代码,示例了这种用法: 那么Vivado GUI,该如何设置,可以使得代码可以准确找到这个include的文件
    发表于 11-10 14:49 9731次阅读

    Getting Started with Vivado High-Level Synthesis

    Xilinx公司讲述:Getting Started with Vivado High-Level Synthesis
    的头像 发表于 06-04 13:47 3731次阅读
    Getting Started with <b class='flag-5'>Vivado</b> High-Level <b class='flag-5'>Synthesis</b>

    如何使用Vivado Logic Analyzer与逻辑调试IP进行交互

    了解Vivado的Logic Debug功能,如何将逻辑调试IP添加到设计,以及如何使用Vivado Logic Analyzer与
    的头像 发表于 11-30 06:22 3392次阅读

    接口Vivado Synthesis中使用时连接逻辑的用处

    SystemVerilog 接口的开发旨在让设计中层级之间的连接变得更加轻松容易。 您可以把这类接口看作是多个模块共有的引脚集合。与必须在每个模块上定义多个引脚不同的是,您只需
    发表于 03-30 09:36 2200次阅读
    <b class='flag-5'>接口</b><b class='flag-5'>在</b><b class='flag-5'>Vivado</b> <b class='flag-5'>Synthesis</b>中使用时<b class='flag-5'>连接</b><b class='flag-5'>逻辑</b>的用处

    Vivado Synthesis的各种流程

    Vivado IPI (IP Integrator)提供了直观的模块化的设计方法。用户可以将Vivado IP Catalog的IP、用户自己的RTL代码、或者用户已有的BD文件添加到IP Integrator
    的头像 发表于 07-15 11:39 1910次阅读

    Vivado Synthesis模块化的设计方法

    全局综合(Global Synthesis)全局综合意味着整个设计一个Synthesis Design Run流程完成,这样会带来几个好处。
    的头像 发表于 07-15 11:39 2113次阅读

    Vivado的Elaborate是做什么的?

    Vivado的界面,有个RTL ANALYSIS->Open Elaborated Design的选项,可能很多工程师都没有使用过。因为大家基本都是从Run Synthesis开始
    的头像 发表于 10-24 10:05 1484次阅读

    简述Vivado的Elaborate的作用

    Vivado的界面,有个RTL ANALYSIS->Open Elaborated Design的选项,可能很多工程师都没有使用过。因为大家基本都是从Run Synthesis开始
    的头像 发表于 05-05 16:00 1270次阅读
    简述<b class='flag-5'>Vivado</b><b class='flag-5'>中</b>的Elaborate的作用

    Artix 7 FPGA上使用Vivado的组合逻辑与顺序逻辑

    电子发烧友网站提供《Artix 7 FPGA上使用Vivado的组合逻辑与顺序逻辑.zip》资料免费下载
    发表于 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对SystemVerilog和VHDL-2019的一些特性开始支持。先看SystemVerilog
    的头像 发表于 09-18 10:34 856次阅读
    <b class='flag-5'>Vivado</b> 2024.1版本的新特性(2)